C ++函数调用和函数完成后,游戏完全崩溃

时间:2014-09-11 01:50:21

标签: c++ function vector inventory

我在学校的C ++游戏编程课程中一直在制作一个游戏问题。出于某种原因,在调用我用来管理基于库存的东西的函数之后,该函数似乎完成并且工作(我认为这是因为我在它的末尾放入了cout命令并且它们打印正确,该功能连续运行两次,并且它们都运行),我的整个游戏崩溃并且没有到达下一行。我试着注释掉函数中的所有代码,但它仍然崩溃了。我评论了函数调用并且它有效,但我仍然不能告诉它有什么问题。我将为函数设置代码,我打电话的部分是:

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);

3 个答案:

答案 0 :(得分:1)

不确定是否有任何可能导致崩溃的事情,我的建议是在调试器中单步执行代码以查看它在哪里崩溃。很可能这个bug完全不同了,而且修改向量的函数调用正在恶化它。

不幸的是,这就是错误的本质,你无法真正告诉他们实际来自哪里而不仔细观察: - )

然而, 我想指出的代码有几个问题。


首先,关于:

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”,这是“Pythonic”概念的C ++版本,我希望它能成为一个让我着名的模因: - )

答案 1 :(得分:0)

因此,通过将inventoryFunction更改为像@Retired Ninja这样的void函数,崩溃已经停止,现在该程序运行良好。 另外,@ paxdiablo指出我错误地使用了库存[i] .erase()的东西,所以感谢他的一大堆,因为现在我不必再回到这里来试图修复它:D < / p>

答案 2 :(得分:0)

string inventoryFunction(int h, string ab)

应该返回一个字符串,但是没有任何return语句。当然,将其更改为void函数后,它可以正常工作,但不会返回任何内容。有趣的是,您可以无错误地共同编译此代码-通常,编译器会向您显示此问题。