2014-10-30 21 views
5
here is the code 

struct point_tag { 
     int x; 
     int y; 
}; 

typedef struct point_tag Point; 

int main(void) 
{ 
     Point pt[] = { {10,20}, {30, 40}, {50,60}}; 
     pt[0] = {100,200}; 
} 

Khi tôi làm pt[0] = {100, 200}, trình biên dịch vẫn tiếp tục phàn nàn vềTại sao mảng biên dịch cấu trúc này không biên dịch?

error:expected expression before '{' token

tôi không thực sự nhận được rằng mặc dù. Không phải là biểu thức trước toán tử gán dấu {(=)?

Tôi không hiểu tại sao bài tập này lại là một vấn đề. giá trị tại địa chỉ pt là một mảng của điểm. Tôi chỉ cần thiết lập điểm thứ 0 là điểm mới này và tôi biết rằng việc gán một cấu trúc theo định dạng như {100,200} là hợp pháp khi các phần tử bên trong mảng đó chỉ là các trường.

Trả lời

6

Đối với chuyển nhượng, định kiểu giá trị để gõ Point để làm cho nó một compound literal:

pt[0] = (Point){100,200}; 

Live code sử dụng gcc

này tương đương với

{ 
    Point temp = {100,200}; 
    pt[0] = temp; 
} 

tái bút: Hợp chất theo nghĩa đen không có sẵn trong trình biên dịch tuân thủ C89 nghiêm ngặt cũ. Nó là avilable trong GCC cho C89 như là phần mở rộng và trong C99 hợp chất đen là một tính năng cốt lõi.

+0

Có lý do nào bạn không phải thực hiện việc này cho {10,20}, {30,40} và {50,60} không? Điều đó khiến tôi đi lên. Về mặt kỹ thuật, bạn vẫn gán các giá trị đó cho giá trị tại các chỉ mục đó trong mảng – committedandroider

+2

Vì cấu trúc trên chỉ có sẵn để khởi tạo. Trong 'pt [0] = (Điểm) {100,200};', bạn đang tạo một tạm thời 'Điểm 'và gán nó cho' pt [0] '. Bạn phải nói cho trình biên dịch biết '{100, 200}' là một 'điểm' hay' int [2] 'hay cái gì khác. –

+0

nhưng điều này không thể là logic tương tự ở chỗ bạn cũng tạo ra một điểm tạm thời {10,20} và lưu trữ nó như là giá trị của chỉ mục đầu tiên trong mảng? – committedandroider

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