我在将 1 写入结构的成员时遇到一点问题。
我有一个代表体素的结构,它可以有 8 个 child (ID 0-7)。为了说明体素有哪些 child ,我使用了一个无符号的 8 位整数。如果 Voxel 有某个 child ,则 child 成员中等于 child ID 的位置的位设置为 1。
例如,如果 Voxels 子成员存储值: 10000101 然后体素将有 child 0、2 和 7(从右到左)。
体素结构的代码如下:
typedef struct Voxel {
uint8_t children; //list of children
Voxel* firstChildPointer;
};
第一个子指针指向体素列表的开始,这些体素是这个体素的 child 。
问题出现在想添加 child 的时候。我需要更改 children 成员以反射(reflect)添加的 child 。但是,在执行此操作时,我收到运行时异常,提示“访问冲突写入位置”后跟内存地址。
我用来改变 child 的代码如下:
void addVoxel(Voxel* parent, char childID) {
parent->children |= (1 << childID); }
当所有 Voxel 首次加载到内存中时,Voxel 的子项设置无误。 但在那之后我不能给成员写 1。 0 写得很好。我尝试过使用多种方法来写东西,甚至是对数字进行简单的旧赋值。但是,如果该数字有更多的 1,那么它将不起作用。
在这种情况下,指向父对象的指针碰巧存储为全局变量,并且每个体素还存储指向其子对象的指针,这可能是问题所在吗?如果是这样,将 parent 作为引用有帮助吗?我知道如何在 C# 中执行此操作,但在 C++ 中不知道。
任何帮助都会很棒。
S.
编辑:
使用此行调用添加体素方法:
addVoxel(octree, 4);
八叉树是一个体素指针,定义如下:
Voxel* octree = octreeLoader.loadVoxelData();
加载体素数据方法从文件中加载八叉树信息。我们知道这部分和返回指针起作用,因为我们使用它们的精确拷贝来进行光线追踪。但是简而言之,指针是使用这一行创建的:
Voxel* octree;
然后使用这一行分配内存:
octree = (Voxel *) calloc(1, sizeof(Voxel));
然后使用此行分配子项:
octree[0].children = children;
然后以相同的方式创建每个进一步的 child 并给予内存。我已经检查了 children 成员是否已正确初始化并且 childID 是否正确。
最佳答案
不知何故,您的父指针无效。否则更改数字不会导致访问冲突。我猜你使用这些索引来遍历树?你应该尝试像 valgrind 这样的工具。它可能会使调试更容易。
关于C++ 无法将 1 写入结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9220403/