我已经通过这里的所有资料,我似乎无法发现我的错误。 我已经创建了一些要使用的结构,当试图操纵它们时,我得到了这个错误。任何建议都会得到满足!
这些是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);
提前致谢!
答案 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
}
因此,您应该将结构的定义移到函数之前,或者移动到头文件本身。
或者如果您希望结构作为不透明类型工作,因此您不希望公开定义它们,通常的方法是使用声明和带有定义的私有标头编写公共标头。