我有以下類似四叉樹的結構,其中每個單元可以是內部節點或葉。 如果它是一片葉子,它可以存儲一種顏色。 如果它是一個內部節點,它存儲的指針到四個孩子(其可以是葉或內節點):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