2011-11-16 23 views
3

我有一個像這樣定義的簡單結構:靜態初始化結構自我參照

typedef struct { 
    int index; 
    double* arrayToRead; 
} my_struct; 

我希望,使他們成爲這樣的初始化結構的數組:

double decimals[2] = {1.0, 2.0}; 

my_struct[2] = { 
    {0, &decimals[0]}, 
    {1, &decimals[1]} 
}; 

我必須靜態初始化這個結構數組。

我可以靜態初始化它,而參考先前定義的成員,就像這樣:

my_struct[2] = { 
    {0, &decimals[index]}, 
    {1, &decimals[index]} 
}; 

當「指數」指的是定義爲「小數」左邊索引值?

回答

5

*

如果你絕望,你總是可以設計用於此目的的宏:

#define DEFINE_ELEMENT(i) {(i), &decimals[(i)]} 
my_struct m[2] = { 
    DEFINE_ELEMENT(0), 
    DEFINE_ELEMENT(1) 
}; 
#undef DEFINE_ELEMENT 


*或 「是」,因爲@Jens指出在他的答案中,C99。

+0

接近,但answwer是肯定的,看到我的答案:) –

+0

@Jens:我沒有想到的是(使+1爲你有趣的答案)。從技術上講,它仍然是「不」,因爲它不是OP的語法...... –

+0

好點。我走了那條路。謝謝! – DevNull

-1

那是什麼在天空中? 這是一隻鳥!不,這是一架飛機!不,它是代碼生成的人!

enter image description here

或者 - 用舌頭臉頰刪除 - 我不知道有在功能支持此功能的內置,但你總是可以使用外部工具來編寫初始化代碼爲你。


基本上你寫一些方便的語言腳本中定義的結構,並宣佈與長手intialization的變量,輸出交流的代碼片段,然後用C-預處理器的#include功能來生成文件到您的阻力碼。

你會想讓構建管理器意識到這個需求。在使它看起來像

cfile.o: cfile.c mystruct.c 

my_struct.c: 
     awk -f generate_my_struct.awk > my_struct.c 
+3

有一個snark的地方,這不是它。 snark高度分散您答案的有用內容(「不,使用代碼生成」)。 –

+0

呃... @亞當,這是一個真正的建議。當然,不是任何人的首選,而是完全有效的解決方案。也許我的幽默今天沒有校準。 – dmckee

+0

我同意這是一個完全有效的解決方案,我不同意你介紹它的方式。 –

7

如果你有一個現代化的C編譯器(又名C99),你可以進行代碼展開使用P99。喜歡的東西

#define INIT_ELEMENT(NAME, X, I) [I] = { \ 
    .index = I,       \ 
    .arraytoread = &decimals[I]   \ 
} 
#define INIT_ELEMENTS(N) P99_FOR(, N, P00_SEQ, INIT_ELEMENT, P99_DUPL(N,)) 

然後

my_struct A[] = { INIT_ELEMENTS(2) }; 

應該擴大自己的喜好的初始化。

(這裏,第一宏定義了將被重複,僅使用I從它的參數,調用的索引的代碼。在第二宏P00_SEQ意味着這是由逗號分隔。)

+0

Oooo ...我沒聽說過。俏皮。 – dmckee

+0

+1,但無論如何,在vim中保存一個宏,將其應用n次並以可讀的結果結束會有什麼優勢? – ninjalj

+0

@ninjalj,將'2'換成'42'的那一天? –

0

我認爲你需要給一個名稱爲您新的數組

my_struct my_array[2] = { 
    {0, &decimals[my_array[0].index]}, 
    {1, &decimals[my_array[1].index]} 
};