Tôi đang viết một chương trình phải chuẩn hóa âm thanh *.wav
tài liệu. Có một nhiệm vụ "hiển thị dữ liệu tiêu đề":ChunkId
,Kích thước đoạn
等等。
Tôi muốn tạo một tập tin có tênhiển thị_hdr
(để rút gọn code trong file main.c để đọc code này sẽ dễ dàng hơn). Để làm điều này, tôi phải chuyển biến tiêu đề (một biến kiểu header ) làm tham số cho hàm này, nhưng nó được viết là
Hàm.h|1|lỗi: tên loại không xác định 'tiêu đề'|
chính.c:
cấu trúc typedef FMT
{
char SubChunk1ID[4];
int SubChunk1Size;
int ngắn AudioFormat;
int ngắn NumChannels;
int SampleRate;
int ByteRate;
int ngắn BlockAlign;
int ngắn BitsPerSample;
} fmt;
cấu trúc typedef DỮ LIỆU
{
char Subchunk2ID[4];
int Subchunk2Size;
Dữ liệu int[];
} dữ liệu;
TIÊU ĐỀ cấu trúc typedef
{
char ChunkID[4];
int ChunkSize;
Định dạng char[4];
fmt S1;
dữ liệu S2;
} tiêu đề;
Biến Header được khai báo như sau:
tiêu đề hdr;
现在,Khi tôi cố gắng đặt hdr
Khi được chuyển đến chức năng của tôi, nó in ra mộtsai lầm
:
Hàm.h|1|lỗi: tên loại không xác định 'tiêu đề'|
hàm.h
void display_hdr(tiêu đề hdr)
{
printf("\n************************************\n");
printf("Siêu dữ liệu của tập tin WAVE:\n\n");
printf("%4.4s\n", hdr.ChunkID );
printf("%d\n", hdr.ChunkSize );
printf("%4.4s\n", hdr.Format );
printf("%4.4s\n", hdr.S1.SubChunk1ID );
printf("%d\n", hdr.S1.SubChunk1Size );
printf("%d\n", hdr.S1.AudioFormat );
printf("%d\n", hdr.S1.NumChannels );
printf("%d\n", hdr.S1.SampleRate );
printf("%d\n", hdr.S1.ByteRate );
printf("%d\n", hdr.S1.BlockAlign );
printf("%d\n", hdr.S1.BitsPerSample );
printf("%4.4s\n", hdr.S2.Subchunk2ID );
printf("%d\n", hdr.S2.Subchunk2Size ); /// KÍCH THƯỚC MẪU
printf("\n************************************\n");
return;
}
Vì vậy, làm cách nào để bạn chuyển một biến thuộc loại (không chuẩn) của riêng bạn làm tham số cho hàm?
"Phạm vi của các biến toàn cục có thể bị hạn chế bằng cách sắp xếp các khai báo cẩn thận. Chúng hiển thị từ phần khai báo đến cuối tệp nguồn hiện tại."
Hiện tại không có vấn đề gì với chủ đề này (không có cảnh báo hoặc lỗi). Tôi vừa chuyển định nghĩa của struct (loại) từ main.c sang function.c (nơi nó được khai báo hdr
loại biến tiêu đề
).
hàm.h
cấu trúc typedef FMT
{
char SubChunk1ID[4];
int SubChunk1Size;
int ngắn AudioFormat;
int ngắn NumChannels;
int SampleRate;
int ByteRate;
int ngắn BlockAlign;
int ngắn BitsPerSample;
} fmt;
cấu trúc typedef DỮ LIỆU
{
char Subchunk2ID[4];
int Subchunk2Size;
Dữ liệu int[];
} dữ liệu;
TIÊU ĐỀ cấu trúc typedef
{
char ChunkID[4];
int ChunkSize;
Định dạng char[4];
fmt S1;
dữ liệu S2;
} tiêu đề; /* Đã tạo một loại `tiêu đề` */
header hdr; /* Sau khi loại `header` được tạo.
void display_hdr(tiêu đề hdr)
{
printf("\n************************************\n");
printf("Siêu dữ liệu của tập tin WAVE:\n\n");
printf("%4.4s\n", hdr.ChunkID );
printf("%d\n", hdr.ChunkSize );
printf("%4.4s\n", hdr.Format );
printf("%4.4s\n", hdr.S1.SubChunk1ID );
printf("%d\n", hdr.S1.SubChunk1Size );
printf("%d\n", hdr.S1.AudioFormat );
printf("%d\n", hdr.S1.NumChannels );
printf("%d\n", hdr.S1.SampleRate );
printf("%d\n", hdr.S1.ByteRate );
printf("%d\n", hdr.S1.BlockAlign );
printf("%d\n", hdr.S1.BitsPerSample );
printf("%4.4s\n", hdr.S2.Subchunk2ID );
printf("%d\n", hdr.S2.Subchunk2Size ); /// KÍCH THƯỚC MẪU
printf("\n************************************\n");
return;
}
tái bút
Tất nhiên tôi có thể truyền con trỏ tới một hàm, nhưng tôi muốn truyền biến. Không cần phải làm điều này vì nghĩ nó tốt hơn (tiết kiệm bộ nhớ).
Câu hỏi này là dohiểu lầm (hiểu kém/hiểu kém)'phạm vi' Đúng.
PSS
Có lẽ,Andrew W Điều đó đúng ở một khía cạnh nào đó, nhưng nó không giải quyết được vấn đề trước mắt. Đó là một loại vấn đề khác. Nhưng nó cũng đáng đọc!
Tôi là một lập trình viên xuất sắc, rất giỏi!