我有以下类似四叉树的结构,其中每个单元可以是内部节点或叶。 如果它是一片叶子,它可以存储一种颜色。 如果它是一个内部节点,它存储的指针到四个孩子(其可以是叶或内节点):quadTree与union的问题
class RenderBucketCell{
public:
RenderBucketCell();
RenderBucketCell(float R, float G, float B, float A, unsigned short X, unsigned short Y);
~RenderBucketCell();
void split();
void collapse();
bool isLeaf;
RenderBucketCell* neighbours[8];
unsigned short x;
unsigned short y;
union{
struct{
float r;
float g;
float b;
float a;
};
struct{
RenderBucketCell* children[4];
};
};
};
如果单元是内节点,那么它不需要存储颜色。如果它是一片叶子,那么它不需要存储指向儿童的指针。因此,颜色和孩子应该共享相同的内存(联合)
有一个函数split()将一个叶转换为一个内部节点,并为当前单元具有的相同颜色的子元素(叶子)创建片刻:
void RenderBucketCell::split(){
isLeaf=false;
float rt = r;//make backups of the values before setting the children (union)
float gt = g;
float bt = b;
float at = a;
unsigned short xt2 = x*2;
unsigned short yt2 = y*2;
children[0] = new RenderBucketCell(rt,gt,bt,at, xt2, yt2);
children[1] = new RenderBucketCell(rt,gt,bt,at, xt2+1, yt2);
children[2] = new RenderBucketCell(rt,gt,bt,at, xt2, yt2+1);
children[3] = new RenderBucketCell(rt,gt,bt,at, xt2+1, yt2+1);
}
现在我正在调试split()函数。我所以现在在该行
children[0] = new RenderBucketCell(rt,gt,bt,at, xt2, yt2);
调试点: 调试器停在这条线,我观察membervalues。我做了一个程序步,这样该行被执行(指令光标现在在下一行)。行被执行后,children [0]的pointervalue仍然是一样的!相反,儿童[2]的指针值已经改变(与浮点值b一起)
有人可以解释我这种行为吗?我究竟做错了什么?
谢谢!
有没有可能'RenderBucketCell'构造函数可能调用'split()'? (我认为不是,但最好检查一下。) – dave4420 2009-11-20 16:57:37
哎Dave no - 构造函数只是为字段r,g,b,a,isLeaf,neighbors设置默认值[8],x和y – Mat 2009-11-20 17:14:42
此时,它是值得问一下你使用的编译器和调试器,因为你的代码看起来不错。 Split()是否在与RenderBucketCell的其余部分分开的文件中实现?它似乎使用不同的整数/指针大小或对齐方式。 – Joh 2009-12-06 11:16:27