2016-12-01 12 views
0

このコードでは、データベースを検索してmemberNumberを検索する関数がブール値を返す実際の検索関数を呼び出すように(プログラムをモジュール化する)値。ブール値を返そうとしたときにプログラムがクラッシュする

今のところ、私はすでにsearchID関数がを返すときにプログラムがクラッシュするという問題に遭遇しています。 falseを返すとクラッシュしません。

オリジナルワーキング機能:

bool DonorList::searchID(int memberNumber) const 
{ 
    bool found = false; 
    list<DonorType>::const_iterator iter = donors->begin(); 
    while (iter != donors->end() && !found) 
    { 
     if (iter->getMembershipNo() == memberNumber) 
     { 
      found = true; 
     } 
     else 
      ++iter; 
    } 
    return found; 
} 

変更機能:

bool DonorList::searchID(int memberNumber) const 
{ 
    list<DonorType>::const_iterator iter; 
    bool found = searchDonorLocation(memberNumber, iter); 
    return found; 
} 

追加機能:私はプログラムがクラッシュそれ以外の問題を引き起こしているもの見当もつかない

bool DonorList::searchDonorLocation(int memberNumber, list<DonorType>::const_iterator &iter) const 
{ 
    iter = donors->begin(); 
    bool found = false; 
    while (iter != donors->end()) 
    { 
     if (iter->getMembershipNo() == memberNumber) 
     { 
      found = true; 
     } 
     else 
      iter++; 
    } 
    return found; 
} 

新しく変更された関数がtrueを返すと仮定します。私はsearchDonorLocation(memberNumber、iter)を返そうとしましたが、まったく同じクラッシュが発生します。

+2

「found」は宣言されていますか? [mcve] – user463035818

+0

を入力してください。元の関数のタイプミスです。それを指摘してくれてありがとうございます。ブールは宣言された偽を見つけました(もしそれができなければ、確かにうまくいかなかったでしょう)。それを含む投稿を編集しました。 – BaloneyOs

+2

memberNumberが見つかった場合。あなたはイテレータをインクリメントしていません、無限ループに入っています。あなたはただ真を返すべきです。またはループを中断する。 – user1438832

答えて

5
while (iter != donors->end()) 
{ 
    if (iter->getMembershipNo() == memberNumber) 
    { 
     found = true; 
    } 
    else 
     iter++; 
} 

これらが一致すると、イテレータをバンプしないためループが終了しないため、最後まで到達できません。それはが壊れてかぶら下がっていますか?

元のコードでは、ループを終了する!foundをテストします。

while (iter != donors->end() && !found) 
+0

おっと、そうですよ!それは私のところではかなりばかげたミスでした。それは今、私が発見したテストのために追加しました、ありがとうございました! – BaloneyOs

+2

関数内で一度だけ戻り値を呼び出すと言っている人もいますが、ループ内に "return true"というループを作成し、その後に "return false"という変数を定義します。障害を乗り越える人々は、1つのリターン・ステートメントだけがコードを私のためにフォローするのを難しくします。 – xaxxon

2

条件が満たされた場合、searchDonorLocation(..)がwhileループを終了しないように注意してください。 try:

while (iter != donors->end()) 
{ 
    if (iter->getMembershipNo() == memberNumber) 
    { 
     found = true; 
     break; 
    } 
    else 
     iter++; 
} 
関連する問題