tiles[x][y+1]
, если y
является максимально допустимым значением, не будет NULL
, кроме как по милости. Это выходит за пределы, и как только вы выходите за пределы, все ставки прекращаются. Вы вызвали Неопределенное поведение , и почти все может произойти. Даже то, что вы ожидали.
То же самое относится к сообщенному сайту аварии, tiles[x - 1][y - 1]
.
Редактировать: опущено решение. Не полезно.
Единственный способ, кроме взятия и сброса всего сайта с орбиты, - это проверить индекс, чтобы убедиться, что он не пробивает границы массива перед использованием индекса в массиве. Возможно, вы захотите, чтобы функция справилась с этим.
void assign_if(Type & neighbour, int x, int y)
{
if(x >= 0 && x < width && y >= 0 && y < height)
neighbour = tiles[x][y];
}
и назовите это
assign_if(neighbours[0], x, y+1);
и позже
assign_if(neighbours[0], x-1, y-1);
Редактировать: украсть это у Боба для полноты
Невозможно вернуть необработанный массив из функции. Массив выходит из области видимости и указатель на него становится недействительным. Либо передайте массив в качестве другого параметра, либо используйте std::array
или std::vector
, оба из которых могут быть возвращены. Благодаря Copy Elision интеллектуальный компилятор, вероятно, уменьшит затраты на копирование.
Пример: * 1 034 *
std::array<Tile::Type, 8> TileManager::GetNeighbours(int x, int y)
{
std::array<Tile::Type, 8> neighbours;
...
return neighbours;
}
Редактировать по оригинальному постеру. Вот мое решение:
std::array<Tile::Type, 8> TileManager::GetNeighbours(int c, int r)
{
std::array<Tile::Type, 8> neighbours;
const int y[] = { -1, -1, -1, 1, 1, 1, 0, 0 };// 8 shifts to neighbors
const int x[] = { -1, 0, 1, -1, 0, 1, -1, 1 };// used in functions
for (int i = 0; i < 8; ++i)// visit the 8 spaces around it
if (inField(r + y[i], c + x[i]))
neighbours[i] = tiles[r + y[i]][c + x[i]];
else
neighbours[i] = Tile::Type::Void;
return neighbours;
}
bool TileManager::inField(int r, int c)
{
if (r < 0 || r >= 25) return false;
if (c < 0 || c >= 25) return false;
return true;
}
Редактировать: Предостережение
Этот ответ непосредственно касается решения поставленной задачи. Смотрите ответ Kaz для описания более практичного решения, которое торгует немного памяти, чтобы полностью исключить необходимость тестирования и генерации массива neighbours
.