Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
[...] oder würdet ihr sagen ich soll direkt versuchen mit Vektoren zu arbeiten?
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
int getFieldNum(int x,int y){return x+y*fieldSizeX;} ... for(int i=0;i<(FieldSizeX*FieldSizeY);i++) { field[i]=0; } field[getFieldNum(1,3)]=37; |
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
C-/C++-Quelltext |
|
1 2 3 |
int arr[5][3]; cout << sizeof(arr)/sizeof(int); // 15 cout << sizeof(arr[0])/sizeof(int); // gesucht! 3 |
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
allerdings wird sizeof(var) (...) zur laufzeit ausgewertet
Aber was ist denn das Problem wenn ich es dynamisch anlege? Ich muss doch nur darauf achten dsas ich den Speicher wieder freigebe, also wieso ist das daneben?Schiffe versenken mit einem Vektor? Also DAS finde ich völlig danaben. Ein Vektor ist etwas dynamisches und völlig unnötig für das Problem. Der Array ist hier schon genau die richtige Wahl.
C-/C++-Quelltext |
|
1 2 3 4 5 6 |
int* ein_zeiger; //... // das ein_zeiger[5] = 1234; // entspricht *(ein_zeiger + 5) = 1234; // Dereferenziert den Zeiger auf einen Wert der um 5*sizeof(int) hinter "ein_zeiger" liegt (Google: Zeigerarithmetik) |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
int ein_feld[5][5]; ein_feld[1][2] = 0; // vollkommen ok: greift auf das 3. Element in der 2. Zeile zu int** ein_doppelzeiger = ein_feld; // auch ok, ein_doppelzeiger zeigt jetzt ebenfalls auf einen Zeiger, der auf das erste Element zeigt ein_doppelzeiger[1][2] = 0; // FEHLER! Dieser Code kann nicht funktionieren, weil der Compiler ja nicht wissen kann, welche Dimensionen das Feld hat, auf das ein_doppelzeiger zeigt // müsste so aussehen: (*ein_doppelzeiger) // dereferenziert Zeiger, jetzt hat man den Zeiger auf das erste Element [1*5 + 2] // eigentlich ist es blos eindimensional = 0; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
void ErsteFunktion(int feld[5][5]) { for (int row = 0; row < 5; ++row) for (int col = 0; col < 5; ++col) feld[row][col] = 0; // vollkommen ok } void ZweiteFunktion(int feld[5][]) { for (int row = 0; row < 5; ++row) for (int col = 0; col < 5; ++col) feld[row][col] = 0; // auch ok: die Größe der letzten Dimension wird nicht zum berechnen der Position benötigt } void DritteFunktion(int feld[][]) { for (int row = 0; row < 5; ++row) for (int col = 0; col < 5; ++col) feld[row][col] = 0; // macht nicht was man vllt. erwarten könnte, Dimensionen unbekannt => Index kann nicht berechnet werden } void VierteFunktion(int** feld, size_t num_cols) { for (int row = 0; row < 5; ++row) for (int col = 0; col < 5; ++col) { feld[row][col] = 0; // klappt nicht feld[row * num_cols + col] = 0; // klappt und ist auch die einzige Möglichkeit } } |
Werbeanzeige