首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++无法将%1写入结构成员

C++无法将%1写入结构成员
EN

Stack Overflow用户
提问于 2012-02-10 07:12:09
回答 2查看 314关注 0票数 1

我在向结构体的成员写入1时遇到了一点问题。

我有一个结构,它表示一个体素,它可以有8个子元素(ID为0-7)。为了说明一个体素有哪些子元素,我使用了一个无符号的8位整数。如果体素具有某个子对象,则子对象成员中与该子对象ID相等的位置处的位设置为1。

例如,如果体素子成员存储值: 10000101,则体素将具有子对象0、2和7(从右到左)。

Voxel结构的代码如下:

代码语言:javascript
复制
typedef struct Voxel {
       uint8_t children; //list of children
       Voxel* firstChildPointer;
};

第一个子对象指针指向体素列表的开始,其中体素是这个体素的子对象。

当想要添加子对象时,就会出现问题。我需要更改子代成员以反映添加的子代。然而,在这样做的时候,我得到了一个运行时异常,说“访问冲突写入位置”,后跟一个内存地址。

我用来更改子元素的代码如下:

代码语言:javascript
复制
void addVoxel(Voxel* parent, char childID) {
       parent->children |= (1 << childID); }

当所有体素第一次加载到内存中时,设置体素的子元素时没有错误。但是在那之后我就不能给成员写1了。0写得很好。我尝试过使用许多方法来写东西,甚至是对数字的简单的旧赋值。但是如果这个数字有更多的1,那么它就不会工作。

在这种情况下,指向父对象的指针存储为全局变量,并且每个体素也存储指向其子对象的指针,这会是问题所在吗?如果是这样的话,将父级作为引用传递会有帮助吗?我知道如何在C#中做到这一点,但在C++中却不知道。

任何帮助都是最好的。

S.

编辑:

使用下面的代码行调用add voxel方法:

代码语言:javascript
复制
addVoxel(octree, 4);

八叉树是一个体素指针,定义如下:

代码语言:javascript
复制
Voxel* octree = octreeLoader.loadVoxelData();

加载体素数据方法从文件加载八叉树信息。我们知道这个部分和返回指针工作,因为我们使用它们的精确副本来进行光线跟踪。不过,简而言之,指针是使用下面这行代码创建的:

代码语言:javascript
复制
Voxel* octree;

然后使用下面这行代码分配内存:

代码语言:javascript
复制
octree = (Voxel *) calloc(1, sizeof(Voxel));

然后使用下面的代码行指定子代:

代码语言:javascript
复制
octree[0].children = children;

然后,以相同的方式创建每个子级并为其分配内存。我已经检查了子成员是否正确初始化以及childID是否正确。

EN

回答 2

Stack Overflow用户

发布于 2012-02-10 07:19:49

不知何故,你的父指针是无效的。否则,更改号码不会导致访问冲突。我猜你是用这些索引来遍历树的吧?您应该尝试使用像valgrind这样的工具。这可能会使调试变得更容易。

票数 1
EN

Stack Overflow用户

发布于 2012-02-10 21:39:23

你有没有试过用unsigned char代替char?这可能不是问题,但它可能是对征兆的补偿,做一些时髦的事情。您声明&=是有效的,但是assignment将不会赋值为1,它只会替换为0...所以它可能不会崩溃。使用|=将设置为1。你的状态0可以很好地工作,如果是这样的话,&=也会工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9220403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档