2012-11-07 70 views
6

我得到:「錯誤:預期表達式在'{'標記」之前,我之前評論過的行。如果結構已經定義,爲什麼它需要在令牌之前使用「{」。感謝您的任何幫助,您可以提供。預期的表達式在'{'標記之前

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

回答

14

錯誤是因爲您不能以這種方式分配數組,只能用於初始化它。

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)的,你需要你的結構的大小。這並不總是奏效......但考慮到你的結構,它會。

+0

所以在使用「struct sdram_timing scan_list [30];」初始化之後,我如何分配值給scan_list? – txcotrader

+0

@txcotrader - 我給你的是通用的方式。我編輯我的帖子,給你一個使用你的代碼的具體例子。 – Mike

+0

當嘗試分配一個結構(例如'struct {int a; int b;} foo; foo = {1,2};')... +1)時,也會發生這種情況,以便以某種方式區分賦值和初始化一個快速的答案。 – laindir

1

您只能在變量聲明中使用初始化器列表,而不能在事實之後使用。

1

初始化列表只能用於初始化一個數組。之後你不能使用它。

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

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

您可能需要更改scan_list型是在C語言struct sdram_timing *

+0

複合文字確實存在於C99中,但這並不意味着數組可以在C99中賦值。他們不是。你的代碼不會編譯。 – AnT

+0

如果我想在初始化後修改scan_list的值,該怎麼辦? – txcotrader

+0

@AndreyT我剛剛意識到。數組變量不能作爲左值單獨使用。需要更改爲指針 – texasbruce

1

數組是不可轉讓。無論您使用何種語法,都無法將任何內容分配給整個陣列。換句話說,這是

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

儘管不是很優雅,但最後一個變體是「模擬」數組賦值的最接近的方法。

相關問題