2009-08-24 48 views
3

爲了幫助我的單人尋求用D問題(= p)填充SO,我遇到了另一個問題;初始化全局結構數組。注意:如何初始化D中的全局結構數組?

struct A 
{ 
    int a; 
    float b; 
} 

A[2] as; 
as[0] = {0, 0.0f}; 
as[1] = {5, 5.2f}; 

void main() {} 

結果:

$ dmd wtf.d 
wtf.d(8): no identifier for declarator as[0] 
wtf.d(9): no identifier for declarator as[1] 

翻翻在Digital Mars的文檔,我實在看不出什麼完全顯而易見的我,所以我再回頭想堆棧溢出的勇敢嬌客!我猜錯誤信息與真正的問題沒有太大關係,因爲[0] 的一個標識符(但是dmd認爲它是一個聲明者,AFAICT查看docs,它不是) ?

回答

6

我不認爲你可以像這樣每個元素初始化元素。這會工作嗎?

A[2] as = [ 
    {0, 0.0f}, 
    {5, 5.2f} 
]; 

考慮一下,如果在你的榜樣,你提到不止一次as[0]更會發生什麼:

as[0] = {0, 0.0f}; 
as[0] = {1, 1.0f}; 

會的as[0]值是在什麼程序初始化?這變得更像陳述而不是初始者

注意,在d,您可以初始化在具體指標這樣的數組元素:

A[2] as = [ 
    0: {0, 0.0f}, 
    1: {5, 5.2f} 
]; 

如果你有一個更大的陣列(如A[10]),只需要初始化一些這將是有益的元素。有關更多信息,請參閱D參考文檔中的​​。

+1

D'oh。我試過這個,但忘記了我在使用D並且做了C風格的{{},{}}語法。謝謝。 – Bernard 2009-08-24 21:58:28

+0

+1,D期望在模塊的頂層聲明,而不是聲明。對於無法在編譯時計算的初始值,您也可以使用模塊初始化程序。 – shambulator 2010-08-16 12:13:54

3

此,如果你想要一個接一個初始化

struct A 
{ 
    int a; 
    float b; 
} 

A[2] as; 
as[0] = A(0, 0.0f); 
as[1] = A(5, 5.2f); 

void main() {} 

每個結構得到一個默認的構造函數以每個參數的個數,從而,如果你不明確定義構造函數做也將工作(即靜態opCall)。請參閱StructLiteral

但不利的一面是,這可能會首先將數組初始化爲默認值,然後逐個更改值。所以如果你事先知道所有的值,那麼使用實際的初始化語法可能會更有效率。

+0

void initialisers(A [2] as = void;)確保內存不被初始化。所以這很棒。謝謝。 – Bernard 2009-08-25 06:40:51