12

对于我之前评论过的行,我得到:“错误:'{' 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;
}
4

4 回答 4

23

错误是因为您不能以这种方式分配数组,只能用于初始化它。

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

因此,将其应用于您的具体示例:

struct sdram_timing scan_list[30];
scan_list[0].wrdtr = 0;
scan_list[0].clktr = 0;

或者您可以以相同的方式使用 memset,但您需要结构的大小而不是 sizeof(int)。这并不总是有效......但考虑到你的结构,它会。

于 2012-11-07T18:28:07.647 回答
6

C 语言中的数组是不可赋值的。无论您使用什么语法,您都不能为整个数组分配任何内容。换句话说,这

scan_list = { { eepcal[1], eepcal[2] }, {-1, -1} };

不可能。

在 C89/90 中,您必须逐行拼写作业

scan_list[0].wrdtr = eepcal[1];
scan_list[0].clktr = eepcal[2];
scan_list[1].wrdtr = -1;
scan_list[1].clktr = -1;

在现代 C(C99 后)中,您可以使用复合文字来分配整个结构

scan_list[0] = (struct sdram_timing) { eepcal[1], eepcal[2] };
scan_list[1] = (struct sdram_timing) { -1, -1 };

最后,在现代 C 中,您可以使用memcpy和复合文字将数据复制到数组

memcpy(scan_list, (struct sdram_timing[]) { { eepcal[1], eepcal[2] }, {-1, -1} },
  2 * sizeof *scan_list);

最后一个变体,虽然不是很优雅,但却是最接近“模拟”数组赋值的方法。

于 2012-11-07T18:37:21.290 回答
1

您只能在变量声明中使用初始化列表,而不是事后。

于 2012-11-07T18:27:52.277 回答
1

初始化列表只能用于初始化数组。之后您将无法使用它。

但是,如果您使用GCC,则可以使用Compound Literal扩展名:

scan_list = (struct sdram_timing[30]){{eepcal[1], eepcal[2]}, {-1, -1}};

您可能需要将scan_list类型更改为struct sdram_timing *

于 2012-11-07T18:31:46.143 回答