2016-07-28 3 views
0

私はすべての資料をここに入れてしまいました。 使用する構造体をいくつか作成しましたが、操作しようとするとこのエラーが発生します。どんな助言も謝罪されるでしょう!不完全な型へのポインタの逆参照中にエラーが発生しました。理由はわかりません

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.c

で定義され、KDArray.hに我々が持っているように、これらの構造体です:

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

今、私は(再帰的にツリーを構築する)それらを操作しようとする中次の関数:

012:

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; 
    } 

私は "逆参照エラー" を取得

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

ありがとうございます!

+0

「KDTreeNode」とは何ですか?それはポインタのtypedefですか? – LPs

+0

"デバッグのヘルプを求める質問(「なぜこのコードは動作しないのですか?」)には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。最小、完全、および検証可能な例**](http://stackoverflow.com/help/mcve)」を参照してください。 –

+0

原則として、ヘッダファイルに構造体を定義する必要があります。 – immibis

答えて

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 
} 

だから、あなたが移動する必要があります:私は詳細を確認することはできませんので、あなたは

たとえば、次のコードがトリガされます...同じエラーがプロジェクトのレイアウトの詳細を与えることはありません。関数の前の構造体の定義、またはヘッダーファイルそのものへの変換を行います。

構造体が不透明な型として動作するようにするために、構造体をパブリックに定義したくない場合は、宣言を含むパブリックヘッダと定義を含むプライベートヘッダを記述します。

+0

@LP:うーん...本当。しかし、 'KDTreeNode'が不完全な型だったので、OPで指摘されたものよりも前に多くのエラーがあったので、私は他の構造体を見ていました。 – rodrigo

+0

皆さん、ありがとうございました!@rodrigoプロジェクトのレイアウトについていくつかの情報を提供します:だから、spKDArraySplit()が実装されているファイルであるKDArray.cと両方の構造体が実装されています。これにはKDArray.hが含まれています。これらの構造体の両方の "typedef"は関数プロトタイプ(spKDArraySplit()を含む)と同様に定義されています。 RecursiveBuild()はKDTree.cに実装されています.KDTree.hにはKDArray.hが含まれています。 – doria90

+0

@ doria90: 'RecursiveBuild()'は 'KDTree.c'にあり、' KDTree 'が含まれています。 typedefの宣言(不完全な型へのポインタ)ではhは定義されていますが、定義はありません。これらは 'KDArray.c'にあるので、' KDTree.c'からは見えません!構造体定義を 'KDArray.h'に移動するだけで動作します。 – rodrigo

関連する問題