【问题标题】:assignment from incompatible pointer type issues with dynamic stack in CC中动态堆栈的不兼容指针类型问题的赋值
【发布时间】:2016-12-14 17:31:23
【问题描述】:

我有两个主要问题。 我的代码是“元素”的堆栈(堆),由结构制成:

typedef struct etCel{
    element *ele;
    struct cel *suiv;   
} cel;

typedef cel* pile;

第一个问题是“isEmpty”函数,它会产生Segmentation fault:

int isEmpty(stack p){
    if(p->ele){
        return 0;
    }else{
        return 1;
    }
}

int affiche_pile(pile p){
    printf("Valeurs de la pile:\n");

    while(p->ele){
        affiche_element(p->ele);
        printf("\n");
        p=p->suiv;
    }

    return 1;
}

int pile_est_vide(pile p){
    if(p->ele){
        return 0;
    }else{
        return 1;
    }
}

pile push(stack p, element e){
    element *nvoele;
    nvoele = (element*)malloc(sizeof(element));
    stack ptmp = (stack)malloc(sizeof(cel));

    assert(ptmp);

    nvoele = &e;
    ptmp->ele = nvoele;
    ptmp->suiv = p; //ERROR HERE
    return ptmp;    
}

element pop(stack p){
    stack ptmp = init_stack();

    if(isEmpty(p) != 1){
        ptmp = p->suiv; //ERROR HERE
        free(p);
        return *(ptmp->ele);
    }else{
        printf("Erreur! La pile est vide!\n");
    }
}

int fill_stack(stack p, int q){
    element tmp = init_element();
    element *ptmp = &tmp;

    for(int i = 0; i < q; i++){
        input_element(ptmp);
        push(p, tmp);
    }

    return 1;
}

第二个问题是赋值问题,出现在其他函数比如这个“pop”函数中:

element pop(stack p){
    stack ptmp = init_stack();
    if(isEmpty(p) != 1){
        ptmp = p->suiv;
        free(p);
        return *(ptmp->ele);
    }else{
        printf("Erreur! La pile est vide!\n");
    }
}

它会产生这个错误:

警告:来自不兼容指针类型的赋值[由 默认] ptmp = p->suiv;

我确定这只是某种语法错误,感谢任何帮助,谢谢

---- 编辑: 这是元素的样子:

typedef struct etElement{
    float num;
} element;

element init_element(){
    element p;
    p.num=0.0;
    return p;
}

int affiche_element(element *p){
    printf("Valeur de l\'element:\n");
    printf("%f, ", p->num);
    printf("\n");
    return 1;
}

int affecte_element(element *p, float x){
    p->num = x;
    return 1;
}

int saisir_element(element *p){
    float x = 0;
    scanf("%f", &x);

    if(affecte_element(p, x)){
        return 1;
    } else { 
        return 0; 
    }
}

int compare_element(element *p, element *e){
    if(p->num > e->num){
        printf("%f > %f\n", p->num, e->num);
        return 3;
    }

    if(p->num == e->num){
        printf("%f = %f\n", p->num, e->num);
        return 2;
    }

    if(p->num < e->num) {
        printf("%f < %f\n", p->num, e->num);
        return 1;
    } else {
        return 0;
    }
}

还有一个最小的代码示例:

int main(){

    //Initialisation
    stack p = init_stack();

    if(isEmpty(p)==1){
        printf("Empty.\n");
    }else{
        printf("Not empty.\n");
    }

    element e = init_element();
    element *pele = &e;
    assign_element(pele,3.0);

    //Empilation
    if(push(p,e)){
        p=push(p,e);
    }else{
        printf("Echec de l\'empilation.\n");
    }

    show_stack(p);
}

这就是我正在编译的内容减去一些printfs

当我在这里时,这里是元素:

typedef struct etElement{
    float num;
} element;

【问题讨论】:

  • 这里有几个练习可以说明我刚才所说的:github.com/nbro/c-exercises
  • element 是什么?请出示minimal reproducible example
  • @JessicaChambers 请发布minimal reproducible example,这意味着暴露问题的最少代码,以便我们可以将其复制/粘贴到我们的计算机上,编译它并查看有什么问题。如果有任何意见,也请发表。
  • ...您发布的内容可能是最小,但不是完整。我们需要一些可以编译的东西,以便重现您遇到的相同情况。
  • 请发布所有您的代码,init_elementaffecte_elementempileaffiche_pile 仍然丢失。 Il faut vraiment vous Tirer les vers du nez.

标签: c pointers stack


【解决方案1】:

struct cel 未在任何地方定义。

typedef struct etCel{
    element *ele;
    struct cel *suiv;   // <<< this looks wrong to me
} cel;

不应该是:

typedef struct etCel{
    element *ele;
    struct etCel *suiv;   // <<< changement here
} cel;

【讨论】:

  • 似乎没有任何改变;即使我编译它,它也说它已经是最新的了
  • 您的构建系统有问题。您没有编辑正确的文件。可以发minimal reproducible example 吗?
猜你喜欢
  • 2011-02-04
  • 2014-12-14
  • 2021-06-07
  • 2019-08-09
  • 2012-03-13
  • 2017-03-26
  • 2021-04-07
  • 1970-01-01
  • 2011-09-01
相关资源
最近更新 更多