Как решить эту ошибку?

Делаю игру "Сапер". Столкнулся с проблемой переполнения массива. Начал ограничивать изменения в координатах для счёта мин вокруг клетки.

Получился вот такой код:

char** countMines(char** field, int SIZE, int a, int b) {
	int mines = 0;
	
	//if chosen point is at the or at the corner end

	if (a != 0)
	{

		if (field[a-1][b-1] == char(206))
		{
			mines++;
		}
		if (field[a-1][b] == char(206))
		{
			mines++;
		}
		if (field[a - 1][b + 1] == char(206))
		{
			mines++;
		}
		if (field[a][b - 1] == char(206))
		{
			mines++;
		}
		if (field[a][b + 1] == char(206))
		{
			mines++;
		}
		if (field[a + 1][b - 1] == char(206))
		{
			mines++;
		}
		if (field[a + 1][b] == char(206))
		{
			mines++;
		}
		if (field[a + 1][b + 1] == char(206))
		{
			mines++;
		}
	}

	else if (a == 0 || b == 0)
	{
		if (field[a][b + 1] == char(206))
		{
			mines++;
		}
		if (field[a + 1][b] == char(206))
		{
			mines++;
		}
		if (field[a + 1][b + 1] == char(206))
		{
			mines++;
		}
	}
	else if (a == 0)
	{
		if (field[a][b - 1] == char(206))
		{
			mines++;
		}
		if (field[a][b + 1] == char(206))
		{
			mines++;
		}
		if (field[a + 1][b - 1] == char(206))
		{
			mines++;
		}
		if (field[a + 1][b + 1] == char(206))
		{
			mines++;
		}
		if (field[a + 1][b] == char(206))
		{
			mines++;
		}
	}
	
	else if (a == SIZE - 1 || b == SIZE - 1)
	{
		if (field[a - 1][b - 1] == char(206))
		{
			mines++;
		}
		if (field[a - 1][b] == char(206))
		{
			mines++;
		}
		if (field[a][b - 1] == char(206))
		{
			mines++;
		}
	}
	else if (a == SIZE - 1)
	{
		if (field[a - 1][b - 1] == char(206))
		{
			mines++;
		}
		if (field[a - 1][b] == char(206))
		{
			mines++;
		}
		if (field[a - 1][b + 1] == char(206))
		{
			mines++;
		}
		if (field[a][b - 1] == char(206))
		{
			mines++;
		}
		if (field[a][b + 1] == char(206))
		{
			mines++;
		}
	}
}


но когда я указываю клетку которая прикасается к нижнему краю программа закрывается и возвращает код -1073741819 .

Помогите пожалуйста.
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Перепишите этот ужас с нуля. Там невозможно найти ошибку.

Советую воспользоваться тем, что условные операторы вычисляются лениво: Если написать A && B и A окажется false, то B даже не будет вычисляться.

Так, проверка на клетку сверху может быть написана так:
if (i > 0 && a[i-1][j] - мина)

Так вся ваша простыня выродится в 8 последовательных проверок. Если меняются обе координаты, то надо через && объединить 3 условия - 2 на проверку невыхода за границы массива, и последнее - проверка значения массива.

Еще можно завести массив на SIZE+2 x SIZE+2 и заполнять его с (1, 1). Фактически, создается каемка вокруг исходного массива. И пробегаться по нему надо от 1 до SIZE. Так, вокруг всегда будут все 8 соседей. В этом подходе не придется проверять на выход за границы массива.

А еще можно вместо 8 if-ов сделать цикл на 8 итераций, если завести константы для приращений:
const int kDx[] = {1, 1, 1, 0, -1, -1, -1, 0};
const int kDy[] = {1, 0, -1, -1, -1, 0, 1, 1};


Теперь всех соседей можно перебрать как (i + kDx[k], j + kDy[k])
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@galaxy
Проверки на границы массивов кто будет делать?
Допустим, a = SIZE - 1. В первом if-блоке эта строчка какое поле проверяет:
if (field[a + 1][b - 1] == char(206))
?

Но вообще, т.к. тут идет только чтение, падение программы маловероятно. Вы где-то еще и пишите за границы массива, видимо.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы