2014-03-02 32 views
0

我正在編寫一個程序,以將多個typedef「項目」實例存儲在隊列中(使用this queue implementation),並且我遇到了將數據從隊列中取回的問題。C - 從存儲在隊列中的項目中檢索變量

下面是相關的代碼,減去文件打開/關閉線(代碼需要一個輸入文件,並將單個值到實例):

Sample file: 
1 2 10 20 30 
------------ 
/* create new item */ 
Item *newItem = malloc(sizeof(Item)); 

/* string tokenizer */ 
... 

/* set item variables */ 
newItem->value1 = strtol(tokens[0], NULL, 10); //should contain 1 
newItem->value2 = strtol(tokens[1], NULL, 10); //should contain 2 
newItem->value3 = strtol(tokens[2], NULL, 10); //should contain 10 
newItem->value4 = strtol(tokens[3], NULL, 10); //should contain 20 
newItem->value5 = strtol(tokens[4], NULL, 10); //should contain 30 

/* add to item queue */ 
queue_push_tail(itemQueue, &newItem); 

/* add second item with different values, same method as above */ 
... 

/* check queue values */ 
if(!queue_is_empty(itemQueue)) { 
    Item *itemHead = queue_peek_head(itemQueue);  //this should differ... 
    printf("Head: %d %d\n", itemHead->value1, itemHead->value5); 
    Item *itemTail = queue_peek_tail(processQueue);  //...from this 
    printf("Tail: %d %d\n", itemTail->value1, itemTail->value5); 
} 

我怎樣才能再訪問這些項目中的一個查看變量?我想我可以使用類似queue_peek_head(itemQueue)->value1的東西來查看項目中的第一個變量(在上面的示例中,1,因爲它存儲在隊列中的第一個newItem.value1中),但由於某種原因,這不起作用。

+1

這不是C++。你沒有得到類型指針。根據您使用的API,「QueueValue」(推送的值和通過剝離返回的值)與'void *'同義。在解引用基礎字段之前,你必須將其重新轉換爲'Item *'(並且當你這樣做時,最好有一個有效的「Item」地址)。 – WhozCraig

+0

啊,我明白了。我一定弄錯了語法。所以當我試圖獲取數據時,我應該使用'(Item *)'調用'queue_peek_head'作爲前綴?通過解引用基礎字段,你究竟意味着什麼?對不起,我仍然在抓指針和參考。 – user41419

+1

'if(!queue_is_empty(itemQueue)){Item * p = queue_peek_head(itemQueue);用p做一些事情''這是C.忘記引用。思考指針。 – WhozCraig

回答

2

像@WhozCraig在前面的評論中所說的,queue_peek_head()應該返回'void *',您應該將其轉換爲'Item *'。

代碼的另一個問題 - 'newItem'是一個堆棧變量,只要您將newItem推送到隊列的函數的調用堆棧中,就可以保留在隊列中。更安全的做法是在推送到隊列之前分配newItem,並在您不需要排隊時將其釋放到其他地方。

+0

感謝您的回答!我現在正在嘗試糾正你提到的第二點。當我創建並排隊兩個'Items'時,似乎獲得隊列中的第一個項目(頭部)並不會給我創建的第一個'Item'。相反,它是第二個「Item」。這與你提出的問題有關嗎? (編輯:我相信我每次讀取一組新的值時都會覆蓋'newItem',這可以用你的建議來解決嗎?是否有一種方法只是將一個通用的'Item'傳遞給隊列?) – user41419

+1

你需要確保隊列中的每個項目都有唯一的地址和良好的健康生活:)。動態分配是要走的路。 –