2017-05-31 24 views
-1

私は別の関数からint値をとる関数を持っています。間違ったint型の値を入力すると、意図したとおりに動作します(同じ関数を再帰的に呼び出します)。ただし、int(a、%など)以外の値を入力すると、再帰的に関数が呼び出されますが、無限ループ私がC++プログラミングの学習段階に入っているので、どんな助けや洞察も素晴らしいでしょう。ここでC++再帰関数無限ループ

は、私が求めています何を要約すると、私の完全なコードスニペット(49行目)

は私が適切にエラーを表示したときに非無限ループをトリガすることなく、バックメインメニューに戻って行くだろうかですint値が与えられます。

int MainMenu(); 
void MainMenuSelection(int x); 

int main() 
{ 
    MainMenuSelection(MainMenu()); 
    return 0; 
} 

int MainMenu() { 
    int selection; 
    std::cout << "C++ Tutorials Main Menu\n"; 
    std::cout << "----------------------------------------------\n"; 
    std::cout << "1 - Chapter #1\n"; 
    std::cout << "2 - Chapter #2\n"; 
    std::cout << "3 - Chapter #3\n"; 
    std::cout << "----------------------------------------------\n"; 
    std::cout << "Please enter a cooresponding value: "; 
    std::cin >> selection; 

    if (std::cin.fail()) { 
     std::cout << "Input must be an integer"; 
    } 
    else { 
     return selection; 
    } 
} 

void MainMenuSelection(int x) { 

    if (x == 1) { 
     std::cout << "\nChapter #1 is unavailable.\n"; 
     std::cout << std::string(22, '\n'); 
     MainMenuSelection(MainMenu()); 
    } 
    else if (x == 2) { 
     std::cout << std::string(2, '\n'); 
     ChTwoMenuSelection(ChTwoMenu()); 
    } 
    else if (x == 3) { 
     std::cout << std::string(2, '\n'); 
     ChThreeMenuSelection(ChThreeMenu()); 
    } 
    else { 
     std::cout << "\nThere was an incorrect value submitted."; 
     std::cout << std::string(22, '\n'); 
     MainMenuSelection(MainMenu()); 
    } 

} 
+2

関数が値を返すと宣言しても、実際にはそれをしない関数は、*未定義の動作*があります。あなたのケースでは、 'MainMenu'関数から何も返さない実行パスがあります。 –

+0

また、なぜループの代わりに再帰呼び出しを使用していますか?あなたの場合、ループはより意味をなさないでしょう。 –

+0

「いくつかのプログラマーの男」と言ったところ:ここでは何も返さない**しかし、あなたは次のことをしなければならない:if(std :: cin.fail()){std :: cout << "入力は整数でなければならない" ; } '。 –

答えて

0

関数MainMenuSelection(int x)にはintが必要です。 main関数の関数呼び出しは、intを返さなければならない関数、すなわちint MainMenu()を呼び出すことによってこれを取得すると考えています。しかし、この関数は、このように宣言された関数から期待するべきことはしません。関数が必ず値を返すようにする必要があります(もちろん空白を除く)。

Cppcheckのような静的コードアナライザーは、コードを分析し、上記のような問題を見つけるのに役立ちます。

もう一つのヒントは、コードを実行するときに何が起こるかを考えることです。特に、コードがまだまだ小さい場合は、ステートメントを手動で実行してどのパスかを確認できるため、プログラムがどこで失敗するかを知ることができます。