struct und new



  • Hi. Ich habe ein grosses Struct. Jetzt möchte ich davon 3 Variablen ableiten, aber das gibt eine böse EStackOverflow Meldung.

    mystrct sr1[100];
    mystrct sr2[100];
    mystrct sr3[100];
    
    sr1[2].data[56].value = 5;
    

    Lösung ist wohl einzig mit new das Struct anzulegen, aber nun meckert er EAcessViolation wenn ich weiterhin so Daten auffüllen möchte.

    sr1[2].data[56].value = 5;
    

    Was mach ich denn falsch? *jammer*



  • Argh.. sollte Vorschau werden..

    So leg ich das Struct mit new an

    mystruct *sr1= new mystruct[100];
    


  • Und weil Spamming gerade soviel Spass macht. *Scherz*
    Wie muss ich das sr1 wieder freigeben?

    Mit

    delete[] sr1;
    

    oder

    delete sr1;
    

    Ist ja ein Array,also wohl ersteres.



  • jop...

    zeig mal die member von deinem struct
    weil eigendliuch sollte das so klappen

    mystrct *s;
    s = new mystrct[1000];
    s[5].member[1].member2[25] = 123;
    


  • Das die normale funktionierende Variante, aber klappt nicht mit mehreren Structs, da EStackOverflow Meldung.

    struct _matrix
    {
        int index;
        int nummer;
    // viele weitere int
    };
    typedef struct _xmatrix
    {
        _matrix data[100];
    }xmatrix;
    
    xmatrix myMatrix[100];
    
    ZeroMemory(&myMatrix,sizeof(myMatrix));
    
    myMatrix[3].data[2].nummer = 5;
    

    Das die mit new

    struct _matrix
    {
        int index;
        int nummer;
    // viele weitere int
    };
    typedef struct _xmatrix
    {
        _matrix data[100];
    }xmatrix;
    
    _xmatrix *myMatrix= new _xmatrix[100];
    //xmatrix *myMatrix= new xmatrix[100]; // klappt auch nicht
    
    ZeroMemory(&myMatrix,sizeof(myMatrix));
    
    myMatrix[3].data[2].nummer = 5; //ERROR EAccessViolation
    
    delete[] myMatrix;
    


  • ZeroMemory(&myMatrix,sizeof(myMatrix));

    =>

    ZeroMemory(&myMatrix,sizeof(_xmatrix));



  • Dann erhalte ich "Zugriffsverletzung bei 0x00000000: lesen von Adresse 0x00000000"



  • Es scheint das wirklich ZeroMemory() an der EAccessViolation schuld ist. Der Fehler springt zwar zu der Variableübergabe, aber wenn ich ZeroMemory auskommentiere erhalte ich keine Fehlermeldung mehr im Programm.

    Mit ZeroMemory fülle ich das "struct" mit 0. Geht das nicht mehr mit new? 😑



  • Klar geht das:
    ZeroMemory( &myMatrix[0], sizeof(_xmatrix[100]) );
    oder
    ZeroMemory( myMatrix, sizeof(_xmatrix[100]) );



  • Danke für die tolle Hilfe!! 👍

    Das hat ich auch probiert

    Badestrand schrieb:

    ZeroMemory( &myMatrix[0], sizeof(_xmatrix[100]) );

    richtig ist aber tatsächlich dies

    Badestrand schrieb:

    ZeroMemory( myMatrix, sizeof(_xmatrix[100]) );

    Ist das jetzt wegen dem new so?
    Wenn ich es direkt vom struct nehme kann ich das doch so nutzen wie bisher, oder? Es gibt damit jedenfalls keine Probleme.

    struct _matrix
    {
        int index;
        int nummer;
    // viele weitere int
    };
    typedef struct _xmatrix
    {
        _matrix data[100];
    }xmatrix;
    
    xmatrix myMatrix[100];
    
    ZeroMemory(&myMatrix,sizeof(myMatrix)); // << ??
    


  • Gib deiner struct _matrix doch einen Konstruktor der die Elemente mit 0 initialisiert, und du kannst auf ZeroMemory verzichten.


  • Mod

    Ein Array ist kein Zeiger und umgekehrt ist ein Zeiger auch kein Array.
    Natürlich ändert sich der Sinn von

    ZeroMemory(&myMatrix,sizeof(myMatrix));
    

    je nachdem, ob myMatrix ein Array oder ein Zeiger ist.

    Keine dieser Varianten ist im Übrigen besonders elegant. Besser:

    xmatrix* pmyMatrix= new xmatrix[100][b]()[/b]; // die Klammern bewirken den Aufruf des Defaultkonstruktors, auch wenn xmatrix ein POD ist
    xmatrix myMatrix[100] = {}; // wenn C-Komaptibilität wichtig ist:  xmatrix myMatrix[100] = {0};
    

    Überhaupt sind Funktionen wie ZeroMemory fast immer überflüssig.



  • camper schrieb:

    wenn C-Komaptibilität wichtig ist

    Dann wäre new hier aber auch fehl am Platz.

    Abgesehen davon, dass ZeroMemory() nicht Standard-C++ ist, gibt es wie gesagt die Möglichkeit, in einem Defaultkonstruktor alle Member mit 0 zu initialisieren. Will man dann z.B. später ein Member mit einem anderen Wert initialisieren, reicht es, einen Eintrag zu ändern.

    Unter der Voraussetzung, dass das Ganze C++ sein soll (wir sind hier im C++-Forum), brauchst du auch typedef struct nicht, ein einfaches struct reicht. Man kann so bei der Deklaration das Schlüsselwort struct weglassen.


Anmelden zum Antworten