我无法使此代码正常工作。当我尝试编译它时,会发生以下三种情况之一:要么我没有错误,但是当我运行程序时,它会立即锁定;或者它编译得很好,但是说“分段错误”并在我运行时退出;或者在编译时发出警告:
"conflicting types for ‘addObjToTree’
previous implicit declaration of ‘addObjToTree’ was here"
然后说“分段错误”并在我尝试运行时退出。
我使用的是Mac OS X 10.6。
游戏obj.h:
typedef struct itemPos {
float x;
float y;
} itemPos;
typedef struct gameObject {
itemPos loc;
int uid;
int kind;
int isEmpty;
...
} gameObject;
内部routines.h:
void addObjToTree (gameObject *targetObj, gameObject *destTree[]) {
int i = 0;
int stop = 1;
while (stop) {
if ((*destTree[i]).isEmpty == 0)
i++;
else if ((*destTree[i]).isEmpty == 1)
stop = 0;
else
;/*ERROR*/
}
if (stop == 0) {
destTree[i] = targetObj;
}
else
{
;/*ERROR*/
}
}
/**/
void initFS_LA (gameObject *target, gameObject *tree[], itemPos destination) {
addObjToTree(target, tree);
(*target).uid = 12981;
(*target).kind = 101;
(*target).isEmpty = 0;
(*target).maxHealth = 100;
(*target).absMaxHealth = 200;
(*target).curHealth = 100;
(*target).skill = 1;
(*target).isSolid = 1;
(*target).factionID = 555;
(*target).loc.x = destination.x;
(*target).loc.y = destination.y;
}
main.c中:
#include "game-obj.h"
#include "internal-routines.h"
#include <stdio.h>
int main()
{
gameObject abc;
gameObject jkl;
abc.kind = 101;
abc.uid = 1000;
itemPos aloc;
aloc.x = 10;
aloc.y = 15;
gameObject *masterTree[3];
masterTree[0] = &(abc);
initFS_LA(&jkl, masterTree, aloc);
printf("%d\n",jkl.factionID);
return 0;
}
我不明白为什么它不起作用。我只想让addObjToTree(...)
在masterTree的下一个空闲空间中添加一个指向gameObject的指针,这是一个指向gameObject结构的指针数组。甚至更奇怪,如果我从addObjToTree(target, tree);
删除行initFS_LA(...)
,它就能完美运行。我已经创建了一个按masterTree
搜索uid
的功能,即使我使用gameObject
初始化新的initFS_LA(...)
(没有addObjToTree
也可以正常工作我已经尝试重新排列头文件中的函数,将它们放入单独的头文件中,对它们进行原型设计,重新排列#include
的顺序,显式创建指针变量而不是使用&jkl
,但绝对没有用。有任何想法吗?我感谢任何帮助
答案 0 :(得分:0)
如果我看到这个,那么你不会在任何地方初始化masterTree
数组的元素1和2。然后,您的addObjToTree()
函数在--ininitialized - 数组中搜索一个自由元素。
在C中声明类似gameObject *masterTree[3];
的变量不会对数组进行零初始化。添加一些memset (masterTree, 0, sizeof (masterTree));
进行初始化。
请注意,您在这里声明了一个指向结构的指针数组,而不是结构数组(另请参阅here),因此您还需要调整addObjToTree()
以检查是否为NULL指针而不是isEmpty
。
将该数组的长度传递给该函数以避免缓冲区溢出也是一种好习惯。
如果你想要一个结构数组,那么你需要将它声明为gameObject masterTree[3];
,addObjToTree()
中的参数变为gameObject *tree
。