我在向结构成员写1时遇到了一些问题。
我有一个表示体素的结构,它可以有8个孩子(ID 0-7)。为了说明Voxel有哪些孩子我正在使用无符号的8位整数。如果体素有某个孩子,那么子成员中与孩子的ID相等的位置设置为1.
例如,如果Voxels子成员存储了值: 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写得很好。我已经尝试过使用很多方法来编写东西,甚至是一个简单的旧编号。但如果数字更多,那么它将不起作用。
碰巧在这种情况下指向父节点的指针存储为全局变量,并且每个体素也存储指向其子节点的指针,这可能是问题吗?如果是这样,将父母作为参考帮助传递?我知道如何在C#中执行此操作,但不能在C ++中执行此操作。
任何帮助都会很棒。
S上。
编辑:
使用以下行调用add voxel方法:
addVoxel(octree, 4);
octree是由以下定义的体素指针:
Voxel* octree = octreeLoader.loadVoxelData();
load voxel数据方法从文件加载八叉树信息。我们知道这部分和返回指针的工作原理是我们使用它们的精确副本来进行光线跟踪。但是,简而言之,使用以下行创建指针:
Voxel* octree;
然后使用此行分配内存:
octree = (Voxel *) calloc(1, sizeof(Voxel));
然后使用以下行分配孩子:
octree[0].children = children;
然后以相同的方式创建每个进一步的子项并给予记忆。我检查了子成员是否正确初始化,并且childID是正确的。
答案 0 :(得分:1)
您的父指针无效。否则,更改数字不会导致访问冲突。我猜你用这些索引遍历树?你应该尝试像valgrind这样的工具。它可以使调试更容易。
答案 1 :(得分:0)
您是否尝试使用unsigned char而不是char?这可能不是问题,但它可能是补偿标志,做一些时髦的事情。你声明&amp; =工作,然而,赋值将不会分配值1,它只会替换为0 ...所以它可能不会崩溃。使用| =设置为1。你说0的工作完全正常,如果是这样的话,&amp; =会起作用。
答案 2 :(得分:0)
你的问题充满了某种腐败:特别是你可以写出零而不是那些 - 这听起来好像你没有写到你认为你写的地方(某种填充或数据无论如何)原因应该是零)。在初始化体素之后,或者你不应该以这种方式修改这些数据。
您是否启用了所有可能的调试检查和保护?如果这是某种腐败,C Runtime可以帮助你很多
如果您已在启用所有调试选项的情况下运行,请在调试时注意以下值:
* 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory * 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers * 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory * 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger * 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files * 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory * 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory * 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash. * 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory * 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory
如果您看到使用这些值中的任何一个来代替有效数据,则出现问题
编辑:此外,您的问题很难确定:是否只有体素数据或是否有其他支持数据 - 例如某种指数或颜色/纹理坐标?如果写1让儿童崩溃,实际上绘制它们是否会导致使用/需要其他一些数据? (由于某种原因不可用)。如果你先禁用一个写零的孩子然后重新启用它,你会得到同样的崩溃吗?或者你只是因为以前根本不存在的孩子而遭遇崩溃?