txc*_*der 9 c expression token
我得到:"错误:我之前评论过的行'{'token'之前的预期表达式.如果结构已经定义,为什么在令牌之前需要"{".感谢您的任何帮助,您可以提供.
struct sdram_timing {
u32 wrdtr;
u32 clktr;
};
int calibration(void);
unsigned char read_i2c_cal(void);
static unsigned int eepcal[15];
main() {
DQS_autocalibration();
}
int calibration(void)
{
struct sdram_timing scan_list[30];
read_i2c_cal();
if(eepcal[0] == 0){
scan_list = {{eepcal[1], eepcal[2]}, {-1, -1}}; // <-- PROBLEM LINE
}
else {
//foo
}
return 0;
}
unsigned char read_i2c_cal(void) {
eepcal[0] = 0;
eepcal[1] = 02;
eepcal[2] = 03;
}
Run Code Online (Sandbox Code Playgroud)
Mik*_*ike 18
该错误是因为您不能以这种方式分配数组,这只能用于初始化它.
int arr[4] = {0}; // this works
int arr2[4];
arr2 = {0};// this doesn't and will cause an error
arr2[0] = 0; // that's OK
memset(arr2, 0, 4*sizeof(int)); // that is too
Run Code Online (Sandbox Code Playgroud)
所以将此应用于您的具体示例:
struct sdram_timing scan_list[30];
scan_list[0].wrdtr = 0;
scan_list[0].clktr = 0;
Run Code Online (Sandbox Code Playgroud)
或者您可以以相同的方式使用memset,但不是sizeof(int),而是需要结构的大小.这并不总是有效...但鉴于你的结构,它会.
C语言数组不可分配。无论使用哪种语法,都不能为整个数组分配任何内容。换句话说,这
scan_list = { { eepcal[1], eepcal[2] }, {-1, -1} };
Run Code Online (Sandbox Code Playgroud)
不可能。
在C89 / 90中,您必须逐行说明作业
scan_list[0].wrdtr = eepcal[1];
scan_list[0].clktr = eepcal[2];
scan_list[1].wrdtr = -1;
scan_list[1].clktr = -1;
Run Code Online (Sandbox Code Playgroud)
在现代C语言(C99之后)中,您可以使用复合文字来分配整个结构
scan_list[0] = (struct sdram_timing) { eepcal[1], eepcal[2] };
scan_list[1] = (struct sdram_timing) { -1, -1 };
Run Code Online (Sandbox Code Playgroud)
最后,在现代C语言中,您可以使用memcpy和复合文字将数据复制到数组中
memcpy(scan_list, (struct sdram_timing[]) { { eepcal[1], eepcal[2] }, {-1, -1} },
2 * sizeof *scan_list);
Run Code Online (Sandbox Code Playgroud)
尽管不是很优雅,但最后一个变体是“模拟”数组分配的最接近方法。