2017-01-12 5 views
-2

値がリストに含まれていても、このエラーが表示され、エラー:警告C4715::すべての制御パスが値を返すわけではありませんが、理由がわからない

bool find(pNode* t, deque<unique_ptr<pNode>>& openList) 
{ 

    for (auto p = openList.begin(); p != openList.end(); p++) 
    { 
     if (t->x == (*p)->x && t->y == (*p)->y) 
     { 
      cout << "The coords searched for are in the open list" << endl; 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 
+11

何openList'が空の '場合は? 'for'ループは実行されず、関数はすぐに戻ります。今、この質問に答えてみてください:この場合、何が返されますか? – ForceBru

+3

最初の要素だけをチェックしますが、出力はキュー全体を検索することを提案しているようです... – BeyelerStudios

+0

サイクルが繰り返されない場合、サイクルを持つ点は何ですか? – AnT

答えて

1

あなたの例では、反復しない、それだけで報告された場合、最初のノードの試合のtopenListが空の場合、forループは決して入力されません。ループが入力されていない場合は、関数が終了する前に文が遭遇していないことに注意してください。ループの外側に偽の声明文を置くことは、これらの問題をすべて解決し、期待される動作を提供することを意味します。さらにopenListはこの場合constにする必要があります。

bool find(pNode* t, const deque<unique_ptr<pNode>>& openList) 
{ 

    for (auto p = openList.begin(); p != openList.end(); p++) 
    { 
     if (t->x == (*p)->x && t->y == (*p)->y) 
     { 
      cout << "The coords searched for are in the open list" << endl; 
      return true; 
     } 
    } 
    return false; 
} 

ではなくstd::find_ifまたはrange-based for loopを使用することを検討してください。

#include <algorithm> 
bool find(pNode* t, deque<unique_ptr<pNode>>& openList) 
{ 
    auto iter = std::find_if(openList.begin(), openList.end(), 
     [t](const unique_ptr<pNode> & p_Ptr){ 
      return p_Ptr->x == t->x && p_Ptr->y == t->y; 
     }); 
    return iter != openList.end(); 
} 

それとも

bool find(pNode* t, const deque<unique_ptr<pNode>>& openList) 
{ 
    for (auto && ptr : openList) { 
     if (t->x == ptr->x && t->y == ptr->y) { 
      return true; 
     } 
    } 
    return false; 
} 
+0

おかげで改善されたものがあるようですが、私は他の2つのオプションも提供すると考えていますが、今は最初のものがOKでした 私は "アクセス違反の読み取り場所0x00000004。このコードの6行目の実行時にエラーが発生します(if(t-> x ==(* p) - > x && t-> y ==(* p) - > y)) –

1

リストを検索するときは、ループ内でelse句に「偽」の結果を入れて、古典的な初心者の間違いを作っています。単一のテストが失敗した後ではなく、ループを終了するまで何かが見つからなかったとは言えません。

bool find(pNode* t, deque<unique_ptr<pNode>>& openList) 
{ 
    for (auto p = openList.begin(); p != openList.end(); p++) 
    { 
     if (t->x == (*p)->x && t->y == (*p)->y) 
     { 
      cout << "The coords searched for are in the open list" << endl; 
      return true; 
     } 
    } 
    return false; 
} 
+0

ええ、まあ、私は助けのおかげで、一種の冗談の初心者です –

関連する問題