Verschachtelte Strukturen, Debugfehler



  • Ich bin mir nicht ganz sicher, ob man das noch als verschachtelt bezeichnet, aber zum eigentlichen Problem:

    Das sind meine Strukturen:

    struct struct1
    	{
    		int i;
    		int j;
    	};
    
    	struct struct2
    	{
    		int k;
    		int l;
    	};
    
    	struct struct3
    	{
    		struct struct1 *str1;
    		struct struct2 *str2;
    	};
    

    Und hier weise ich etwas zu und will es ausgeben:

    struct3 *str3;
    	str3->str1->i = 5;
    	std::cout << str3->str1->i << std::endl;
    

    Im Prinzip funktioniert das auch. Allerdings bekomme ich im Debug zur Laufzeit den Fehler

    Run-Time Check Failure #3 - The variable 'str3' is being used without being initialized.
    

    Demnach müsste ja was in der Initialisierung von str3 falsch sein. Allerings weiß ich auch nicht was ich da anders machen soll.



  • struct i1
    {
    };
    
    struct i2
    {
    };
    
    struct foo
    {
     i1 a;
     i2 b;
    };
    
    int main()
    {
      foo my_foo;
    }
    

    oder brauchst du pointer für irgendetwas? falls ja: new/delete

    bb



  • Du musst, wenn du einen Pointer verwendest gültigen Speicher bereitstellen. D.h. du benötigst new und delete. Entweder du verzichtest hier auf Pointer und schreibst dann:

    struct struct1
        {
            int i;
            int j;
        };
    
        struct struct2
        {
            int k;
            int l;
        };
    
        struct struct3    
            struct struct1 str1;
            struct struct2 str2;
        };
    
    struct3 str3;
    str3.str1.i = 5;
    std::cout << str3.str1.i << std::endl;
    

    oder du arbeitest mit new im Constructor und delete im Destructor.

    struct struct3 
     {
    	struct struct1* str1;
    	struct struct2* str2;
    
    	struct3() 
    	{
    		str1 = new struct1;
    		str2 = new struct2;
    	}
    
    	~struct3() {
    		delete str1;
    		delete str2;
    	}
     }; 
    
    int main() {
    	struct3* str3 = new struct3;
    	str3->str1->i = 5;
            std::cout << str3->str1->i << std::endl;
    	delete str3;
    	return 0;
    }
    

    Das Beispiel ist nicht vollständig, vorallem das ist wichtig.



  • Das ist für nichts bestimmtes. Manchmal versuche einfach mal was neues um daraus zu lernen. 🙂

    bzw. ich dachte man macht das bei Strukturen einfach mit "Struktur *Pointer". Gilt das nur für einfache oder habe ich das was total falsch verstanden? 😕



  • struct struct1
        {
            int i;
            int j;
        };          /* nur eine Deklaration */
    
        struct struct2
        {
            int k;
            int l;
        };           /* nur eine Deklaration */
    
        struct struct3
        {
            struct struct1 *str1;
            struct struct2 *str2;
        };
    

    mit *str1 und *str2 hast Du nur Zeiger, die auf ein Objekt vom Typ struct struct1
    zeigen KÖNNEN , die Pointer zeigen jedoch irgendwo hin, da
    kein Speicher alloziert wurde.
    -------------------------------------------------

    struct struct1
        {
            int i;
            int j;
        }str1;  
    
        struct struct2
        {
            int k;
            int l;
        }str2;        
    
        struct struct3
        {
            struct struct1 str1;
            struct struct2 str2;
        }str3;
    

    Hier reserviert der Compiler Speicher für str1, str2 und str3
    Zugriff über die Namen:
    str3.str1.i=3;
    str3.str2.k=5;

    Gruß

    /edit pumuckl: cpp-Tags



  • Autsch

    struct struct1
    {
    int i;
    int j;
    };

    struct struct2
    {
    int k;
    int l;
    };

    struct struct3
    {
    struct struct1 str1;
    struct struct2 str2;
    }str3;

    Das meinte ich eigentlich



  • Keksschleuder schrieb:

    ich dachte man macht das bei Strukturen einfach mit "Struktur *Pointer". Gilt das nur für einfache oder habe ich das was total falsch verstanden? 😕

    Das hast du vermutlich falsch verstanden. Wenn die Struktur2 und 3 Teil deiner Struktur sind, dann macht man es komplett ohne Pointer. Nur wenn die Strukturen an anderer Stelle erzeugt wurden und mehrere Strukturen Referenzen auf die gleiche Struktur2/3 haben sollen, nimmt man Pointer (oder Referenzen).

    @brummdings: demnächste bitte cpp-Tags benutzen 🙂


Anmelden zum Antworten