尝试显示对象数组时出现运行时错误
Runtime error when trying to display array of objects
所以,我正在尝试用 C++ 创建纸牌游戏,在尝试确保我的数组正常工作时,我遇到了一个运行时错误,其中显示:
在 Sabacc.exe 中的 0x7AD940D9 (vcruntime140d.dll) 抛出异常:0xC0000005:访问冲突写入位置 0x0BFE1052.
我不知道这个错误的实际含义,但这是我的代码,您可以看到发生了什么:
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class cards {
public:
string suit;
int number = 0;
};
int main(int argc, char** argv) {
/*Initialise Arrays*/
cards Card[60];
//initialise Vars
string suits[4] = { "Coins", "Flasks", "Sabers", "Staves" };
int values[15] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
//Define Card Values
for (int c = 1; c < 61; c++) {
if (c >= 1 && c <= 15) {
Card[c].suit = "Coins";
Card[c].number = c;
}
else if (c >= 16 && c <= 30) {
Card[c].suit = "Flasks";
Card[c].number = c - 15;
}
else if (c >= 31 && c <= 45) {
Card[c].suit = "Sabers";
Card[c].number = c - 30;
}
else if (c >= 46 && c <= 61) {
Card[c].suit = "Staves";
Card[c].number = c - 45;
}
}
for (int i = 1; i < 60; i++) {
cout << Card[i].number << " " << Card[i].suit << endl;
}
return 0;
}
如果你能帮忙,那就太好了。我是一个完全的初学者,所以我可能缺少一个非常明显的答案。
for (int c = 1; c < 61; c++) {
off-by-one error 这里。数组cards Card[60];
只有60个元素(Card[0]
到Card[59]
),所以一定不能访问Card[60]
.
由于您在打印循环中只使用Card[1]
到Card[59]
,所以您应该根据此调整第一个循环。
也就是说条件c < 61
应该改成c < 60
.
另一种选择是将 cards Card[60];
更改为 cards Card[61];
(再添加一个元素)并(可选)将第二个循环的条件 i < 60
更改为 i < 61
。
Card[0]
未使用,但我认为在具有足够内存的现代 PC 上浪费几个字节的一个元素是可以的,以通过从 1 开始索引来提高可读性 and/or 简单性。
卡片结构分配索引0-59。在第一次迭代中,循环没问题,但为了更好地理解,我做了一些修改。您可以了解正在分配哪些索引。在 print 语句中,如果您不想显示“0”,您可以从 1 开始循环。主要错误出现在第 25 行 for (int c = 1; c < 61; c++) {
看看下面的完整代码:
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or
input loop */
class cards {
public:
string suit;
int number = 0;
};
int main(int argc, char** argv) {
/*Initialise Arrays*/
cards Card[60]; //indexes 0-59 gets allocated
//initialise Vars
string suits[4] = { "Coins", "Flasks", "Sabers", "Staves" };
int values[15] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
//Define Card Values
for (int c = 0; c < 60; c++) { //iterate 0-59 i.e 60 elements
if (c >= 1 && c <= 15) {
Card[c].suit = "Coins";
Card[c].number = c;
}
else if (c >= 16 && c <= 30) {
Card[c].suit = "Flasks";
Card[c].number = c - 15;
}
else if (c >= 31 && c <= 45) {
Card[c].suit = "Sabers";
Card[c].number = c - 30;
}
else if (c >= 46 && c <= 61) {
Card[c].suit = "Staves";
Card[c].number = c - 45;
}
}
for (int i = 0; i < 60; i++) { //prints 0-59 i.e 60 elements
cout << Card[i].number << " " << Card[i].suit << endl;
}
return 0;
}
所以,我正在尝试用 C++ 创建纸牌游戏,在尝试确保我的数组正常工作时,我遇到了一个运行时错误,其中显示:
在 Sabacc.exe 中的 0x7AD940D9 (vcruntime140d.dll) 抛出异常:0xC0000005:访问冲突写入位置 0x0BFE1052.
我不知道这个错误的实际含义,但这是我的代码,您可以看到发生了什么:
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class cards {
public:
string suit;
int number = 0;
};
int main(int argc, char** argv) {
/*Initialise Arrays*/
cards Card[60];
//initialise Vars
string suits[4] = { "Coins", "Flasks", "Sabers", "Staves" };
int values[15] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
//Define Card Values
for (int c = 1; c < 61; c++) {
if (c >= 1 && c <= 15) {
Card[c].suit = "Coins";
Card[c].number = c;
}
else if (c >= 16 && c <= 30) {
Card[c].suit = "Flasks";
Card[c].number = c - 15;
}
else if (c >= 31 && c <= 45) {
Card[c].suit = "Sabers";
Card[c].number = c - 30;
}
else if (c >= 46 && c <= 61) {
Card[c].suit = "Staves";
Card[c].number = c - 45;
}
}
for (int i = 1; i < 60; i++) {
cout << Card[i].number << " " << Card[i].suit << endl;
}
return 0;
}
如果你能帮忙,那就太好了。我是一个完全的初学者,所以我可能缺少一个非常明显的答案。
for (int c = 1; c < 61; c++) {
off-by-one error 这里。数组cards Card[60];
只有60个元素(Card[0]
到Card[59]
),所以一定不能访问Card[60]
.
由于您在打印循环中只使用Card[1]
到Card[59]
,所以您应该根据此调整第一个循环。
也就是说条件c < 61
应该改成c < 60
.
另一种选择是将 cards Card[60];
更改为 cards Card[61];
(再添加一个元素)并(可选)将第二个循环的条件 i < 60
更改为 i < 61
。
Card[0]
未使用,但我认为在具有足够内存的现代 PC 上浪费几个字节的一个元素是可以的,以通过从 1 开始索引来提高可读性 and/or 简单性。
卡片结构分配索引0-59。在第一次迭代中,循环没问题,但为了更好地理解,我做了一些修改。您可以了解正在分配哪些索引。在 print 语句中,如果您不想显示“0”,您可以从 1 开始循环。主要错误出现在第 25 行 for (int c = 1; c < 61; c++) {
看看下面的完整代码:
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or
input loop */
class cards {
public:
string suit;
int number = 0;
};
int main(int argc, char** argv) {
/*Initialise Arrays*/
cards Card[60]; //indexes 0-59 gets allocated
//initialise Vars
string suits[4] = { "Coins", "Flasks", "Sabers", "Staves" };
int values[15] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
//Define Card Values
for (int c = 0; c < 60; c++) { //iterate 0-59 i.e 60 elements
if (c >= 1 && c <= 15) {
Card[c].suit = "Coins";
Card[c].number = c;
}
else if (c >= 16 && c <= 30) {
Card[c].suit = "Flasks";
Card[c].number = c - 15;
}
else if (c >= 31 && c <= 45) {
Card[c].suit = "Sabers";
Card[c].number = c - 30;
}
else if (c >= 46 && c <= 61) {
Card[c].suit = "Staves";
Card[c].number = c - 45;
}
}
for (int i = 0; i < 60; i++) { //prints 0-59 i.e 60 elements
cout << Card[i].number << " " << Card[i].suit << endl;
}
return 0;
}