0

こんにちは、私はこれが初めてで、 list_for_each_entry を使用してリストを反復処理しようとしています。こんな感じです

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

goto を使用せずにコメント部分を実行するにはどうすればよいですか? もう1つ、list_for_each_entry内でbreak/continueを使用しても安全ですか、それともこれを実現するために利用できる関数はありますか?

ありがとう。

4

1 に答える 1

0

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))

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

ご覧のとおり、これは単純な for ループとして定義されており、黒魔術はありません。continue/break を使用できます。

あなたの他の質問については、なぜそれをやろうとしているのかにかかっていると思います。最も簡単な方法は次のとおりです。

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);
于 2013-05-21T03:09:08.100 に答える