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

Posted

技术标签:

【中文标题】函数调用和函数完成后的C++,游戏完全崩溃【英文标题】:C++ After Function Call and Function Completion, Game Crashes Entirely 【发布时间】:2014-09-11 01:50:21 【问题描述】:

我在学校的 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);

【问题讨论】:

您是否尝试在调试器中运行它以查看它实际崩溃的位置? inventoryFunction 真的什么都不返回吗?这可能会导致崩溃,您应该将其设为 void return 或返回一个字符串。 我没有尝试过调试器,但我尝试将其更改为 void 函数,它似乎已修复它。我不知道为什么,但由于某种原因,我的印象是你不能在 void 函数上有参数。去年我的 Java 老师不是特别好,我将很多知识带到了 C++ 中。无论如何,非常感谢! :D @mstuff63,如果你的void是参数列表(int xyzzy(void)),你不能有参数。如果是返回类型(void xyzzy(int a)),可以。 @paxdiablo 哦,谢谢!我将不得不记住这一点,这样就不会再发生在我身上了哈哈 【参考方案1】:

不确定是否存在任何可能导致崩溃的情况,我的建议是在调试器中单步执行您的代码以查看其崩溃的位置。这个错误很可能是在某个完全不同的地方,它只是被修改向量的函数调用加剧了。

不幸的是,这就是错误的本质,如果不仔细观察,您永远无法真正知道它们实际上来自哪里:-)

但是,我想指出一些代码问题。


首先,关于:

inventory[i].erase();

这并不像你认为的那样。 inventory[i] 是向量中的 字符串,因此它只是擦除字符串内容。

如果你想从向量中删除字符串,你需要这样的东西:

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

其次,我倾向于为addToInventoryremoveFromInventorylistInventory 设置三个独立函数。

这似乎有点...不直观...必须记住 h 的神奇值才能实现您想要做的事情,除了访问 @987654328 之外,这三个用例没有真正的共同点@vector(这还不足以将它们组合成同一个成员函数)。


最重要的是,您的函数似乎返回了 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++ 版本,我希望它会流行起来并让我出名:-)

【讨论】:

感谢您提供的信息。这绝对防止了一些未来的错误。我不太记得它是如何工作的。不幸的是,游戏仍然崩溃。【参考方案2】:

因此,通过将inventoryFunction 更改为@Retired Ninja 所说的void 函数,崩溃已经停止发生,现在程序运行良好。 另外,@paxdiablo 指出我错误地使用了 inventory[i].erase() 东西,所以非常感谢他,因为现在我以后不必再回到这里来尝试解决这个问题:D

【讨论】:

【参考方案3】:
string inventoryFunction(int h, string ab)

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

【讨论】:

以上是关于函数调用和函数完成后的C++,游戏完全崩溃的主要内容,如果未能解决你的问题,请参考以下文章

调用OpenGL函数时程序崩溃

从不同的 VC 访问时,带有完成处理程序的 API 调用函数崩溃

Android使用JNI,C++调用JAVA代码,能找到JAVA的函数无法调用?

main函数可否进行递归调用

调用特定 DLL 中的函数时 CEF 崩溃

使用指针调用 C++ DLL 函数