2012-11-07 38 views
6

Tôi nhận được: "error: expression được mong đợi trước '{' token" cho dòng tôi đã nhận xét trước đây. Nếu cấu trúc đã được xác định tại sao nó sẽ cần một "{" trước mã thông báo. Cảm ơn vì bất kì sự giúp đỡ nào của bạn.biểu thức được mong đợi trước '{' 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; 
} 

Trả lời

14

Lỗi này là do bạn không thể gán một mảng theo cách đó, chỉ hoạt động để khởi tạo nó.

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 

Vì vậy, việc áp dụng này để ví dụ cụ thể của bạn:

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

hoặc bạn có thể sử dụng memset theo cùng một cách, nhưng thay vì sizeof (int), bạn cần kích thước của cấu trúc của bạn. Điều đó không phải lúc nào cũng hiệu quả ... nhưng với cấu trúc của bạn, nó sẽ như thế.

+0

vì vậy sau khi được khởi tạo bằng "struct sdram_timing scan_list [30];" làm thế nào tôi có thể gán giá trị cho scan_list? – txcotrader

+0

@txcotrader - Những gì tôi đã cho bạn là cách chung để làm điều đó. Tôi đã chỉnh sửa bài đăng của mình để cung cấp cho bạn một ví dụ cụ thể bằng cách sử dụng mã của bạn. – Mike

+0

Điều này cũng xảy ra khi cố gán một cấu trúc (ví dụ 'struct {int a; int b;} foo; foo = {1, 2};') ... +1 để phân biệt việc gán và khởi tạo theo cách đã cho tôi một câu trả lời nhanh. – laindir

1

Bạn chỉ có thể sử dụng danh sách khởi tạo trong khai báo biến, chứ không phải sau sự kiện.

1

Danh sách trình khởi tạo chỉ có thể được sử dụng để khởi tạo một mảng. Bạn không thể sử dụng nó sau đó.

Tuy nhiên nếu bạn sử dụng GCC, bạn có thể sử dụng phần mở rộng Compound Literal:

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

Bạn có thể cần phải thay đổi scan_list loại được struct sdram_timing *

+0

Các ký tự hợp chất tồn tại trong C99, nhưng điều đó không có nghĩa là các mảng được gán trong C99. Họ không phải. Mã của bạn sẽ không biên dịch. – AnT

+0

Nếu tôi muốn sửa đổi giá trị của scan_list sau khi nó được khởi tạo thì sao? – txcotrader

+0

@AndreyT Tôi vừa mới nhận ra. Các biến mảng không thể đứng một mình như một giá trị. Cần thay đổi thành con trỏ – texasbruce

1

Mảng trong ngôn ngữ C là không thể chuyển nhượng. Bạn không thể gán bất kỳ thứ gì cho toàn bộ mảng, bất kể cú pháp bạn sử dụng là gì. Nói cách khác, điều này

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

là không thể.

Trong C89/90 bạn sẽ phải giải thích rõ ràng dòng bài tập của bạn bởi dòng

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

Trong C hiện đại (post-C99), bạn có thể sử dụng các chữ ghép gán toàn bộ cấu trúc

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

Cuối cùng, trong C hiện đại, bạn có thể sử dụng memcpy và các ký tự hợp chất để sao chép dữ liệu vào mảng

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

Biến thể cuối cùng, mặc dù không phải là rất thanh lịch, là cách gần nhất để "mô phỏng" gán mảng.

Các vấn đề liên quan