2014-09-11 111 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