typedef struct



  • Hallo!
    In Info müssen wir gerade eine verkettete Liste in C schreiben, ich komm mit den struct dort aber nicht ganz klar.
    wieso funktioniert das hier nicht und wie mache ich, dass es funktioniert?

    typedef struct
    {
        int val;
        struct cons* next;
    } cons;
    
    struct cons* rmn(cons* element, int n)
    {
        //Eins vor dem zu löschenden angelangt, Liste neu verketten und zu löschendes Element löschen
        if(n==1 && element->next)
        {
            //Neu verketten
            cons* nextElement = (element->next);
            nextElement = (element->next->next->next);
    
            //Zu löschendes ausklinken aus Liste
            element->next->next= NULL;
    
            //Zu löschendes entfernen
            free(element->next);
        }
    
        return rmn(element,--n);    
    }
    

    der compiler meint dereferenciating to incomplete type. bei c++ würds so funktionieren



  • struct cons* rmn(cons* element, int n)
    

    in

    struct cons* rmn(struct cons* element, int n)
    

    ändern. wenn noch mehr fehler drin sind, nicht die schuld bei mir suchen, ich habs
    nicht weiter durchgelesen 😃



  • dann sagt er, blablabla is not completed



  • mach dies:

    typedef struct cons
    {
        int val;
        struct cons* next;
    } cons;
    

    dann kannst du es als 'cons' und 'struct cons' verwenden.
    🙂



  • a danke so gehts, wieso muss man das in C denn so kompliziert machen, was genau bedeutet das denn jetzt wenn ich das vor der klammer auch schreibe



  • blablabla22 schrieb:

    was genau bedeutet das denn jetzt wenn ich das vor der klammer auch schreibe

    da erste const (oben) ist der name der struct. das zweite (unten) ist der neue typ, den du mit typedef geschaffen hast. beide dürfen auch unterschiedlich heissen. ohne typedef musst du 'struct cons' voll ausschreiben, mit typedef gehen beide, 'struct cons x;' und 'cons x;'.
    🙂



  • Der eigentliche Grund fuer den Fehler oben ist der, dass zu dem Zeitpunkt, als innerhalb dest structs der Pointer definiert wird, der Type cons dem Compile rnoch gar nicht bekannt ist. Das Struct selber hat naemlich keinen Namen.
    Man muss sich das eher so vostellen:

    typedef // Beginn einer Typdefinition
    {
      struct // Beginn der Definition eines unbenannten structs
      {
        int val;
        struct cons* next;  // definition eines Structmembers eines (unbekannten) types "struct cons *"
      } // Ende der Definition eines unbenannten Structs
    }  // Ende der Definition eines Types
    cons; // Deklaration des Types 'cons'.
    

    Dann wird klar, dass das nicht klappen kann.
    Indem man dem Struct einen Namen gibt (sinnigerweise denselben, da "typedef x" und "struct x" zwei unabhaengige Namensraeume sind), kann man es auch in der Definition des structs selber benutzen, da der Name des Structs vor, der Name des Types hinter der Definition kommt.


Anmelden zum Antworten