2011-07-20 95 views
1

我試圖解決這個錯誤,但失敗慘敗。我已經聲明如下迭代通過列表:作爲左操作數所需的錯誤左值

msc_con_list_slot msc_slot; 
memset(&msc_slot, 0, sizeof(msc_slot)); 
msc_pdn_con_t*conn = &msc_slot.conn; 

msc_ber_list_slot bearer_slot; 
memset(&bearer_slot, 0, sizeof(bearer_slot)); 
msc_ber_t *bearer = &bearer_slot.bearer; 

我的代碼,並試圖重複其

for(&bearer_slot=(&(conn->bearers))->head; &bearer_slot; &bearer_slot=(&bearer_slot)->next) 
{ 
//asign value here 
} 

我得到了一個錯誤:因分配
警告的左操作數
左值:「bearer_slot」的地址將永遠評估爲'真'

也許我會錯過一些東西,因爲我實際上並沒有得到什麼錯誤。感謝您的幫助

編輯附加結構:

typedef struct { 
     int id; 
} msc_ber_t; 

typedef struct _msc_ber_list_slot { 
     msc_ber_t bearer; 
     struct _msc_ber_list_slot *next, *prev; 
} msc_ber_list_slot; 

typedef struct { 
     msc_ber_list_slot *head, *tail; 
} msc_ber_list; 

回答

1

在for循環中,你是&bearer_slot分配值,也就是變量bearer_slot的地址,這是不允許的(這不是一個lvalue)並沒有任何意義。此外,你的循環條件是&bearer_slot的值,它總是計算爲true(因爲它是非指針),所以你的循環將永遠運行。您需要提供更多關於您希望此循環執行的內容。順便說一句,(&x)->y可以寫得更簡潔,如x.y - 這會讓你的代碼更具可讀性。

+0

感謝您的解釋,但我仍然無法得到「變量bearer_slot的地址,這是不允許的(它不是左值)並且沒有意義」的句子。@James – heike

+0

'bearer_slot'是一個變量。你可以使用'bearer_slot = whatever'來設置它的值。 '&bearer_slot'給你一個_pointer_,告訴你'bearer_slot'存儲在內存中的位置。將變量的物理位置表示更改爲另一個值是沒有意義的。用技術術語來說,'&bearer_slot'是一個'rvalue',而不是'lvalue'--也就是說,你不能設置它的值。與'x + 1 = y;'(其中'x'和'y是ints)的語句比較 - 這是不允許的,因爲'x + 1'是一個'右值'。 – James

3

你不能做到這一點:

&bearer_slot=(&(conn->bearers))->head; 

顯示我們msc_ber_list_slot是如何定義的。

我想像你想要的東西這樣:

struct msc_ber_list_slot *slot; 
for(slot=conn->bearers.head; slot; slot=slot->next) 
{ 
//asign value here 
} 
+0

爲什麼我做不到?我編輯結構,也嘗試了你的建議,但它返回了' - >'的無效類型參數的不同錯誤('msc_ber_list') @cnicutar – heike

+0

@heike如何定義msc_pdn_con_t? – cnicutar

相關問題