2014-01-10 23 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

准确地说,你的大量代码在调试你的代码时会做些麻烦或没有帮助。 –

相关问题