Qt数组中的C++不允许传入或操作值
C++ in Qt array not allowing values to be passed in or operated on
这个类将在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
。这意味着程序可能会运行,可能会崩溃,今天可能运行,明天可能崩溃,可能运行多年,某天突然崩溃。
因此,说它可以用一个编译器运行,而不是用另一个编译器,意味着你需要修复你的程序,不要被愚弄,以为构建程序"崩溃"版本的编译器有问题。
相关文章:
- 为什么 Clang 不允许"and"作为函数名称?
- 不允许在向量中添加更多元素
- std::带有自定义缓冲区的 iostream 不允许我写入
- Visual Studio 2017 不允许我创建 C++ 专用模板
- 返回时不允许隐式转换
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么 c++ 不允许(自动)强制转换?
- 为什么 c++11 不允许使用自动
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 不确定的std::system_error:what():不允许操作
- 当对象的当前状态不允许在其上进行操作时,要投掷哪个例外
- Qt 创建者,跟踪:不允许操作.什么是永久解决方案
- 什么会导致罕见的 lchown() 失败:不允许操作
- 为线程设置新优先级时不允许操作
- glm::vec2 不允许操作
- 如果 ssl::stream<tcp::socket 有挂起的操作,我是否不允许删除它>?
- 奇怪的异常抛出分配:不允许操作
- Qt数组中的C++不允许传入或操作值
- 谷歌核心转储程序返回不允许的操作
- 启用多线程来使用std::thread:不允许操作