2015-03-08 5 views
0

Я все еще новичок в программировании, но я пытаюсь сделать программу, которая немного больше, и состоит в том, что больше функций, чем обычно. И я хочу сделать повторяющееся «Главное меню» (от которого вы можете получить доступ к остальным функциям программы), но когда я снова пытаюсь вызвать функцию, ничего не происходит. Это выглядит так:Функция A, вызванная функцией A?

void mainMenu() 
{ 
    //clear console screen 
    //menu of the program 
    //i.e "Press 1 to choose something 
    //console screen is cleared again, then new options appear 
    //"Press E to go back to main menu" 

    unsigned char v; 
    v = getch(); 
    if (v == 'E') 
     mainMenu(); 
} 

Что я делаю неправильно? Не следует ли снова вызвать mainMenu(), очистить экран и т. Д.? Я думаю, я мог бы просто вернуть что-то из функции, которая заставит программу снова вызвать mainMenu() (и, например, сменить mainMenu() на int), но должно быть какое-то обходное решение, которое мне не хватает.

+0

В этом кодексе нет ничего плохого – Steephen

+0

Как вы узнали о mainMenu не называется? – tohava

+0

рекурсия, можно быть в порядке. Меня беспокоит, что у вас будет переполнение стека, и ваше приложение завершится. – Mgetz

ответ

0

Вы упомянули, что вы новичок в программировании, но слышали ли вы о структуре управления в C++, называемой оператором switch/case? Это может быть удобно для простого меню, которое вы пытаетесь реализовать. Вы можете прочитать об этом here.

Быстрый пример в отношении нужного варианта использования может выглядеть примерно так:

void mainMenu() 
{ 
    unsigned char v, w; 
    v = getch(); 
    switch(v) 
    { 
    case 'E': 
     mainMenu(); 
     break; 
    case 'A': 
     w = getch(); 
     if (w == 1) 
      callFunctionA(); 
     else 
      mainMenu(); 
     break; 
    case 'B': 
     callFunctionB(); 
     break; 
    // etc... You can have as many 'case' statements as you want depending on 
    //  how many possibilities you want to handle on the user's input. 
    default: 
     break; 
    } 
} 
+0

Да, но мое главное меню выглядит так: «Выберите A, B или C ->, если вы выбрали A: -> Выберите сейчас 1, 2, 3 или вернитесь к шагу 1 (выберите AB или C)." Разве это невозможно сделать так, не разбивая его на большее количество функций? – Smncru

+0

@Smncru см. Мое редактирование. Однако есть намного лучшие способы сделать это. Ваш модифицированный вариант использования (например, тот, который вы только что описали в своем комментарии) не подходит для использования оператора switch/case. В этом случае я бы попытался создать структуру цикла, как показано в зените ниже. –

0

Я рекомендовал бы реализовать ваши функции таким образом:

void mainMenu() 
{ 
    unsigned char v; 
    do 
    { 
     //clear console screen 
     //menu of the program 
     //i.e "Press 1 to choose something 
     //console screen is cleared again, then new options appear 
     //"Press E to go back to main menu" 

     v = getch(); 
    } while (v == 'E'); // Repeat do-while-loop if user entered 'E' 
} 

Теперь нет никаких изменений для stack overflow, потому что нет recursion.

2

Вы также должны добавить опцию для выхода из цикла!

void mainMenu() 
{ 
    system("cls"); 
    cout << "1. blah1\n2. blah2\n3. blah3\n4. Main menu\nE. Exit\n\n"; 
    unsigned char v = getch(); 

    if (v == '1') 
    { 
     cout << "blah1\n"; 
     // Call procedure for blah1 
    } 
    else if (v == '2') 
    { 
     cout << "blah2\n"; 
     // Call procedure for blah2 
    } 
    else if (v == '3') 
    { 
     cout << "blah3\n"; 
     // Call procedure for blah3 
    } 
    else if (v == '4') 
    { 
     mainMenu(); 
    } 
    if (v == 'E') 
    { 
     return; 
    } 
} 

int main() 
{ 
    mainMenu(); 
} 
0

Это настолько странно, но я не использовал 'else' между всеми моими ifs, как опубликовано Anmol.

unsigned char klik4; 
      do 
      { 
       klik4 = getch(); 
       if(klik4 == '1'); 
        //WSTAWIC FUNKCJE 
       else if(klik4 == '2'); 
        //WSTAWIC FUNKCJE 
       else if(klik4 == '3'); 
        //WSTAWIC FUNKCJE 
       else if(klik4 == '4'); 
        //WSTAWIC FUNKCJE 
       else if(klik4 == '5'); 
        //WSTAWIC FUNKCJE 
       else if(klik4 == '6'); 
        //WSTAWIC FUNKCJE 
       else if(klik4 == '7'); 
        //WSTAWIC FUNKCJE 
       else if(klik4 == '8') 
        { 
        mainMenu(); 
        return 0; 
        } 

      }while(klik4 < 49 || klik4 > 56); 

Это выдержка из моего кода, и теперь он звонит MainMenu() правильно (хотя я не уверен, если возвращение необходимо есть (моя функция теперь Int, не аннулируются)). Раньше я не пользовался elses, я просто думал, что они не нужны, но, похоже, проблема была. Я действительно не понимаю, почему моя проблема решена, но если кто-нибудь может объяснить, почему это происходит, я был бы благодарен.

Смежные вопросы