struct Problem - Elemente verschwinden



  • Hallöchen,

    ich komme eigentlich aus der PHP / Java Ecke, versuche mich jedoch seit kurzem an C.

    Situation:
    Es soll ein Baum erstellt werden der eine Programmhierarchie sowie eine Typhierarchie realisieren soll.
    **
    Beispiel (Wurzelknoten ist Object):**

    class X
    {
      public void mX(){}
    }
    class Z extends X{}
    class Y
    {
      public void mY(){}
    }
    
    Object
            Class X        Class Z        Class Y
                Method mX                    Method mY
    

    Die Struktur des Baums:

    typedef struct AClassTree{
    char *nodeName;
    int nodeID;
    char *extrafield;
    struct AClassTree *next;
    struct AClassTree *childs;
    struct  AClassTree *up;
    struct AClassTree *stype;
    struct AClassTree *type; 	
    }ACLASSTREE;
    

    nodeName ist der Name der Node.

    nodeID ist die ID welche dem Namen der Node zugeordnet wird.

    extrafield beschreibt das Vorliegende Element (z.B. Class, Interface, ...)
    next beschreibt die nächste Node (wenn wir uns bei Class X befinden wäre die nächste Node Class Z, dann Class Y)

    childs beschreibt die Kindknoten eines Knotens. Bei Object wäre es Class X, Y, Z . Bei Class X wäre es method mX.

    up macht es möglich von einer Node die Supernode zu bekommen. (Man ist auf method mY, mit up würde man Class Y erhalten)

    stype steht für superType. Mit stype soll die Vererbungshierarchie dargestellt werden. In dem Beispiel hat Z von X geerbt. Das bedeutet, dass wenn die Node Class Z vorliegt der Verweis stype auf Class X zeigen würde.

    type beinhaltet irgendeinen weiteren Verweis auf einen Knoten.

    Problem:
    Durch wundersame weise verschwindet im Laufe des Programms der Verweis auf einen anderen Knoten über stype.
    Dies ist sehr ungewöhnlich weil es wird lediglich einmal während des Programms dieser Verweis gesetzt (pro Knoten, wenn dieser einen Supertypen hat). Zudem habe ich alle Rekrusionen auf Richtigkeit geprüft. Die Knoten werden miteinander verknüpft nur nach einiger Zeit sind die Verknüpfungen plötzlich fort.

    Wenn ich beim struct AClassTree stype z.B. mit childs tausche (also die Reihenfolge) dann gibts es Probleme bei childs.

    Vermutung:
    Kann es sein, dass bei einer struct definition nur maximal drei oder vier Elemente vom gleichem Typen erlaubt sind und die restlichen überschrieben werden?

    Ich danke euch schonmal recht herzlich für eure Zeit und antworten 🙂

    lg
    sala



  • saladin.mundi schrieb:

    Vermutung:
    Kann es sein, dass bei einer struct definition nur maximal drei oder vier Elemente vom gleichem Typen erlaubt sind und die restlichen überschrieben werden?

    Nein, das kann definitiv nicht sein 🙂
    Übrigens werde ich nicht ganz schlau aus deinem Code. "class" gibt's nur in C++, nicht in C und das Schlüsselwort "extends" gibt's in keinem von beiden.



  • saladin.mundi schrieb:

    Kann es sein, dass bei einer struct definition nur maximal drei oder vier Elemente vom gleichem Typen erlaubt sind und die restlichen überschrieben werden?

    nö, das wäre ja schlimm. ich schätze mal, du verpeilst dich mit irgendwelchen pointern. zeig doch einfach mal den code.
    🙂



  • Badestrand schrieb:

    Übrigens werde ich nicht ganz schlau aus deinem Code. "class" gibt's nur in C++, nicht in C und das Schlüsselwort "extends" gibt's in keinem von beiden.

    er kommt aus der 'java-ecke' da gibts beides.
    🙂



  • 🙂

    lass dich dadurch nicht verwundern. das hauptprogramm soll einfach typisierten code einlesen (hier java code) und daraus einen baum basteln welcher die abhänigkeiten darstellt.

    aber ich kann mir nicht erklären, dass wenn ich stype mit up, next etc tausche die Probleme bei den anderen Elementen auftauchen.

    EDIT
    Den Code hier zu Posten wäre ein bisschen viel (der besteht derzeitig aus circa 1000 Zeilen welche alle zusammenhängen)

    Also ist es nicht möglich das ab einer bestimmten anzahl an elementen in einem Struct (seien sie vom gleichen typen oder nicht) die nachfolgenden Elemente (zum teil)überschrieben werden?



  • Ne es ist nich möglich, es stimmt definiv mit deinem code was nicht.

    Und vererbung gibts in c nicht, d.h. du kannst keinen struct von einem anderen ableiten.

    Du verhäderst dich mit den Knotenverlinkungen nehm ich an.

    typedef struct Node{
    
    .....
    
    Node *pParent; //Zeig auf den vaterknoten
    Node **pChilds; //Zeigt auf ein Array von Konderknoten
    
    } MYNODE;
    

    geht sowas nich?



  • saladin.mundi schrieb:

    Den Code hier zu Posten wäre ein bisschen viel (der besteht derzeitig aus circa 1000 Zeilen welche alle zusammenhängen)

    Dann probier's mal mit einem KSKB



  • vielen Dank für die zahlreichen Antworten.

    Ich habe nach mehrstündigem "auf das wesentliche schrumpfen" und der Suche nach fehlerhaften Pointerzuweisung endlich die Lösung gefunden.

    Es war wirklich ein Pointerproblem. Undzwar wurde bei einer Zuweisung kein Speicher allokiert.

    Für diejenigen welche ähnliche Probleme haben hier ein struct und die jeweilige Zuweisung:

    -Struct-

    typedef struct AClassTree{
    char *extrafield ;
    int nodeID, type;
    struct AClassTree *next, *childs, *up, *stype;
    }ACLASSTREE;
    

    -Zuweisung-

    ACLASSTREE * n;
    n = (ACLASSTREE *)malloc(sizeof(ACLASSTREE));
    if (n == NULL) {
      printf("out of space");
    }
    n->extrafield = aCharOrACharVariable;
    n->nodeid = anIntOrAnIntVariable;
    n->type = anIntOrAnIntVariable2;
    n->up = NULL;
    n->childs = NULL;
    n->next = NULL;
    n->stype = NULL;
    


  • saladin.mundi schrieb:

    ACLASSTREE * n;
    n = (ACLASSTREE *)malloc(sizeof(ACLASSTREE));
    

    Lies dir mal das hier durch.



  • Vielen Dank für den Hinweis!


Anmelden zum Antworten