2016-12-14 9 views
0

私には2つの大きな問題があります。 マイコードはように構造体で作られた「要素」のスタック(積み重ね)、である。Cの動的スタックと互換性のないポインタ型の問題からの割り当て

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

typedef cel* pile; 

最初の問題は、セグメンテーション障害を発生「のisEmpty」機能である:

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; 
} 
それは、このエラーを生成

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

第二の問題は、この「ポップ」機能などの他の機能で発生する割り当ての問題であり、

warning: assignment from incompatible pointer type [enabled by default] ptmp = p->suiv; I'm sure it's just some kind of syntax error, any help is appreciated, thanks

----編集:

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; 
+0

第一の問題点について。ポインタを初期化する必要があります。それ以外の場合はポインタをゴミに設定します。 'p-> elem'はおそらく初期化されていません。また、ポインタ 'typedef cel * pile'を初期化したと仮定します。また、パラメータとして値を受け取る関数 'pile_est_vide'が宣言されていることにも注意してください。それは意図的なのでしょうか? – nbro

+0

@nbro私の主な機能ではパイルは初期化されていますが、なぜ最初の問題でp-> elemを初期化する必要がありますか? NULLであるかどうかをチェックしているので、 –

+0

Cでは、「すべて」を手動で行う必要があります。構造体にポインタが含まれている場合、その構造体の変数を作成すると、ポインタはNULLに初期化されず、 "所有していない"メモリのある領域を指します。通常のプログラミング方法は、少なくとも私がこれらの場合に行うことですが、私の構造体を明確な状態に初期化する関数を持たせることです。 – nbro

答えて

0

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; 
+0

何も変更されていないようです。私がそれをコンパイルしても、それはすでに最新であると言います –

+1

あなたのビルドシステムに問題があります。正しいファイルは編集しないでください。あなたは[mcve]を投稿できますか? –

関連する問題