Komplizierte Datenstruktur



  • Hallo!

    Ich habe folgendes Problem:
    Ich habe eine verkettete Liste erstellt. In jedem Listenelement ist ein Punkt (x, y und z-Koordinaten) abgespeichert.
    Nun möchte ich ein neues Datenelement erstellen: Dieses besitzt einen Zeiger auf einen Punkt und einen "next"-Zeiger. Ein Punkt soll jedoch ebenfalls auf dieses neue Datenelement zeigen können.

    Ich habe es folgendermaßen implementiert:

    struct Vertex {
    		float x;
    		float y;
    		float z;
    	};
    
    	struct EDGE {
    		struct POINT neighbour;
    		struct EDGE * next;
    	} Edge;
    
    	struct POINT {
    		Vertex v; 
    		Vertex normal;
    		struct POINT * next;
    		struct EDGE * first;
    	} Point;
    

    Natürlich kommt jetzt die Fehlermeldung:

    'neighbour' verwendet undefiniertes struct 'Point'

    Hat jemand eine Idee, wie ich die Struktur EDGE implementieren kann, und zwar so, dass POINT weiter oben schon bekannt ist. Wenn ich POINT als erstes schreibe, fehlt natürlich EDGE beim Punkt.

    Das ist bestimmt ein bekanntes Problem. Leider fehlt mir der Name dazu, deshalb kann ich im Internet nichts darüber finden.

    Vielen Dank!

    MfG

    BigRed



  • vorwarddeklenation
    ähhhh wie wird das word richtig geschrieben?

    also du schreibt vor EDGE :

    struct POINT;
    

    hin



  • Hallo,

    du kannst das hier mittels Vorwaertsdeklaration machen. Allerdings darf
    neighbour in diesem Fall nur ein Zeiger sein, da die Groesse von POINT zu diesem
    Zeitpunkt noch nicht bekannt ist:

    struct Vertex {
            float x;
            float y;
            float z;
        };
    
        struct POINT; //vorwaertsdeklaration
    
        struct EDGE {
            struct POINT* neighbour;
            struct EDGE * next;
        } Edge;
    
        struct POINT {
            Vertex v;
            Vertex normal;
            struct POINT * next;
            struct EDGE * first;
        } Point;
    

    mfg
    v R



  • Vorwärtsdeklaration ? 😃 oder forward declaration wenn dir englisch lieber ist

    Deklinieren ist was andres. 😉



  • Danke für die Hilfe.

    Jetzt erscheint zwar die Fehlermeldung nicht mehr, aber das Programm stürzt ab. Mal sehen... vielleicht hab ich an anderer Stelle noch einen Bug. Eigentlich komisch, weil das einzige, was ich gemacht habe, war das Einfügen der neuen Struktur??? 😕



  • greifst du vielleicht mit den Pointern auf irgendwas zu, bevor sie mit einer gültigen(!) Adresse versehen wurden? Prinzipiell ist es sicherer, Pointer zunächst mit NULL zu initialiesieren und vor Gebrauch auf NULL zu Prüfen:
    if(pointer){ ..MachWasDuWolltest.. }
    else{ ..Fehlerbehandlung..}
    Dann schützt du dich schon mal davor einen nicht korrekt initialisierten Zeiger zu benutzen und auf irgendwelche unbekannten Speicherbereiche zuzugreifen.
    mfg
    arni



  • Nein, mache ich nicht.

    Das scheint mir etwas komisch. Das Programm funktionierte vorher einwandfrei. Das einzige, was ich gemacht habe war, die Struktur einzufügen. Wenn ich diese wieder weg mache, funktioniert´s wieder.
    Kann das sein, dass durch einfaches Einfügen einer Struktur irgendwas im Speicher passiert und das ganze Programm schief läuft?? 😕



  • Zeigt denn 'neighbour' auf was gescheites? Ansonsten debug einfach mal.

    mfg
    v R



  • Neighbour zeigt auf nichts. Ich habe die Struktur so (wie oben) ja auch noch nicht im Speicher erstellt, oder? Das mache ich doch erst mit

    EDGE * edge = (EDGE *)malloc(sizeof(EDGE));
    

    oder? Habe ich jedoch auch noch nicht drin. Wie gesagt: Die Struktur benutze ich im Moment überhaupt nicht.



  • Hallo!

    Das mit der Vorwärzdeklaration verstehe ich nicht so ganz.

    Im Code gibt das Probleme. Wenn ich jetzt zum Beispiel folgendes mache:

    p1->first = NULL;
    
    if (p1->first != NULL)   //das gibt einen Fehler
    [...]
    else
    [...]
    

    Leider finde ich im Internet fast nichts über dieses Thema. Alle machen es so wie ich. Warum klappt´s bei mir dann nicht??

    Vorwärzdeklaration: Heißt das, dass der dann beim Punkt irgendwas nimmt und nicht das, was ich gerne möchte???



  • BigRed schrieb:

    Neighbour zeigt auf nichts. Ich habe die Struktur so (wie oben) ja auch noch nicht im Speicher erstellt, oder? Das mache ich doch erst mit

    EDGE * edge = (EDGE *)malloc(sizeof(EDGE));
    

    oder? Habe ich jedoch auch noch nicht drin. Wie gesagt: Die Struktur benutze ich im Moment überhaupt nicht.

    Wenn du das machst, dann hast du Speicher fuer _EDGE_, nicht aber fuer
    EDGE->neighbour, reserviert.

    Hallo!

    Das mit der Vorwärzdeklaration verstehe ich nicht so ganz.

    Im Code gibt das Probleme. Wenn ich jetzt zum Beispiel folgendes mache:

    Code:
    p1->first = NULL;

    if (p1->first != NULL) //das gibt einen Fehler
    [...]
    else
    [...]
    Code:
    p1->first = NULL;

    if (p1->first != NULL) //das gibt einen Fehler
    [...]
    else
    [...]
    Code:
    p1->first = NULL;

    if (p1->first != NULL) //das gibt einen Fehler
    [...]
    else
    [...]

    Leider finde ich im Internet fast nichts über dieses Thema. Alle machen es so wie ich. Warum klappt´s bei mir dann nicht??

    Vorwärzdeklaration: Heißt das, dass der dann beim Punkt irgendwas nimmt und nicht das, was ich gerne möchte???

    Was ist p1? Poste deinen Code doch mal hier: www.rafb.net/paste und poste
    dann deinen Link dazu.

    Etwas mehr Code ist noetig.

    mfg
    v R


Anmelden zum Antworten