2016-12-14 11 views
0

У меня две основные проблемы. Мой код стека (сваи) из «элементов», сделанных с помощью структуры, как так:назначение из проблем несовместимого типа указателя с динамическим стеком в 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

---- Edit: Вот что элемент выглядит следующим образом:

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]? –