1

私のプログラムのメイン機能はスイッチメニューを表示します。オプション1を入力すると、「カード」の配列を「シャッフル」する関数が呼び出されます。シャッフルが完了した後、その関数はmain()を呼び出してプログラムを最初に戻し、メニューが再び表示されるようにします。

これに関して私が抱えている問題は、メニューのオプション4がシャッフルされた配列をファイルに書き込むことです。ただし、カードをシャッフルしてからプログラムを再起動すると、配列データが失われるため、出力されるファイルはすべてジャンクになります。データを失うことなくmain()を再起動する方法はありますか?

私はクラスに所属しており、使用できるツールが限られているため、最も基本的なコードのみが受け入れられます。基本的に、gotoのようなものを探していますが、もう少し安全です(ちなみに、このクラスではgotoも禁止されています)。

4

4 に答える 4

7

実際には、C++ プログラムが独自のmain関数を呼び出すことはお勧めできません。実際、これは未定義の動作につながります。これは、プログラムの動作について保証がないことを意味します。クラッシュしたり、破損したデータを処理したり、ハード ドライブをフォーマットしたりする可能性があります (ただし、最後のエラーは起こりそうにありません)。

これは、プログラムの動作に関するより根本的な問題を反映していると思います。関数間でデータを保持したい場合は、そのデータを他の関数によって破壊されない場所に配置する必要があります。たとえば、データをヒープに入れてから、データへのポインターを渡すことができます。または、 でローカル変数として定義しmain、それを関数に渡し、それらの関数が完了したら返すようにすることもできます。データを表すオブジェクトを作成し、それらのオブジェクトをさまざまな関数に渡すことも検討できます。

あなたのコードを見なければ、これよりも具体的な答えを出せるとは思えません。プログラムを設計するときは、データ フローを念頭に置いてください。どのデータをどこに、どのようにしてそこに届ける必要があるかを考えてください。

お役に立てれば!

于 2013-02-08T03:00:37.737 に答える
2

なぜmain再帰的に呼び出しているのですか (ちなみに、これは標準で禁止されています)。ループ (例: a do... while) を使用して、繰り返すmain必要がある部分を繰り返し、リセット (およびその初期化) してはならない変数をループの外に保持します。

于 2013-02-08T03:02:34.073 に答える
1

関数を再帰的にmain()呼び出すべきではありません。ゲームループを関数
にカプセル化できます。while()

この例を見てください:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    bool exitGame = false;
    // Game Loop
    while(!exitGame) {

        // Display menu
        cout << "Menu :" << endl;
        cout << "- Shuffle :  press 1" << endl;
        cout << "- Option 2 : press 2" << endl;
        cout << "- Option 3 : press 3" << endl;
        cout << "- Exit     : press 4" << endl;
        cout << "Enter your choice : ";

        // Get user input
        string choosenValue;
        cin >> choosenValue;

        cout << endl;

        // Process user input
        if (choosenValue == "1") {
            cout << "You selected 'Shuffle'." << endl;
            // Do cool stuff here !

        } else if (choosenValue == "2") {
            cout << "You selected 'Option 2'." << endl;
            // Do cool stuff here !

        } else if (choosenValue == "3") {
            cout << "You selected 'Option 3'." << endl;
            // Do cool stuff here !

        } else if (choosenValue == "4") {
            cout << "You selected 'Exit'." << endl;
            exitGame = true;

        } else {
            cout << "Wrong value." << endl;
        }
        cout << endl;
    }

    return EXIT_SUCCESS;
}
于 2013-02-10T09:56:24.057 に答える
0

本体を別の関数 'myMain' に移動し、代わりに main を呼び出します。

于 2013-02-08T03:00:29.563 に答える