struct und new
-
jop...
zeig mal die member von deinem struct
weil eigendliuch sollte das so klappenmystrct *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.
-
Ein Array ist kein Zeiger und umgekehrt ist ein Zeiger auch kein Array.
Natürlich ändert sich der Sinn vonZeroMemory(&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
newhier 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 structnicht, ein einfachesstructreicht. Man kann so bei der Deklaration das Schlüsselwortstructweglassen.