Qt数组中的C++不允许传入或操作值

C++ in Qt array not allowing values to be passed in or operated on

本文关键字:操作 不允许 数组 C++ Qt      更新时间:2023-10-16

这个类将在visual Studio中进行精细编译并运行,它将在Qt中进行编译,但当数组实际用于createItem()中的==运算符时,它会出错。运行时显示segmentation fault。我尝试过手动在数组中设置值,但也不起作用。Qt是否不接受C++数组,因为此类在visual Studio编译和运行中运行良好。

此外,我是一个初学者,只会使用有效的代码,这段代码可能既不高效,也不节省内存,也不干净——它只是做了我现在想要做的事情。但你可能有任何改进都是受欢迎的。

#include "inventory.h"
#include <string>
#include <iostream>
inventory::inventory()
{
}

int inv[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
std::string itemName[1000] = {};
void inventory::setItem(int x) {
if (checkItem(x) == true) {
    for (int f = 0; f < 10 && f >= 0; ++f) {
        if (inv[f] == 0) {
            inv[f] = x;
            std::cout << "You have placed " << getItemName(x) << " in  your inventory." << std::endl;
            break;
        }
        else if (f == 9 && inv[f] != 0) {
            std::cout << "You have no more inventory space." << std::endl;
            break;
        }
    }
}
else {
    std::cout << "Item doesn't exist." << std::endl;
}
}
std::string inventory::getItemName(int x) {
std::string g = itemName[x];
return g;
}
void inventory::createItem(std::string y) {
bool exist = false;
for (int i = 0; i <= 1000; i++) {
    if (itemName[i] == y) {
        exist = true;
        break;
    }
}
for (int x = 1; x <= 1000; x++) {
    if (itemName[x] == "") {
        if (exist == false) {
            itemName[x] = y;
            break;
        }
        else if (exist == true) {
            std::cout << "ERROR: Item already exists" << std::endl;
            break;
        } 
    }
}
}
int inventory::getItemID(std::string y) {
for (int i = 0; i <= 1000; ++i) {
    if (itemName[i] == y) {
        return i;
    }
    else if (i == 1000 && itemName[i] != y) {
        std::cout << "ERROR: Item not found" << std::endl;
        return 1001;
    }
}
}
bool inventory::checkItem(int x) {
if (itemName[x] != "") {
    return true;
}
else {
    return false;
}
}
int inventory::checkInv(int x) {
for (int i = 0; i < 10; ++i) {
    if (inv[i] == x) {
        std::cout << "Item is in your inventory." << std::endl;
        return true;
        break;
    }
    else if (inv[i] == 9 && inv[9] != x) {
        std::cout << "You don't have the required item in your inventory." << std::endl;
        return false;
        break;
    }
}
}

您的问题完全与Qt错误和Visual Studio正确无关。

for (int i = 0; i <= 1000; i++) {

数组的索引从0到n-1,其中n是元素的数量。因此,itemName数组的有效索引为0到999。

看看你的循环——你正在访问itemName[i]。当i为1000时会发生什么?您现在正在访问itemName[1000],这是越界的。

这个循环(和其他循环(的解决方案是:

for (int i = 0; i < 1000; i++) {

你也会在非循环代码中犯同样的错误,比如:

else if (i == 1000 && itemName[i] != y)

同样,您正在访问itemName[1000],这是越界的。

此外,当您犯这样的错误时,程序将显示undefined behavior。这意味着程序可能会运行,可能会崩溃,今天可能运行,明天可能崩溃,可能运行多年,某天突然崩溃。

因此,说它可以用一个编译器运行,而不是用另一个编译器,意味着你需要修复你的程序,不要被愚弄,以为构建程序"崩溃"版本的编译器有问题。