0

これが私が取り組んでいるものです。

{
    int Test;
    void (*functions[5])() = {
        return,
        one,
        two,
        three,
        four
    };

    for (Test = takeInput(5);; Test = takeInput(5)){
        cls();
        Print(L"0)  Abort\n");
        Print(L"1)  One\n");
        Print(L"2)  Two\n");
        Print(L"3)  Three\n");
        Print(L"4)  Four\n");
        Print(L"Enter Selection: ");
        (*functions[Test])();
    }
}

それが私がやろうとしていることの要点です。これは、あるコンテキストのメニューシステムのようなものです(そしてtakeInput(5)は入力を一時停止し、誰かが数値を入力するまでループを停止します)。

問題は、そのようにreturnを使用することは明らかに間違っているということです。(私が思った)returnが関数であると見て、メニューから抜け出すために関数ポインター配列に入れることができない理由がわかりません。基本的に呼び出されたときにtrueを返すダミー関数を作成し、それをチェックできると思います(他のすべての関数がvoidを返すという問題があります)。それがうまくいったとしても、私はむしろ、上記の機能しない例のように自己完結型の解決策を持っていると思います。

私がこれまで考えていたものよりも優れた、きれいで、うまくいけば短い方法でこれを行う方法はありますか?

4

2 に答える 2

3

returnは関数ではなく、アドレスがないため、関数へのポインタの配列に含めることはできません。

さらに、Test最初の数回使用すると、初期化されていないように見えます。

for (Test;

(*functions[Test])();

forループから抜け出したい場合は、の2つのセミコロンの間にbreakまたはまたは適切な条件を使用する必要があります。returnfor(;condition;)

関数呼び出しはループを中断しません。abort()それ以外の場合は、、exit()またはのようなエキゾチックなものlongjmp()です。

于 2013-03-06T14:10:46.537 に答える
1

return関数配列をで置き換え、関数NULLを実行する前にnullをテストし、関数ポインターが。の場合に戻りますNULL

于 2013-03-06T14:42:37.293 に答える