Передача массива указателей в трехмерные массивы: исключение нарушения прав доступа (C ++) - PullRequest
0 голосов
/ 21 мая 2018

Я работаю над клоном майнкрафта 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.

Правильно ли мой метод сделать массив указателей на трехмерные массивы?Правильно ли я получаю доступ к данным?Иногда исключение не выдается, что говорит мне о том, что я обращаюсь не к той памяти, а иногда я могу получить доступ ко всему, к чему я обращаюсь, но иногда это не доступно для моей программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...