2013-08-28 141 views
1

我對C非常新穎,如果有人能幫助理解爲什麼第13,14和16行中的代碼不起作用,而第17-20行起作用,請多加諒解。初始化結構數組,爲什麼使用結構變量不起作用

隨着第一個選項(第13行,14和16),我得到的錯誤

error: initializer element is not constant 

這是什麼意思?此外,這是否意味着不能使用某些類型的變量來生成新變量?

謝謝。

// Define structure for a good 
    5 struct good { 
    6  char goodname; 
    7  double p; //starting proportion 
    8  int theta; //average utility 
    9  int sigma; //variance of error 
10 }; 
11 
12 // The goods H and L 
13 struct good H = {.goodname = 'H', .p = 0.5, .theta = 100, .sigma = 20}; 
14 struct good L = {.goodname = 'L', .p = 0.5, .theta = 75, .sigma = 20}; 
15 
16 struct good goods[2] = {H, L}; // **Does not work** 

// ** Works** 
17 struct good goods[2] = { 
18  {.goodname = 'H', .p = 0.5, .theta = 100, .sigma = 20}, 
19  {.goodname = 'L', .p = 0.5, .theta = 75, .sigma = 20} 
20 }; 

回答

1

H和L是包含數據的存儲位置。語句:

struct good goods[2] = {H, L}; // **Does not work** 

意味着產品應指向H和L,或含有作爲H和L.

要麼,複製從H到產品中的數據和L相同的值[0]和[ 1]或修改產品是一個指針數組,作爲:

struct good *goods[2]; 

goods[0] = &H; 
goods[1] = &L; 
2

這意味着在C中,您只能使用常量表達式來初始化靜態存儲持續時間的數組或結構。

在您的示例中的所有對象具有靜態存儲時間,但:

struct good H = {.goodname = 'H', .p = 0.5, .theta = 100, .sigma = 20}; 

上面的初始化是文字和文字在C常量表達式,因此它是確定。

struct good goods[2] = {H, L}; 

但這裏HL對象不是常量表達式,因此編譯器給你一個錯誤。

C對常量表達式的定義非常嚴格,並且對象的值不被視爲常量表達式(即使對象是const限定或用文字初始化)。

3

原因線16不工作是一樣的,爲什麼這個非常簡單的例子是行不通的:

const int a = 5; 
int b = a; // Does not work: "initializer element is not constant" 

這意味着你需要在初始化只使用編譯時間常量表達式。 C不考慮變量編譯時常量,即使是const(C++,另一方面,也考慮const變量編譯時常量)。

2

變量的值,即使該變量已全局初始化(即使它是const限定的)也不是一個常量表達式。

指向一個靜態持續時間可變是「擴展常量表達式」,並且可以被用於初始化指針變量,因此你可以做:

struct good *goods[2] = {&H, &L}; 

,例如,如果適合的問題。


是的,我知道。 「全球初始化」 是不是真的明確界定。 :-)我的意思是,如果它是一個已經初始化的靜態持續時間變量,並且在新的初始化程序中可見。

即,任何 「全局」(文件範圍)變量,或塊內的static變量。

2

如果對象是靜態的「產品[0] /貨物[1]」,可以只與常數初始化。所以,你沒有得到初始化「好H」的錯誤的原因。

如果將變量定義爲非靜態(對於e..g,在main()或任何函數()中),您將不會收到此錯誤,因爲該對象將被視爲「汽車」。