【问题标题】:expected expression before '{' token'{' 标记之前的预期表达式
【发布时间】:2012-10-27 20:45:38
【问题描述】:

对于我之前评论过的行,我得到:“错误:'{' 标记之前的预期表达式”。如果结构已经定义,为什么它需要一个“{”在令牌之前。感谢您提供的任何帮助。

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;
}

【问题讨论】:

    标签: c expression token


    【解决方案1】:

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

    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)。这并不总是有效...但考虑到您的结构,它会。

    【讨论】:

    • 所以在使用“struct sdram_timing scan_list[30];”初始化之后如何为 scan_list 赋值?
    • @txcotrader - 我给你的是通用的方法。我编辑了我的帖子,用你的代码给你一个具体的例子。
    • 在尝试分配结构时也会发生这种情况(例如struct { int a; int b; } foo; foo = {1, 2};)... +1 用于区分分配和初始化,以便我快速回答。
    【解决方案2】:

    Initializer list 只能用于初始化数组。之后就不能使用了。

    但是如果你使用GCC,你可以使用Compound Literal扩展:

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

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

    【讨论】:

    • C99 中确实存在复合文字,但这并不意味着数组在 C99 中是可赋值的。他们不是。您的代码将无法编译。
    • scan_list初始化后要修改值怎么办?
    • @AndreyT 我刚刚意识到。数组变量不能单独作为左值。需要改成指针
    • @txcotrader 上面的代码向您展示了如何在初始化后更改它。
    【解决方案3】:

    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);
    

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-29
        相关资源
        最近更新 更多