У меня небольшая проблема с записью 1 для члена структуры.
У меня есть структура, которая представляет Voxel, который может иметь 8 дочерних элементов (идентификаторы 0-7).Чтобы указать, у каких детей есть Voxel, я использую 8-разрядное целое число без знака.Если у Voxel есть определенный дочерний элемент, то бит в позиции дочернего элемента, равный идентификатору дочернего элемента, устанавливается равным 1.
Например, если дочерний элемент Voxels сохранил значение: 10000101 Тогда Voxelбудет иметь детей 0, 2 и 7 (справа налево).
Код структуры Voxel выглядит следующим образом:
typedef struct Voxel {
uint8_t children; //list of children
Voxel* firstChildPointer;
};
Первый дочерний указатель указывает на начало спискавокселей, которые являются вокселями дочерних элементов.
Проблема возникает при желании добавить дочернего элемента.Мне нужно изменить член детей, чтобы отразить добавленного ребенка.Однако при этом я получаю исключение времени выполнения, в котором говорится «Место записи нарушения доступа», за которым следует адрес памяти.
Код, который я использую для изменения дочерних элементов, приведен ниже:
void addVoxel(Voxel* parent, char childID) {
parent->children |= (1 << childID); }
Когдавсе Voxels сначала загружаются в память, дочерние элементы Voxel устанавливаются без ошибок.Но после этого я не могу написать 1 для участника.0 пишут отлично.Я пытался использовать много методов, чтобы написать вещи, даже простое старое присвоение номера.Но если число имеет больше 1, то оно не будет работать.
Так получилось, что указатель на родителя в этом случае сохраняется как глобальная переменная, и каждый воксель также хранит указатель на своих потомков,может ли это быть проблемой?Если так, то передача родителя в качестве справки поможет?Я знаю, как сделать это в C #, но не в C ++.
Любая помощь будет отличной.
S.
РЕДАКТИРОВАТЬ:
Добавить воксельметод вызывается с использованием этой строки:
addVoxel(octree, 4);
octree - это указатель вокселя, как определено:
Voxel* octree = octreeLoader.loadVoxelData();
Метод загрузки данных вокселя загружает информацию о октрее из файла.Мы знаем, что этот раздел и указатель возврата работают, поскольку мы используем их точную копию для трассировки лучей.Однако, вкратце, указатель создается с использованием этой строки:
Voxel* octree;
, а затем назначается память с использованием этой строки:
octree = (Voxel *) calloc(1, sizeof(Voxel));
Затем дочерние элементы назначаются с использованием этой строки:
octree[0].children = children;
Каждый следующий потом создается таким же образом и получает память.Я проверил, что дочерний элемент инициализирован правильно, а childID верен.