Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从函数A中调用函数A?_C_Getch - Fatal编程技术网

C 从函数A中调用函数A?

C 从函数A中调用函数A?,c,getch,C,Getch,我仍然是一个编程新手,但我正在尝试制作一个稍微大一点的程序,并且包含比平常更多的函数。我想制作一个可重复的“主菜单”(从中可以访问程序的其余功能),但当我试图再次调用该功能时,什么都没有发生。看起来是这样的: void mainMenu() { //clear console screen //menu of the program //i.e "Press 1 to choose something //console screen is cleared aga

我仍然是一个编程新手,但我正在尝试制作一个稍微大一点的程序,并且包含比平常更多的函数。我想制作一个可重复的“主菜单”(从中可以访问程序的其余功能),但当我试图再次调用该功能时,什么都没有发生。看起来是这样的:

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(),清除屏幕等?我想我可以从函数返回一些东西,这会使程序再次调用MeMeNuu(),(例如,将MeMeNuu()更改为int),但是必须有一些解决办法,我没有注意到。

< P>你提到了你是一个编程新手,但是你听说过C++中的控制结构,称为开关/case语句吗?它可能适用于您试图实现的简单菜单。你可以读到它

关于所需用例的一个快速示例如下所示:

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;
    }
}

我建议通过以下方式实现您的功能:

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'
}

现在没有更改,因为没有涉及。

您必须添加退出循环的选项

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();
}
void主菜单()
{
系统(“cls”);

cout这太奇怪了,但我没有像Anmol发布的那样在我所有的如果之间使用“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);
无符号字符klik4;
做
{
klik4=getch();
如果(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')
{
主菜单();
返回0;
}
}而(klik4<49 | | klik4>56);
这是我代码的一个摘录,现在它正确地调用mainMenu()(尽管我不确定那里是否需要return(我的函数现在是int,而不是void))。以前我没有使用else,我只是认为它们不是必需的,但似乎这就是问题所在。
我真的不明白为什么,我的问题已经解决了,但如果有人能解释为什么会发生这种情况,我将不胜感激。

这段代码中没有任何错误。您如何知道主菜单没有被调用?递归可以。我担心的是,您会出现堆栈溢出,您的应用程序将终止。但它没有按预期工作。是吗因为我在使用参数?我的代码似乎忽略了主菜单(此处为args)并退出。
mainMenu()
不接受任何argsYeah,但我的主菜单如下所示:“选择A、B或C->如果选择了A:->现在选择1、2、3或返回到步骤1(选择A、B或C)。”如果不将其拆分为更多功能,就不可能这样做吗?@Smncru请参阅我的编辑。但是,有更好的方法可以做到这一点。您修改的用例(例如,您刚才在评论中描述的用例)不适合使用switch/case语句。在这种情况下,我将尝试下面的zenith演示的循环结构。