函数A被调用函数A?

时间:2015-03-08 13:21:27

标签: c getch

我仍然是编程方面的新手,但我试图制作一个稍微大一点的程序,并且功能比平常更多。我想制作一个可重复的主菜单' (你可以访问其余程序的功能)但是当我试图再次调用该功能时,什么也没发生。它看起来像这样:

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),但必须有一些解决方法,我没有。

4 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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;
    }
}

答案 2 :(得分: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

答案 3 :(得分:0)

这太奇怪了,但我没有在Anmol发布的所有ifs之间使用'else'。

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,而不是void))。以前我没有使用elses,我只是认为它们没有必要,但似乎问题就在于此。 我真的不明白为什么,我的问题得到解决,但如果有人能解释为什么会这样,我会很感激。