0

したがって、これを実行すると、「51行目: エラー: 不完全な型へのポインターを逆参照しています」というメッセージが表示されます。

int main(void)
{
  Tree * testTree;

  testADT * data1;

  testTree = createTree(compare,destroy);

  data1 = malloc(sizeof(testADT));

  data1->val = 10;

  /* Line 51 */ addToTree(testTree,testTree->root,data1);

  destroyBinTree(testTree);

  return(0);
}

私のaddToTreeFunction:

TreeNode * addToTree(Tree * theTree,TreeNode * theTreeNode, TreeDataTypePtr data)
{
TreeNode * newNode;
if(isEmpty(theTree))
{
    newNode = malloc(sizeof(TreeNode));
    newNode->height = 0;
    newNode->data = data;

    theTree->root = newNode;
    return theTree->root;
}else{
    if(theTree->compare(theTreeNode->data,data) == 1) /* shows root data is smaller */
    {
        theTreeNode->right = addToTree(theTree,theTreeNode->right,data);
    }else 
    if(theTree->compare(theTreeNode->data,data) == 0) /* shows root data is larger */
    {
        theTreeNode->left = addToTree(theTree,theTreeNode->left,data);
    }
}
return theTreeNode;
}

私のtypedefと構造体:

struct tADT{
int val;
};

typedef struct tADT testADT;

typedef void * TreeDataTypePtr;

誰が何が起こっているのかについての洞察を提供できますか? 前もって感謝します!

編集:これは私のモジュール(.c)にあります

struct AvlNode{
void * data;
struct AvlNode * left;
struct AvlNode * right;
int height;
};


struct AvlTree{
int (*compare) (TreeDataTypePtr data1, TreeDataTypePtr data2);
void (*destroy) (TreeDataTypePtr data);
struct AvlNode * root;
};

これはヘッダーにあります (.h)

struct AvlTreeNode;
struct AvlTree;

typedef struct AvlTree Tree;
typedef struct AvlNode TreeNode;
typedef void * TreeDataTypePtr;

ヘッダーですべての構造体/typedef を定義することにより、問題が修正されました。

typedef struct AvlTree Tree;
typedef struct AvlNode TreeNode;
typedef void * TreeDataTypePtr;

struct AvlNode{
void * data;
struct AvlNode * left;
struct AvlNode * right;
int height;
};


struct AvlTree{
int (*compare) (TreeDataTypePtr data1, TreeDataTypePtr data2);
void (*destroy) (TreeDataTypePtr data);
struct AvlNode * root;
};
4

3 に答える 3

1

ヘッダー ファイルのどこかに「ツリー」を定義していますか? 失敗したモジュールの 51 行目でそのヘッダーを確認できますか?

「ツリー」を定義する必要があります:)

===================== 補遺 ====================

ツリーの「定義」で投稿を更新していただきありがとうございます。

// .h file
struct AvlTreeNode;
struct AvlTree;
typedef struct AvlTree Tree;
...

しかし、事実は残ります-これらは両方とも「不完全なタイプ」です。

「モジュール(.c)で」AvlTreeとAvlTreeNodeを定義したと言います。

Q:どの.c 翻訳単位ですか?

Q: 使用する前にその翻訳単位で定義されていますか?

Q:他の翻訳単位で使用されていますか?

Q: typedef エイリアスが重複/冗長/紛らわしいのはなぜですか?

Q: 念のため、.h ファイルで定義しないのはなぜですか?

于 2012-11-28T04:59:02.047 に答える
1

testTree->rootどこにも定義されていないtestTreetype のdereferences 。Tree

于 2012-11-28T04:59:55.917 に答える
1

このエラーは、 の前方宣言があることを示唆していますが、Tree対応する構造の完全な定義はありません。そのため、 へのポインターを宣言できますがTree、そのメンバーを逆参照することはできません。

を含むコンパイル ユニットの先頭に、 の定義を含むヘッダー ファイルがあることを確認してください。これによりmain、この問題が修正されます。#includestruct Tree

于 2012-11-28T05:00:29.617 に答える