2010-06-15 145 views
5

我有一個簡單的函數Bar,它使用一組數據集中的一組值,這些值是以數據結構數組的形式傳入的。數據可以來自兩個來源:一個常量初始化的默認值數組或一個動態更新的緩存。如何將常量數組或變量數組傳遞給C中的函數?

調用函數決定哪些數據被使用,應該傳遞給BarBar不需要編輯任何數據,實際上不應該這樣做。我應該如何聲明Bar的數據參數,以便我可以提供兩組數據?

union Foo 
{ 
long _long; 
int _int; 
} 

static const Foo DEFAULTS[8] = {1,10,100,1000,10000,100000,1000000,10000000}; 
static Foo Cache[8] = {0}; 

void Bar(Foo* dataSet, int len);//example function prototype 

請注意,這是C,而不是C++,如果這有所作爲;

編輯
哦,還有一件事。當我使用示例原型時,我得到了一個類型限定符不匹配的警告,(因爲我傳遞一個可變引用到一個const數組?)。我需要改變什麼?

+0

+1,只是因爲我很高興仍然有些人不會標記他們的問題'C/C++'並在兩者之間做出區別:D – ereOn 2010-06-15 15:20:48

回答

8

你想:

void Bar(const Foo *dataSet, int len); 

參數聲明const Foo *x表示:

x是一個指向Foo我 承諾不會改變。

您將能夠通過此原型將非常量指針傳入Bar

+0

我認爲宣佈了一個Foo「無法更改的指針」,而不是指向「無法更改的Foo」的指針。 – CodeFusionMobile 2010-06-15 15:23:39

+5

否 - 'const Foo * x'表示:'* x'是'const Foo'。要將該參數聲明爲無法更改的指針(這種方法遠沒有用),您必須編寫'Foo * const x' :) – psmears 2010-06-15 15:26:15

+0

感謝您的澄清。正如你所看到的,我寫'Foo *'而不是'* x',因爲我認爲x是'Foo *',而不是'* x'作爲指向'Foo'的指針。它使跟蹤變量更容易,但使像'const'的指針相當混亂。 – CodeFusionMobile 2010-06-15 15:34:29

0

當你做了 - 該函數採用指針數據(常量,如果它不需要更改)

然後要麼通過指針,如果你分配使用malloc的數據,或者第一要素如果這是一個靜態數組。

+0

當我這樣做時,我得到了類型限定符不匹配警告因爲我傳遞了一個可變引用到一個常量數組。我如何獲得這個週末? – CodeFusionMobile 2010-06-15 15:19:55

+0

@CSharperWithJava:你得到那個錯誤是因爲你現在在'Bar'的聲明中缺少'const' ... – psmears 2010-06-15 15:21:24

+0

正如其他人所回答的那樣 - 如果你傳遞一個常量值,你需要使指針arg爲const(除非你有一個特別寬容的編譯器!) – 2010-06-15 15:21:55