2014-09-11 112 views
0

我一直在爲我在學校的C++遊戲編程課上做的遊戲出現問題。出於某種原因,在調用我用來管理基於庫存的東西的函數之後,函數似乎完成並且工作(我認爲這是因爲我在它的末尾放置了cout命令,並且它們正確地打印了,函數連續運行兩次,並且都運行),我的整個遊戲崩潰並且沒有到達下一行。我試着評論了函數中的所有代碼,但它仍然崩潰。我將函數調用註釋掉了,並且它可以工作,但我仍然不能說出它有什麼問題。我把代碼的功能和部分被我打的電話:C++函數調用和函數完成後,遊戲完全崩潰

string inventoryFunction(int h, string ab) 
{ 
    if(h == 1) 
     inventory.push_back(ab); 
    else 
     if(h == 2) 
     { 
      for(int i=0; i < inventory.size(); i++) 
      { 
       if(inventory[i] == ab) 
        inventory[i].erase(); 
      } 
     } 
     else 
      if(h == 3) 
      { 
       cout << inventory[0]; 
       for(int i=1; i < inventory.size(); i++) 
        cout << ",  " << inventory[i]; 
      } 
} 

函數調用:

if(answer.find("village") != string::npos) 
    { 
     cout << endl; 
     cout << "While looking around your village,\nyou found a stone sword and a cracked wooden shield!" << endl; 
     inventoryFunction(1, "stone sword"); 
     inventoryFunction(1, "cracked wooden shield"); 
     cout << "Would you like to set off on your adventure now?" << endl; 
     cin >> answer2; 
     capitalizeLower(answer2); 
+0

您是否嘗試過在調試器中運行它以查看它實際崩潰的位置? 'inventoryFunction'確實沒有任何回報?這可能會導致崩潰,您應該將其作爲無效返回或返回一個字符串。 – 2014-09-11 01:53:14

+0

我還沒有嘗試調試器,但我試圖將其更改爲無效函數,它似乎已修復它。我不知道爲什麼,但出於某種原因,我的印象是你無法在無效函數上使用參數。去年我在Java的老師並不是那麼棒,而且我從C++中學到了很多知識。無論如何,感謝一噸! :D – mstuff63 2014-09-11 02:18:42

+0

@ mstuff63,如果你的'void'是參數列表('int xyzzy(void)'),那麼你不能有參數。如果它是返回類型('void xyzzy(int a)'),那麼可以。 – paxdiablo 2014-09-11 02:26:37

回答

1

不知道有什麼事,有可能造成崩潰,我建議將是在調試器中單步執行代碼,以查看它在哪裏崩潰。這種錯誤很可能完全不同,它只是被修改矢量的函數調用所加劇。

這是錯誤的性質很可惜,你永遠不能告訴他們是實際上來自何處無:-)

但是仔細觀察,有幾個問題的代碼,我我想指出。


首先,關於:

inventory[i].erase(); 

這並不做什麼,你認爲它。 inventory[i]是你的向量中的字符串,所以它只是刪除字符串內容。

如果你想從載體中刪除字符串,你需要這樣的:

inventory.erase (inventory.begin() + i); 

其次,我會傾向於有三個獨立功能addToInventoryremoveFromInventorylistInventory

看起來有點......不直觀......必須記住h的魔法值才能實現你想要做的事情,除了訪問inventory向量之外的三種用例中沒有真正的共同點(這並不足以將它們組合到相同的成員函數中)。


最重要的是,你的功能似乎是返回一個string但你有沒有實際return報表,事實上,沒有你的函數的三個用例需要什麼要傳遞回來。

簽名是最好的:

void inventoryFunction(int h, string ab) 

在上述第二和第三個方面,我可能會喜歡的東西開始:

void addToInventory (string item) { 
    inventory.push_back(ab); 
} 

void removeFromInventory (string item) { 
    for (int i = 0; i < inventory.size(); i++) { 
     if (inventory[i] == ab) { 
      inventory.erase (inventory.begin() + i); 
      break; 
    } 
} 

void listInventory() { 
    cout << inventory[0]; 
    for (int i = 1; i < inventory.size(); i++) 
     cout << ",  " << inventory[i]; 
} 

您可能還想使用迭代器專門用於第二個和第三個功能,而不是手動i迭代集合。

它會爲你節省一些代碼,出現更多的「C++ IC」中,「Python化」概念的C++版本,我希望將趕上並讓我出名:-)模因

+0

感謝您的信息,這絕對防止了一些未來的錯誤。我不記得它是如何工作的。不幸的是,遊戲仍然崩潰。 – mstuff63 2014-09-11 02:09:04

0

因此,通過將inventoryFunction更改爲像@Retired Ninja所說的無效函數,崩潰已經停止,現在程序運行良好。 另外,@paxdiablo指出我錯誤地使用了inventory [i] .erase()的東西,所以非常感謝他們,因爲現在我不會在以後再回來試圖解決這個問題:D