2013-05-21 39 views
0

嗨,我是新來的,我嘗試使用list_for_each_entry來遍歷列表。它看起來像這樣list_for_each_entry reset cursor

list_for_each_entry(pos, head, member){ 
    if (something == pos.x) 
    //reset the loop cursor so that it starts iterating all over again 
} 

如何在不使用goto的情況下執行註釋部分?還有一件事,在list_for_each_entry裏面使用break/continue是否安全,或者是否有任何可用的功能來實現這個功能?

謝謝。

回答

0

看從https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/list.h?id=refs/tags/v3.10-rc2#n418

的list_for_each_entry

#define list_for_each_entry(pos, head, member)    \ 
for (pos = list_entry((head)->next, typeof(*pos), member); \ 
    &pos->member != (head); \ 
    pos = list_entry(pos->member.next, typeof(*pos), member)) 

的定義,正如你看到的這被定義爲一個簡單的for循環,無黑魔法在這裏,你可以使用繼續/中斷。

對於你的其他問題,我想這取決於你爲什麼試圖做到這一點。最簡單的方法是:

int iterateAgain = 0; 
list_for_each_entry(pos, head, member) { 
    // (...) 
    if (something == pos.x) { 
     iterateAgain = 1; 
     break; 
    } 
} 
if (iterateAgain) { 
    list_for_each_entry(pos, head, member) { 
     // (...) 
    } 
} 

但取決於你的代碼,它可能太冗餘等你也可以有一個遞歸函數。有很多方法可以做到這一點。您的評論後

編輯:

int keepIterating; 
do { 
    keepIterating = 0; 
    list_for_each_entry(pos, head, member) { 
     // (...) 
     if (something == pos.x) { 
      keepIterating = 1; 
      break; 
     } 
    } 
} while (keepIterating); 
+0

感謝您的及時答覆。無論如何,假設語句if(pos == pos.x)在第二個list_for_each_entry中再次成功,我需要重新列表。因此,我認爲我可能不得不使用goto或遞歸函數,不是嗎? – user2403843

+0

在這種情況下,我寧願使用循環。我用一個例子編輯了我的答案 – Guillaume