【问题标题】:Error invalid type argument of '->' (have 'tree')“->”的错误类型参数无效(有“树”)
【发布时间】:2016-03-21 13:24:14
【问题描述】:

我试图在我的树中插入节点,但我得到了错误

类型参数无效

#define info(p) (p)->info
#define left(p) (p)->left     //error here
#define right(p) (p)->right   // and here
#define root(t) (t).root
#define infoRoot(t) ((t).root)->info
#define nil NULL

typedef struct treenode *data;
typedef struct treenode {
    int info;
    data right;
    data left;
}node;
typedef struct{
    data root;
}tree;

当我尝试使用这个程序时:

void insert(tree *T,int x){
    //Kamus
    data baru;
    data bantu;

    //Algoritma
    baru = (data)malloc(sizeof(node));
    left(baru) = right(baru) = nil;
    info(baru) = x;

    bantu = root(*T);
    if(isEmpty(*T)){
        root(*T) = baru;
    }
    else if(bantu == nil){
        baru = bantu;
    }
    else{
        if(x < info(bantu)){
            bantu = left(bantu);
            insert(&left(*T),x);  
        }
        else{
            bantu = right(bantu);
            insert(&right(*T),x);
        }
    }
}

当我在列表中使用这样的代码时,它可以被编译,我是不是用指针做错了?

【问题讨论】:

  • 你为什么使用宏 - 并没有真正改进代码。
  • 你为什么要这样做?!?这如何使您的代码变得更难阅读!
  • 如果你给出完整的错误和它发生的行(并且你没有使用这些宏)会有所帮助,但是在快速浏览之后,你通过*T (a tree) 到 left()right() 宏中,这似乎需要一个指向 node 的指针。
  • lol '我认为通过使用宏可以帮助我们的代码易于使用'。请不要想太多。
  • 并且不要typedef指针。混淆语义(即降低代码的可读性)并且容易出错。

标签: c pointers


【解决方案1】:

使用gcc -E 对此代码运行预处理器会显示所做的替换可能会使这些错误更加清晰。

void insert(tree *T,int x){

    data baru;
    data bantu;


    baru = (data)malloc(sizeof(node));
    (baru)->left = (baru)->right = ((void *)0);
    (baru)->info = x;

    bantu = (*T).root;
    if(isEmpty(*T)){
        (*T).root = baru;
    }
    else if(bantu == ((void *)0)){
        baru = bantu;
    }
    else{
        if(x < (bantu)->info){
            bantu = (bantu)->left;
            insert(&(*T)->left,x);
        }
        else{
            bantu = (bantu)->right;
            insert(&(*T)->right,x);
        }
    }
}

如果T 是“指向树的指针”类型,那么(*T) 是“树”类型。所以(*T)-&gt;left 不起作用,因为-&gt; 运算符试图取消引用不是指针的(*T)

这里可能还有其他错误,但这应该可以帮助您解决问题。希望您能看到宏的使用如何使您的代码变得模糊,在这种情况下,如果您在代码主体中使用 -&gt;. 运算符而不是通过#define 指令。

【讨论】:

    猜你喜欢
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2013-08-04
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多