2014-01-10 54 views
0

我被要求完成其他人開始的某些代碼,而且我完全困惑於如何在結構體中複製U32值。這些是各種結構的相關部分;注意,我修了很多,因爲那些都是一些嚴重的巨大結構:嘗試從結構體中檢索U32時程序崩潰

typedef struct AttackerList { 
    U32 count; 
} AttackerList; 

typedef struct AggroVars { 
    AttackerList attackerList; 
} 

typedef struct Player { 
    U32 aiAttackers; 
} 

現在,在功能我想修改:

void attackTarget(Player* target) { 
    AggroVars* aiTarget; 
    // Tons of code here. 
    aiTarget->attackerList.count++; 
    target->aiAttackers = aiTarget->attackerList.count; 
    // Tons more code here. 
} 

最後一行是導致我的人各種悲傷。它確實有效,我可以在調試輸出中看到有多少生物正在攻擊播放器;但是隻要AI失去對目標的興趣,它就會導致崩潰。我知道這與指針有關,但在代碼上加星號會導致「無效間接」或「間接級別不同」。我幾乎不知道如何檢索aiTarget-> attackerList.count的值,而沒有任何怪異的指針。

+0

「對碼**灑星號**」是*不*有效的調試技術! –

+0

在沒有相關代碼的情況下調試指針的問題非常困難!你知道,_working example_的東西...(順便說一句,如果你的函數有**兩噸代碼**,太久無法發佈......我會重構一點點...) –

+1

檢查變量'target'或'aiTarget'在訪問該值之前爲NULL。這可能會幫助你得到答案。 – Srini

回答

0

而不是「灑星號」我建議在萬噸的代碼中,我們沒有看到後,這些變量初始化或修改灑斷言:

#include <assert.h> 

... 
assert (target != NULL); 
assert (aiTarget != NULL); 

這可能意味着你在正確的方向。

+0

有一個if(目標)非常靠近函數的頂部(基本上整個函數被包裹在if中)和一個if(aiTarget)在引用位之上幾十行。我**很確定**他們都被初始化並在調用這兩行時保存數據。爲了以防萬一,我會添加斷言。 – calmira

+0

@calmira您*必須*告訴我們'aiTarget'是如何初始化的。 – Jens

0

你需要先爲每個結構分配內存,從而在你的代碼做如下改變

void attackTarget(Player* target) 
{ 
    AggroVars* aiTarget = malloc(sizeof(AggroVars)); 

    aiTarget->attackerList.count++; 

    target->aiAttackers = aiTarget->attackerList.count; 

} 
+0

這是一個很大的猜測,有(引用)「噸代碼」(結束報價),我們沒有看到。我們可能認爲至少有分配。 –

+0

準確地說,你的大量代碼在調試你的代碼時會做些麻煩或沒有幫助。 –

相關問題