C 在'之前的预期表达式;{';代币

C 在'之前的预期表达式;{';代币,c,expression,token,C,Expression,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(); }

我得到:“错误:对于我之前评论过的行,应该在“{”标记之前有表达式。如果已经定义了结构,为什么它需要“{”标记之前。感谢您提供的帮助

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;
}
struct sdram\u定时{
u32-wrdtr;
u32-clktr;
};
int校准(无效);
无符号字符读取i2c校准(无效);
静态无符号整数eepcal[15];
main(){
DQS_自动校准();
}
内部校准(无效)
{
结构sdram_定时扫描_列表[30];
读取i2c校准();
如果(eepcal[0]==0){

scan_list={{eepcal[1],eepcal[2]},{-1,-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)结构的大小。这并不总是有效的…但给定您的结构,它会起作用。

初始值设定项列表只能用于初始化数组。以后不能使用它

但是,如果使用
GCC
,则可以使用
复合文字
扩展名:

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

您可能需要将
scan\u list
类型更改为
struct sdram\u timing*

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

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

因此,在使用“struct sdram_timing scan_list[30];”对其进行初始化之后如何为扫描列表赋值?@TXOTrader-我给你的是一种通用的方法。我编辑了我的帖子,用你的代码给你一个具体的例子。当试图赋值一个结构时也会发生这种情况(例如
struct{int a;int b;}foo;foo={1,2};
)…+1以一种快速回答我的方式区分赋值和初始化。C99中确实存在复合文字,但这并不意味着数组在C99中是可赋值的。它们不是。你的代码不会编译。如果我想在初始化后修改扫描列表的值呢?@AndreyT我刚刚意识到。数组变量不能stand单独作为左值。需要更改为apointer@txcotrader上面的代码向您展示了如何在初始化后更改它。