Поэтому я пытался написать игру в Xcode, в которой игровая доска рисуется в терминале с использованием многомерного массива типа char. Предполагается, что игра похожа на темницу, в которой есть двери, в которые вы можете войти, и когда вы создадите новую комнату в сгенерированном виде. Но иногда я получаю эту действительно досадную ошибку «(11db)», когда одна из моих строк подсвечивается «Thread 1: EXC_BAD_ACCESS (code = EXC_I386_GPFLT)», которая начинает меня раздражать Я не первый раз сталкиваюсь с ошибкой (11 дБ) в x-коде, и раньше мне удавалось ее исправить, но пока не могу. Также кто-нибудь на самом деле знает, что это значит? Я попытался немного погуглить, чтобы попытаться выяснить это, но пока не добился успеха. Но что меня больше всего раздражает, так это то, что это происходит не каждый раз. Иногда это происходит, как только я запускаю программу, когда создается комната, в других случаях это происходит после того, как вы входите в дверь, и я даже могу обходиться без нее. Вот код, где это происходит:
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
}
Настройки [] — это массив настроек, который у меня есть, который считывает значения из текстового файла с пользовательскими настройками для максимального и минимального случайных значений. 0 = максимальная высота 1 = минимальная высота 2 = максимальная ширина 3 = минимальная ширина 4 = максимальный враг 5 = минимальный враг
Также я использую srand(time(0))
в верхней части моей основной функции.
Мой код немного грязный, но вот он.
Ваш код падает, потому что вы разыменовываете указатель и попадаете в нехватку памяти. EXC_I386_GPFLT
По сути, это исключение, i386 (архитектура вашего процессора), ошибка общей защиты, что означает, что ваш код пытается читать или записывать память, чего не следует делать.
Глядя на ваш код, либо room
не установлен (может быть, он еще NULL?) или он уже был освобожден, или door_x
или же door_y
в конечном итоге больше, чем вы выделили room
(может быть, ваш randomNumber
метод имеет ошибку?)
Вам нужно распечатать значения для room
, door_x
, а также door_y
перед сбоем кода, и вам нужно показать нам остальную часть кода, чтобы мы могли видеть, как вы распределили room
и как randomNumber
работает (и как определяется размер карты).
И @zenith прав, это lldb
Отладчик LLVM, не 11db
, Вы должны прочитать учебник по lldb
потому что вы можете получить огромное количество информации из этой подсказки.
Других решений пока нет …