2013-04-23 51 views
1

目前我正在努力如何將typedef結構傳遞給函數?

void avg(everything) 

但是,這給我的錯誤:

error: subscripted value is neither array nor pointer 

當我今天早些時候得到這個錯誤是因爲我沒有傳遞一個二維數組功能正常。所以我想這是相同的,但我找不到它傳遞正確的格式

這是我的typedef:

typedef struct structure 
{ 
char names[13][9]; 
int scores[13][4]; 
float average[13]; 
char letter[13]; 
} stuff; 

,這是我的typedef數組:

stuff everything[13]; 
+0

所以...什麼是「一切」? – gukoff 2013-04-23 02:11:43

+0

'void avg(stuff * p);'似乎符合法案。 – WhozCraig 2013-04-23 02:11:54

+0

函數需要定義爲'void avg(stuff * s){}' - 但是這個調用需要'avg(everything);' – user93353 2013-04-23 02:12:32

回答

3

在函數簽名,你需要指定類型,而不是一個變量的具體名稱如果你想傳遞一個數組,你需要傳遞一個指針(無論如何你應該通過指針傳遞結構,否則每次調用函數時都會產生一個數據副本)。因此,你的功能應該看起來像:

void avg(stuff* s); 

但是,C數組也沒有長度的概念。因此,你應該總是在數組的長度傳遞給函數:

void avg(stuff* s, size_t len); 

你會再調用這個如下:

avg(everything, 13); 

而且,如果功能不修改數據以任何方式,你應該通過指定的參數是const表示這樣的:

void avg(const stuff* s, size_t len); 
+0

「C數組也沒有長度的概念」 - 不正確。您可能指的是指向數組第一個元素的指針並不指示數組的長度。另一方面,給定'int arr [42];','arr'的長度是42。 – 2013-04-23 05:52:19

1

typedef一起引入的類型是可用於實際類型的別名。

例如:

typedef struct some_struct { ... } some_type_name; 

現在你可以使用some_type_namestruct some_struct代替

所以聲明一個函數,它接受這個「類型」的結構,當你使用像任何其他類型的類型:

void some_function(some_type_name var) { ... } 

some_function如上文所定義,可以使用var像一個正常的結構變量。

要定義一個函數獲取陣列(或指針)這種類型,這是同樣簡單:

void some_function(some_type_name *pointer) { ... }