Я работаю над клоном майнкрафта C ++, в котором объекты Chunk хранят список указателей на соседние куски (соседи).Чанк может иметь максимум 6 соседей, но если у чанка нет соседа на одной стороне, элемент в массиве на этой стороне является nullptr.Куски имеют трехмерные массивы блочных структур, которые имеют один элемент данных: тип (int).Куски передают свои блоки и массив указателей на блоки своих соседей в средство визуализации:
Block (*neighbor_blocks[6])[CHUNK_SIZE][CHUNK_SIZE][CHUNK_SIZE];
for (int i = 0; i < 6; i++) {
if (neighbors[i] == nullptr) {
neighbor_blocks[i] = nullptr;
}
else {
neighbor_blocks[i] = &(neighbors[i]->blocks);
}
}
renderer.gen_buffer(blocks, neighbor_blocks);
Подпись вызываемого им метода выглядит следующим образом:
void BlockRenderer::gen_buffer(Block blocks[CHUNK_SIZE][CHUNK_SIZE][CHUNK_SIZE], Block (*neighbor_blocks[6])[CHUNK_SIZE][CHUNK_SIZE][CHUNK_SIZE]);
Я считаю, что это делает массив указателей на мои массивы 3D-блоков:
Block (*neighbor_blocks[6])[CHUNK_SIZE][CHUNK_SIZE][CHUNK_SIZE])
Чтобы проверить мой массив указателей, я сделал следующее:
if (neighbor_blocks[4] != nullptr) {
printf("%d\n", neighbor_blocks[4][0][0][0]->type);
}
Каждый элемент в массиве блоковинициализируется блоком, поэтому вызов блоков [0] [0] [0] для любого чанка не должен быть проблемой, и, как вы видели, каждый элемент neighbour_blocks был либо инициализирован с помощью nullptr, либо получил указатель на массив блоковкусокТем не менее, моя строка печати иногда приводит к этому исключению:
0xC0000005: Место чтения нарушения доступа 0x003F63D8.
Правильно ли мой метод сделать массив указателей на трехмерные массивы?Правильно ли я получаю доступ к данным?Иногда исключение не выдается, что говорит мне о том, что я обращаюсь не к той памяти, а иногда я могу получить доступ ко всему, к чему я обращаюсь, но иногда это не доступно для моей программы.