2015-11-03 46 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