Ошибка сегментации для программы тральщика Переполнение стека

Я думаю, что проблема в моем конструкторе. Он начинает работать и «помещать бомбы» в 2-й массив (сетку), но останавливается посередине. (иногда это будет проходить весь путь через …

SweeperGrid::SweeperGrid(const int initialRows, const int initialCols, const int density){
if ((initialRows<5 || initialCols<5) || (density<25 || density>75)) {
throw out_of_range("Grid not large enough (number of rows or columns cannot be fewer than 5) or density is too low or high (must be between 25% and 75%)");
}

numRows = initialRows;
numColumns = initialCols;
numBombs = 0;

grid = new SweeperCell*[numRows];
for(int i=0; i <numRows; i++){
grid[i] = new SweeperCell[numColumns];
}

srand(time(0));
for(int i=0; i<numRows; i++){
for (int j=0; j<numColumns; j++){
if(rand()%100+1<=density){
PlaceBomb(i, j);
}
}
}
}

Вот функция PlaceBomb:

void SweeperGrid::PlaceBomb(int row, int col){
cout<<row<<", "<<col<<endl;

if ((row<0||row>=numRows)||(col<0||col>=numColumns)){
throw out_of_range("Out of bounds (PlaceBomb)");
}

At(row, col).PlaceBomb();
numBombs++;

//add if statements so it doesn't go out of bounds
if (row==0) {
At(row+1, col).IncrementNumAdjacent();
At(row, col-1).IncrementNumAdjacent();
At(row, col+1).IncrementNumAdjacent();
At(row+1, col+1).IncrementNumAdjacent();
At(row+1, col-1).IncrementNumAdjacent();
}

if (row==0&&col==0) {
At(row+1, col).IncrementNumAdjacent();
At(row, col+1).IncrementNumAdjacent();
At(row+1, col+1).IncrementNumAdjacent();
}

if (col==0) {
At(row-1, col).IncrementNumAdjacent();
At(row+1, col).IncrementNumAdjacent();
At(row, col+1).IncrementNumAdjacent();
At(row+1, col+1).IncrementNumAdjacent();
At(row-1, col+1).IncrementNumAdjacent();
}

if (row==numRows-1) {
At(row-1, col).IncrementNumAdjacent();
At(row, col-1).IncrementNumAdjacent();
At(row, col+1).IncrementNumAdjacent();
At(row-1, col-1).IncrementNumAdjacent();
At(row-1, col+1).IncrementNumAdjacent();
}

if (row==numRows-1&&col==numColumns-1) {
At(row-1, col).IncrementNumAdjacent();
At(row, col-1).IncrementNumAdjacent();
At(row-1, col-1).IncrementNumAdjacent();
}

if (col==numColumns-1) {
At(row-1, col).IncrementNumAdjacent();
At(row+1, col).IncrementNumAdjacent();
At(row, col-1).IncrementNumAdjacent();
At(row-1, col-1).IncrementNumAdjacent();
At(row+1, col-1).IncrementNumAdjacent();
}

if (row==0&&col==numColumns-1) {
At(row+1, col).IncrementNumAdjacent();
At(row, col-1).IncrementNumAdjacent();
At(row+1, col-1).IncrementNumAdjacent();
}

if (row==numRows-1&&col==0) {
At(row-1, col).IncrementNumAdjacent();
At(row, col+1).IncrementNumAdjacent();
At(row-1, col+1).IncrementNumAdjacent();
}

** IncrementNumAdjacent находится в другом файле, и я уверен, что он работает.

0

Решение

У тебя слишком много IncrementNumAdjacent звонки и некоторые из них могут быть вне диапазона.

Например:

if (row==0) {
At(row+1, col).IncrementNumAdjacent();
At(row, col-1).IncrementNumAdjacent();

что будет если col 0 в этот момент?

Вероятно, легче иметь safeIncrementNumAdjacent(int row, int col) метод в вашем SweeperGrid класс, который просто игнорирует предметы вне диапазона. Что-то вроде:

void SweeperGrid::safeIncrementNumAdjacent(int row, int col) {
if (row >= 0 && row < numRows && col >= 0 & col < numCols)
At(row, col).IncrementNumAdjacent();
}

затем просто назовите это для 8 мест вокруг текущей точки.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]