Xcode 11db错误的事情:线程1:EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)

Xcode 11db error thing: Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

本文关键字:EXC 代码 ACCESS I386 GPFLT BAD 11db 错误 线程 Xcode      更新时间:2023-10-16

我一直在尝试在Xcode中编写游戏,其中游戏板是在终端中使用多维char类型数组绘制的。这款游戏就像一个地下城,当你进入一个新房间时,你可以踩到一些门。但有时我得到这个非常烦人的"(11db)"错误的东西,我的一行被突出显示,说:

"线程1:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)"

这不是我第一次在Xcode中遇到(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))在我的主要功能的顶部。

我的代码有点乱,但在这里。

你的代码正在崩溃,因为你正在解引用一个指针,并结束在一个坏的内存位。EXC_I386_GPFLT基本上是例外,i386(你的CPU架构),一般保护故障,这意味着你的代码试图读或写内存,它不应该。

看看你的代码,要么room没有设置(也许它仍然是NULL ?)或者它已经被释放了,或者door_xdoor_y已经结束了比你分配给room(也许你的randomNumber方法有一个bug?)

你需要在代码崩溃之前打印出room, door_xdoor_y的值,并且你需要向我们展示剩下的代码,以便我们可以看到你如何分配roomrandomNumber是如何工作的(以及如何计算出映射的大小)。

@zenith是对的,它是lldb, LLVM调试器,而不是11db。您应该阅读有关lldb的教程,因为您可以从该提示符中获得大量信息。