Fehler : inkompatibler Zeigertyp



  • #include "PrioQueue.h"
    
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct q_elem_s
    {
            int priority;
            int value;
            struct q_elem_s *next;
    } q_elem;
    
    struct PrioQueue
    {
            int size;
            q_elem *root;
            //q_elem *tail;
    };
    
    PrioQueue* pqueue_new()
    {
            PrioQueue *q = (PrioQueue*) malloc(sizeof(PrioQueue));
            if( q == NULL){
            printf("not enough free memory to allocate proper size of bytes.");
            exit(0);
            }
            q->root = NULL;
           // q->tail = NULL;
            return q;
    }
    
    void pqueue_free(PrioQueue *queue)
    {
            for(int size = queue->size; size < 0 ; size-- ){
                    q_elem *current = queue->root;
                    for(int i = size; i>0 ; i--){
                            current = current->next;
                    }
                    free(current);
            }
            free(queue);
    }
    

    error: assignment from incompatible pointer type [-Werror]
    current = current->next;
    (in pqueue_free )

    Hallo !
    Ich sitze nun seit 3-4 Tagen an ein und demselben Fehler.
    normalerweise weiß ich wie ich den Fehler inkompatibler Zeigertyp behebe, jedoch verstehe ich nicht, warum ich hier einen solchen Fehler erhalte...
    da sowohl current als auch current->next jeweils vom typ "q_elem" sind ...

    ich erhalte den fehler des öfterem im programm, jedesmal sobald ich ein "<name> = <name>->next" benutze...

    da ich denke, dass daher mein fehler irg.wo in den structs versteckt liegt, habe ich die mit kopiert, der head includiert nur als einziges relevantes : "typedef struct PrioQueue PrioQueue;

    Für irg.welche Tips wäre ich durchaus dankbar ! 😃
    Lars


  • Mod

    Bitte ein bis auf den Fehler compilierbares Minimalbeispiel bringen. Dein Code erzeugt allerlei Fehler, weil du anscheinend einen C++-Compiler für deinen C-Code benutzt (und dabei ein paar C++-Features nutzt), aber wenn man diese behebt, dann ist der von dir beschriebene Fehler nicht nachvollziehbar.

    Denk dran, dass in C nach einer Definition

    struct foo
    {
    // ...
    };
    

    kein Typ mit Namen foo existiert, sondern nur einer mit Namen struct foo .



  • Ich hatte die PrioQueue.h die ich zum Anfang includiert habe als vorgabe.
    in dieser ist die Zeile

    typedef struct PrioQueue PrioQueue;

    enthalten.
    daher ist das "struct" nicht das problem denke ich.
    (habs aber vorher auch schon ausprobiert gehabt. )

    ich erhalte folgende ausgabe vom gcc - compiler mit den zu sehenden Flags :
    http://fs2.directupload.net/images/150430/m94ak8rt.png

    das ist aber auch die einzige ausgabe, die ich bisher hatte 😞
    wäre gut, wenn jemand mir da noch nen weiteren hinweis zu geben könnte.

    mfg Lars


  • Mod

    Wie man Probleme nachvollziehbar macht

    Der von dir gezeigte Code + deine Korrektur:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct q_elem_s
    {
            int priority;
            int value;
            struct q_elem_s *next;
    } q_elem;
    
    struct PrioQueue
    {
            int size;
            q_elem *root;
            //q_elem *tail;
    };
    
    typedef struct PrioQueue PrioQueue;
    
    PrioQueue* pqueue_new()
    {
            PrioQueue *q = (PrioQueue*) malloc(sizeof(PrioQueue));
            if( q == NULL){
            printf("not enough free memory to allocate proper size of bytes.");
            exit(0);
            }
            q->root = NULL;
           // q->tail = NULL;
            return q;
    }
    
    void pqueue_free(PrioQueue *queue)
    {
            for(int size = queue->size; size < 0 ; size-- ){
                    q_elem *current = queue->root;
                    for(int i = size; i>0 ; i--){
                            current = current->next;
                    }
                    free(current);
            }
            free(queue);
    }
    

    Dieser Code lässt sich einwandfrei (mit C99) übersetzen. Ganz sicher auch bei dir. Wie sollen wir dir helfen, wenn du uns nicht den Code zeigst, der den Fehler erzeugt?

    PS: Dein Bild mit den Fehlermeldungen (Copy & Paste wäre übrigens besser als ein Bild) enthält persönliche Informationen.



  • Hier nun der rest meines Codes :

    int pqueue_offer(PrioQueue *queue, int priority, int value)
    {
            if( queue == NULL ){
                    return -1;                                                     //sollte es keine queue geben, wird -1 returned.
            }
            q_elem *current = queue->root;
            q_elem *tail = queue->tail;
            if( current == NULL ){                                                 //für den fall, dass die queue leer sein sollte.
                    q_elem *new = malloc(sizeof(q_elem));                          //erstellt neues elem mit geg Werten und alloziert dafür speicher
                    new->value = value;
                    new->priority = priority;
                    queue->root = new;                                             //sagt das neues elem das neue rootelement sein soll.
                    (queue->size)++;                                               //ein elem mehr in queue, daher queue->size +1
                    return value;                                                  //returned den value
         /*   } else if(tail->priority >= priority) {                                //wenn das tail element eine höhere priorität hat, als das einzufügende elem
                    q_elem *new = malloc(sizeof(q_elem));                          //muss das einzufügende elem das letzte elem der queue werden.
                    tail->next = new;                                              //da dieses elem dann das letzte ist, wird der globale tailpointer auf das neue
                    new->value = value;                                            //elem gesetzt. Mem alloc. & data transfered btw.
                    new->priority = priority;
                    queue->tail=new;
                    (queue->size)++;                                               //ein elem mehr in queue, daher queue->size +1
                    return value;  */                                                //returned den value
            } else {
                    q_elem* finder = queue->root;                                  //fals priorität nicht die kleinste ist.
                    int counter = 0;
                    while ( finder != NULL ) {                                     //nach ausführen der schleife ist finder das erste element mit niedrigerer
                            if ( finder->priority > priority ){                    //priorität als die einzufügende priorität. es ist das "counter"ste element.
                                    finder = finder->next;                         //das neue Element muss zwischen dem "counter-1"tem und dem "counter"stem element
                                    counter++;                                     //eingefügt werden.
    							} else {
                                    break;
                            }
                    }
                    for( int i = counter;i > 1; i--){                              //ist dazu da, current zum letzten Element werden zu lassen, dass eine
                            current = current->next;                               //höhere prio. hat als das einzufügende Element
                    }
                    q_elem* new = malloc(sizeof(q_elem));                          //alloziiert genug speicher für ein neues queue element
                    new->next = finder;                                            //reiht new ein: current->new->finder , damit ist new zwischen dem "counter-1" & "counter"
                    if (current == finder){                                        //SONDERFALL!! da current nur dann gleich finder ist, wenn das neue elem die höchste
                            queue->root = new;                                     //prio in der gesamten queue hat, wird dann new zum neuen root und current wird irrelevant
                    } else {
                            current->next = new;
                    }
                    new->value = value;
                    new->priority = priority;
                    (queue->size)++;                                               //ein elem mehr in queue, daher queue->size +1
                    return value;
            }
    }
    
    int pqueue_peek(PrioQueue *queue)
    {
            if ( queue->root == NULL ){                                            //error abfangen, wenn keine queue vorhanden
                    return -1;
            } else {
                    return queue->root->value;
            }
    }
    
    int pqueue_poll(PrioQueue *queue)
    {
            if ( queue->root == NULL ){
                    return -1;
            } else {
                    q_elem *current = queue->root;                                 //erstes elem selectieren
                    int value = current->value;                                    //value extren saven
                    queue->root = current->next;                                   //das zweite element zum ersten innerhalb der queue machen
                    free(current);                                                 //das nun zu löschende elem durch freen des speichers komplett löschen
                    (queue->size)--;                                               //ein elem weniger, daher size der queue einen weniger
                    return value;                                                  //die zuvor gesavten daten returnen.
            }
    }
    
    int pqueue_size(PrioQueue *queue)
    {
            if ( queue->root == NULL ){                                            //error abfangen, wenn keine queue vorhanden
                    return -1;
            } else {
                    return queue->size;
            }
    }
    
    void pqueue_print(PrioQueue *queue)
    {
            if ( queue == NULL ){                                                  //error abfangen, wenn keine queue vorhanden
                    printf("error : no queue initialised yet.");
            } else if ( queue->root == NULL ){
                    printf("this queue doesn´t contains any elements.");           //error abfangen, wenn queue leer ist und trotzdem geprintet werden soll.
            } else {
                    q_elem *current = queue->root;
                    while ( current != NULL ){
                            printf("(%d,%d)",current->priority, current->value);
                            current = current->next;
                    }
            }
    }
    
    void pqueue_apply(PrioQueue *queue, void (*func)(const int *, const int *))
    {
            q_elem *current;
            for (current = queue->root; current != NULL; current = current->next)
            {
                    func(&current->priority, &current->value);
            }
    }
    

    da die fehlermeldung, die ich oben bereits beschrieben hatte, sich durch das ganze programm durchzieht, dachte ich, dass es reichen würde nur eine der funktionen zu nutzen.

    normalerweise tritt sie nur auf, wenn man bspw. versucht intpointer = charpointer oder irgwie sowas in die richtung.

    jedoch verstehe ich die fehlermeldung an dieser stelle nicht, da ja in diesem konkreten bsp q_elem = q_elem ...


  • Mod

    Den Link in meinem vorherigen Beitrag habe ich nicht zum Spaß gepostet. Du machst gerade genau das Gegenteil von dem was ich und der Link beschrieben haben: Du postest immer mehr und mehr irrelevanten Code, anstatt mal irgendwie deinen Fehler nachvollziehbar zu machen. So kann man dir nicht helfen.



  • Du machst gerade genau das Gegenteil von dem was ich und der Link beschrieben haben: Du postest immer mehr und mehr irrelevanten Code, anstatt mal irgendwie deinen Fehler nachvollziehbar zu machen.

    wieso ist mein letzter code denn irrelevant ?
    laut meinem compileroutput ( http://fs2.directupload.net/images/150430/m94ak8rt.png ) habe ich in JEDER dieser Functionen ein und denselben Fehler gemacht, daher sollten eigentlich auch alle von Interesse sein.

    der compileroutput liefert, dass in allen Funktionen der "Fehler : Zuweisung von inkompatiblem Zeigertyp [-Werror]" ausgegeben wird.

    um meine frage nun nochmal so explizit auszudrücken wie möglich:
    Warum bekomme ich die Fehlermeldung in JEDER meiner Funktionen ?

    Es ist nicht so, dass ich nicht wüsste, wie ich einen inkompatiblen Zeigerfehler im normalfall lösen müsste, aber wie bereits beschrieben, verstehe ich dieses mal nicht, warum der Fehler auftritt, da es keine typkonvertierungen gibt.



  • Du präsentierst kein minimal compilierbares Beispiel.
    Halte dich an die Forumsregeln und gehe davon aus, dass der Moderator sehr viel mehr Ahnung im Umgang mit solcherlei "Fragestellungen" hat; also er recht hat und du nicht.


  • Mod

    Larseey schrieb:

    Es ist nicht so, dass ich nicht wüsste, wie ich einen inkompatiblen Zeigerfehler im normalfall lösen müsste, aber wie bereits beschrieben, verstehe ich dieses mal nicht, warum der Fehler auftritt, da es keine typkonvertierungen gibt.

    Wir verstehen auch nicht, wieso du deine Fehler bekommst, so lange du nicht endlich mal ein Beispiel postest, das deinen Fehler reproduziert. Bisher hast du viel, viel Code gepostet, von dem die eine Hälfte fehlerfrei und die andere Hälfte unvollständig ist. Aber kein einziges deiner Beispiele ist so weit vollständig, dass man es bis auf den Fehler compilieren kann.

    Ich habe dir einen Link zu einer Anleitung gegeben und mich dreimal wiederholt. Noch einmal werde ich mich nicht wiederholen.



  • ich verstehe einfach nicht. was ich euch noch geben soll...
    ich habe alles gepostet was ich habe, an code und an compileroutput...

    ich verstehe auch nicht, warum der erste teil bei dir ohne fehler durch geht, und bei mir nicht.
    Ich bekomme auch, wenn ich deinen berichtigten code compile den Fehler inkompatibler Zeiger ...

    eigentlich war mein erster post, das kürzest mögliche was ich posten konnte.
    daher verstehe ich nicht, wie ich es noch kürzer machen könnte.
    ich hatte die strukturen, die erstellung der liste und dann die erste anscheinend fehlerhafte funktion pqueue_free.
    weiter kann ich es doch garnicht runterbrechen ohne wichtige mögliche Fehlerquellen wegzulassen.


  • Mod

    Dieser Code 1:1 ganz ohne Änderungen erzeugt bei dir den genannten Fehler?

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct q_elem_s
    {
            int priority;
            int value;
            struct q_elem_s *next;
    } q_elem;
    
    struct PrioQueue
    {
            int size;
            q_elem *root;
            //q_elem *tail;
    };
    
    typedef struct PrioQueue PrioQueue;
    
    PrioQueue* pqueue_new()
    {
            PrioQueue *q = (PrioQueue*) malloc(sizeof(PrioQueue));
            if( q == NULL){
            printf("not enough free memory to allocate proper size of bytes.");
            exit(0);
            }
            q->root = NULL;
           // q->tail = NULL;
            return q;
    }
    
    void pqueue_free(PrioQueue *queue)
    {
            for(int size = queue->size; size < 0 ; size-- ){
                    q_elem *current = queue->root;
                    for(int i = size; i>0 ; i--){
                            current = current->next;
                    }
                    free(current);
            }
            free(queue);
    }
    

    Wirklich? Falls ja: Gremlins.


Anmelden zum Antworten