将指针指向不完整类型时出错,我无法弄清楚原因

时间:2016-07-28 08:48:22

标签: c compiler-errors

我已经通过这里的所有资料,我似乎无法发现我的错误。 我已经创建了一些要使用的结构,当试图操纵它们时,我得到了这个错误。任何建议都会得到满足!

这些是KDArray.c中定义的结构

    struct sp_kdarray_t
    {
        SPPoint* points;
        int** sorted;
        int rows;
        int size;
    };
    struct sp_kdarrays_t
    {
        SPKDArray kdLeft;
        int leftSize;
        int rightSize;
        SPKDArray kdRight;
    };

在KDArray.h中我们有:

    typedef struct sp_kdarray_t* SPKDArray;
    typedef struct sp_kdarrays_t* SPKDArrays;

现在,当我尝试在以下函数中操作它们(递归构建树)时:

    KDTreeNode recursiveTreeBuild(SPKDArray kdArr, int size, SP_TREE_SPLIT_METHOD spKDTreeSplitMethod, int splittingDimension)
    {

        int split;
        KDTreeNode result;

        result = (KDTreeNode)malloc(sizeof(KDTreeNode));
        if (result == NULL)
        {
            spLoggerPrintError("Memory Allocation ERROR", __FILE__, __func__, __LINE__);
            return NULL;
        }

        if (size == 1)
        {
            result -> dim = -1;
            result -> val = -1;
            result -> left = NULL;
            result -> right = NULL;
            result -> data = spKDArrayCopyPoint(kdArr, 0);
            if (result -> data == NULL)
            {
                spLoggerPrintError("Memory Allocation ERROR", __FILE__, __func__, __LINE__);
                return NULL;
            }
        }
        else
        {
            SPKDArrays subtrees;

            subtrees = spKDArraySplit(kdArr, splittingDimension);
            if (subtrees == NULL)
                return NULL;

            result -> dim = splittingDimension;
            result -> val = spKDArrayGetMedianValueByDimension(kdArr, splittingDimension);
            result -> data = NULL;
            switch (spKDTreeSplitMethod)
            {
                case MAX_SPREAD:
                    split = spKDArrayGetHighestSpread(kdArr);
                    if (split < 0)
                        return NULL;
                    break;
                case RANDOM:
                    srand(time(NULL));
                    split = rand() % spKDArrayGetDimensions(kdArr);
                    break;
                case INCREMENTAL:
                    split =  splittingDimension + 1;
                    break;
            }
            result -> left = recursiveTreeBuild(subtrees -> kdLeft, subtrees -> leftSize, spKDTreeSplitMethod, split);
            result -> right = recursiveTreeBuild(subtrees -> kdRight, subtrees -> rightSize, spKDTreeSplitMethod, split);
        }

        return result;
    }

我得到了#34;解除引用错误&#34; on:

            result -> left = recursiveTreeBuild(subtrees -> kdLeft, subtrees -> leftSize, spKDTreeSplitMethod, split);
            result -> right = recursiveTreeBuild(subtrees -> kdRight, subtrees -> rightSize, spKDTreeSplitMethod, split);

提前致谢!

1 个答案:

答案 0 :(得分:1)

您的错误发生是因为编译器找不到struct的定义。定义在那里,但它可能在错误的文件中或文件中的错误位置。您没有提供项目布局的详细信息,因此我无法确定详细信息......

例如,以下代码将触发相同的错误:

typedef struct foo_t* Foo;

void something1(Foo p)
{
    p->whatever; // error: incomplete type!
}
struct foo_t // type definition
{
    int whatever;
};
void something2(Foo p)
{
    p->whatever; // ok: the type is complete
}

因此,您应该将结构的定义移到函数之前,或者移动到头文件本身。

或者如果您希望结构作为不透明类型工作,因此您不希望公开定义它们,通常的方法是使用声明和带有定义的私有标头编写公共标头。