1

我无法让此代码正常工作。当我尝试编译它时,会发生以下三种情况之一:要么我不会出错,但是当我运行程序时,它会立即锁定;或者它会编译得很好,但是当我运行它时说“分段错误”并退出;或者在编译时给出警告:

"conflicting types for ‘addObjToTree’
previous implicit declaration of ‘addObjToTree’ was here"

但是然后说“分段错误”并在我尝试运行它时退出。

我在使用 gcc 的 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;

内部例程.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;

}

主.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(...)可以完美地工作。我已经创建了一个搜索的函数,masterTreeuid也可以正常工作,即使我gameObjectinitFS_LA(...)(不带addObjToTree行)初始化一个新函数。我已经尝试重新排列头文件中的函数,将它们放入单独的头文件中,对它们进行原型设计,重新排列#includes 的顺序,显式创建指针变量而不是使用&jkl,但绝对没有任何效果。有任何想法吗?我很感激任何帮助

4

1 回答 1

0

如果我没看错,那么您就不会在masterTree任何地方初始化数组的元素 1 和 2。然后,您的addObjToTree()函数在未初始化的数组中搜索一个空闲元素。

在 C 中声明变量gameObject *masterTree[3];不会对数组进行零初始化。添加一些memset (masterTree, 0, sizeof (masterTree));进行初始化。

请注意,您在这里声明的是指向结构的指针数组,而不是结构数组(另请参见此处),因此您还需要调整addObjToTree()以检查 NULL 指针而不是isEmpty.

将该数组的长度传递给该函数以避免缓冲区溢出也是一种好习惯。

如果你想要一个结构数组,那么你需要将它声明为,gameObject masterTree[3];并且你的参数addObjToTree()become gameObject *tree

于 2012-11-14T03:23:09.270 回答