2015-11-03 52 views
2

我有這樣的陣列結構的C:陣列 - Visual C

struct Stream_Bufer { 
    int size_; 
    int capacity_max; 
    int p_read; 
    int p_write; 
    char data_[320000]; 
} stream_buffer_[30]; 

但是,如果我做int capacity_max = 320000;我會得到錯誤:「數據成員的初始值是不允許的。」初始化的一種方式,我發現,是:

for(int i = 0; i<30;i++){ 
    stream_buffer_[i].capacity_max = 320000; 
} 

任何「乾淨」的方式來做到這一點?

+2

是否有任何理由在你的代碼'capaci ty_max'有一個不會不是320000的值?乍一看,因爲'data_'成員的大小不變,所以您可能應該使用常量。 – SirDarius

+0

當我寫入緩衝區時,有一個允許我控制緩衝區剩餘大小的值。 @SirDarius – carduh

+0

是你的for()循環在全局範圍嗎? (在C中,函數外部不允許使用代碼,即使不在初始化程序中) – joop

回答

-2

在這裏工作,即使是在C89模式:

void do_init(void) 
{ 
int ii; 

for(ii = 0; ii<30;ii++){ 
    stream_buffer_[ii].capacity_max = 320000; 
     } 

} 

但是,如果你想擺脫重複的常量,你可以使用:

struct Stream_Bufer { 
    int size_; 
    int capacity_max; 
    int p_read; 
    int p_write; 
    char data_[320000]; 
} stream_buffer_[30]; 

#define COUNTOF(a) (sizeof(a)/sizeof(a)[0]) 

void do_init(void) 
{ 
int ii; 

for(ii = 0; ii< COUNTOF(stream_buffer_); ii++){ 
     stream_buffer_[ii].capacity_max = sizeof stream_buffer_[ii].data_; 
     } 
} 
+0

這就是我的建議... – carduh

-2

爲GNU C編譯器你可以用這種方式:

struct data { 
    int a; 
    int b; 
    } data[2] = {{ .b = 1 }, { .b = 2 }}; 
+0

問題是關於初始化一個包含30個結構體的數組 –

+0

指定的初始值設定項是C99的一個特性,GCC提供這個特性作爲C90的非標準擴展。換句話說,除非您專門使用符合C99的編譯器,否則此代碼不能通過工具鏈移植。 https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html。而且,這種方法對於一系列結構不能很好地擴展。 –

+0

是的。 30結構。我建議使用include preprocesor指令和Python腳本來生成數據結構數組。 – nintyfan