Xcode 11db错误的事情:线程1:执行错误访问(代码=执行_I386_GPFLT)

rseugnpd  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(228)

我一直在尝试用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))
我的代码有点乱,但它在这里。

tzdcorbm

tzdcorbm1#

您的代码崩溃是因为您正在解引用一个指针,并最终在一个坏的内存位。EXC_I386_GPFLT基本上是异常,i386(您的CPU体系结构),一般保护故障,这意味着您的代码正在尝试读取或写入内存,它不应该。
查看您的代码,room没有被设置(可能它仍然是NULL?)或者它已经被释放,或者door_xdoor_y的大小超过了您为room分配的大小(可能您的randomNumber方法有bug?)
您需要在代码崩溃之前打印roomdoor_xdoor_y的值,并且您需要向我们展示其余的代码,以便我们了解您是如何分配room的,randomNumber是如何工作的(以及如何计算出Map的大小)。
@zenith是对的,它是lldb,LLVM调试器,而不是11db,你应该阅读lldb的教程,因为你可以从那个提示符中获得大量的信息。

相关问题