2013-02-08 31 views
1

我的程序的主要功能顯示一個開關菜單。當輸入選項1時,稱爲「混洗」一系列「卡片」的功能。混洗完成後,該函數通過調用main()將程序返回到開頭,以便再次顯示菜單。C++重新啓動主程序而不會丟失變量

我遇到的問題是菜單的選項4將混洗陣列寫入文件。但是當洗牌後再重新啓動程序時,陣列數據會丟失,因此輸出的文件都是垃圾。有沒有辦法重新啓動主要()沒有數據丟失?

我在一個班級,並限制了我可以使用的工具,所以只有最基本的代碼纔可以接受。基本上,我正在尋找像goto這樣的東西,但有點安全(順便說一句,在這堂課中也是禁止的)。

+0

調用'main'在C++中是非法的。哪個編譯器允許? – chris

+2

「我正在尋找像goto,但有點安全的東西」這聽起來很像循環語句的描述(''while','do','for')... –

+0

@chris,調用main不是非法的。你可以在gcc中做到這一點。它最有可能有不同於你可能想要的效果......但是沒關係。試試這個代碼:int main(); int a(){return main(); } int main(){return a(); } – thang

回答

0

將主體移動到另一個函數「myMain」,並將其稱爲「主」。

7

C++程序調用自己的main函數實際上並不是一個好主意。實際上,這會導致未定義的行爲,這意味着您對程序的行爲沒有任何保證。它可能會崩潰,或者進行損壞的數據,或格式化硬盤驅動器等(儘管如此,最後一個不太可能)。

我認爲這反映了你的程序如何工作的一個更基本的問題。如果你希望數據在各個函數中持續存在,你需要將這些數據放在不會被其他函數破壞的地方。例如,您可以將數據放入堆中,然後將指針傳遞給周圍的數據。或者,您可以在main中將其定義爲局部變量,然後將其傳遞給函數,並在完成後返回這些函數。您還可以考慮製作表示數據的對象,然後將這些對象傳遞給不同的函數。

沒有看到您的代碼,我懷疑我可以給出比這更具體的答案。在設計程序時,請牢記數據流。想想哪些數據需要去哪裏以及如何到達那裏。

希望這會有所幫助!

2

爲什麼遞歸調用main(順便說一句,這是標準禁止的)?只需使用一個循環(例如,do ... while)來重複需要重複的部分main,並將必須重置的變量(及其初始化)保留在循環外部。

1

main()函數不應該被recusively調用。
您可以將遊戲循環封裝到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; 
}