我一直在尝试用Xcode编写一个游戏,在终端中使用char类型的多维数组绘制一个游戏板。游戏应该像一个地牢,有门可以踩,当你创建一个新房间时,它会生成。但有时我会遇到这个非常烦人的“(11db)”错误,其中一行被突出显示,说:
“线程1:执行错误访问(代码=EXC_I386_GPFLT)”
这不是我第一次(11db)的错误,以前我已经能够修复它,但这次我似乎不能。这个错误是什么意思?我发现最恼人的部分是,它不是每次都发生。有时它会发生,只要我运行程序时,房间被创建,其他时候,它发生在你穿过一扇门之后,我甚至可以不带它。下面是它发生的代码:
door_x = randomNumber(height - 1, 1);
door_y = randomNumber(width - 1, 1);
//Check to see if door location is the same an an enemy or the player
for (int i = 0; i < enemies.size(); i++){
while ((door_x == enemies.at(i).getX() && door_y == enemies.at(i).getY()) || (door_x == player->getX() && door_y == player->getY())){
door_x = randomNumber(height - 1, 1);
door_y = randomNumber(width - 1, 0);
}
}
room[door_y][door_x] = DOOR;//Place door on map
这个错误发生在上面C++代码的最后一行。到底是什么错误,为什么?
这是创建一个新房间的整个函数和我的随机数函数。
int randomNumber(int max, int min){
int randomNumber = rand() %(max - min) + min;
return randomNumber;
}
void create_new_room(){
//Get random room height and room width
height = randomNumber(settings[0], settings[1]);
width = randomNumber(settings[2], settings[3]);
room = new char*[height];
for (int iter = 0; iter != height; iter++) {
room[iter] = new char[width];
}
for (int i = 0; i < height; i++){
for (int j = 0; j < width; j++){
room[i][j] = EMPTY;
}
}
enemies.clear();//Delete every object from the vector
//Create the enemies
int numEnemies = randomNumber(settings[4], settings[5]);
for (int i = 0; i < numEnemies; i++){
int randomHeight = randomNumber(height, 0);
int randomWidth = randomNumber(width, 0);
Enemy *e;//Create pointer to class to allow vector class push back
e = new Enemy(randomWidth, randomHeight, HEALTH);
enemies.push_back(*e);
delete e;//Delete pointer e to free memory and avoid any memory leak.
room[enemies.at(i).getY()][enemies.at(i).getX()] = ENEMY;//Place enemy on board
}
//Create Player
int player_y = randomNumber(height, 0);
int player_x = randomNumber(width, 0);
for (int i = 0; i < enemies.size(); i++){
while (player_x == enemies.at(i).getX()){
player_y = randomNumber(height, 0);
player_x = randomNumber(width, 0);
}
}
player = new Player(player_x, player_y, ATTACK);
//Place player on board
room[player->getY()][player->getX()] = PLAYER;
//Create a door
door_x = randomNumber(height - 1, 1);
door_y = randomNumber(width - 1, 1);
//Check to see if door location is the same an an enemy or the player
for (int i = 0; i < enemies.size(); i++){
while ((door_x == enemies.at(i).getX() && door_y == enemies.at(i).getY()) || (door_x == player->getX() && door_y == player->getY())){
door_x = randomNumber(height - 1, 1);
door_y = randomNumber(width - 1, 1);
}
}
room[door_y][door_x] = DOOR;//Place door on map
}
Settings[]是一个我拥有的设置数组,它从包含最大和最小随机值的用户设置的文本文件中读取值。0 =最大高度1 =最小高度2 =最大宽度3 =最小宽度4 =最大敌人5 =最小敌人
此外,我在主函数的顶部使用srand(time(0))
。
我的代码有点乱,但它在这里。
1条答案
按热度按时间tzdcorbm1#
您的代码崩溃是因为您正在解引用一个指针,并最终在一个坏的内存位。
EXC_I386_GPFLT
基本上是异常,i386(您的CPU体系结构),一般保护故障,这意味着您的代码正在尝试读取或写入内存,它不应该。查看您的代码,
room
没有被设置(可能它仍然是NULL?)或者它已经被释放,或者door_x
或door_y
的大小超过了您为room
分配的大小(可能您的randomNumber
方法有bug?)您需要在代码崩溃之前打印
room
、door_x
和door_y
的值,并且您需要向我们展示其余的代码,以便我们了解您是如何分配room
的,randomNumber
是如何工作的(以及如何计算出Map的大小)。@zenith是对的,它是
lldb
,LLVM调试器,而不是11db
,你应该阅读lldb
的教程,因为你可以从那个提示符中获得大量的信息。