我在向结构体的成员写入1时遇到了一点问题。
我有一个结构,它表示一个体素,它可以有8个子元素(ID为0-7)。为了说明一个体素有哪些子元素,我使用了一个无符号的8位整数。如果体素具有某个子对象,则子对象成员中与该子对象ID相等的位置处的位设置为1。
例如,如果体素子成员存储值: 10000101,则体素将具有子对象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); }当所有体素第一次加载到内存中时,设置体素的子元素时没有错误。但是在那之后我就不能给成员写1了。0写得很好。我尝试过使用许多方法来写东西,甚至是对数字的简单的旧赋值。但是如果这个数字有更多的1,那么它就不会工作。
在这种情况下,指向父对象的指针存储为全局变量,并且每个体素也存储指向其子对象的指针,这会是问题所在吗?如果是这样的话,将父级作为引用传递会有帮助吗?我知道如何在C#中做到这一点,但在C++中却不知道。
任何帮助都是最好的。
S.
编辑:
使用下面的代码行调用add voxel方法:
addVoxel(octree, 4);八叉树是一个体素指针,定义如下:
Voxel* octree = octreeLoader.loadVoxelData();加载体素数据方法从文件加载八叉树信息。我们知道这个部分和返回指针工作,因为我们使用它们的精确副本来进行光线跟踪。不过,简而言之,指针是使用下面这行代码创建的:
Voxel* octree;然后使用下面这行代码分配内存:
octree = (Voxel *) calloc(1, sizeof(Voxel));然后使用下面的代码行指定子代:
octree[0].children = children;然后,以相同的方式创建每个子级并为其分配内存。我已经检查了子成员是否正确初始化以及childID是否正确。
发布于 2012-02-10 07:19:49
不知何故,你的父指针是无效的。否则,更改号码不会导致访问冲突。我猜你是用这些索引来遍历树的吧?您应该尝试使用像valgrind这样的工具。这可能会使调试变得更容易。
发布于 2012-02-10 21:39:23
你有没有试过用unsigned char代替char?这可能不是问题,但它可能是对征兆的补偿,做一些时髦的事情。您声明&=是有效的,但是assignment将不会赋值为1,它只会替换为0...所以它可能不会崩溃。使用|=将设置为1。你的状态0可以很好地工作,如果是这样的话,&=也会工作。
https://stackoverflow.com/questions/9220403
复制相似问题