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
Was berechnet hier nun die Funktion foo?
C-/C++-Quelltext |
|
1 2 3 4 |
int array1[2][3]; foo(array1, 2, 3); foo(array1, 3, 2); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
int x = 300; int y = 200; int *array = new int[x * y]; foo(array, x, y); delete[] array; |
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 |
typedef struct _S_TILEMAP { unsigned m_x; unsigned m_y; int *array; // Constructor _S_TILEMAP(unsigned x, unsigned y) : m_x(x), m_y(y) { array = new int[x*y](); } // Destructor ~_S_TILEMAP() { delete[] array; } // get Methode int get(unsigned x, unsigned y) const { return array[x*y]; } }S_TILEMAP; void foo(S_TILEMAP *daten) { for(unsigned x = 0; x < daten->m_x; ++x) std::cout << daten->array[x*10]; } void main() { S_TILEMAP test2(600, 400); test2.array[10 * 10] = 123; int x = test2.get(10, 10); foo(&test2); } |
Ausserdem kann man keine mehrdimensionalen Felder mit new anlegen (ausser mit C++11).
Der Kompiler macht auch nichts anderes als die übergebenen Werte zu Multiplizieren.
In einer Struct ist das dann auch viel effizienter und hat gleich die richtigen Informationen mit dabei:
C-/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 typedef struct _S_TILEMAP { unsigned m_x; unsigned m_y; int *array; // Constructor _S_TILEMAP(unsigned x, unsigned y) : m_x(x), m_y(y) { array = new int[x*y](); } // Destructor ~_S_TILEMAP() { delete[] array; } // get Methode int get(unsigned x, unsigned y) const { return array[x*y]; } }S_TILEMAP;
Warum man in C++ jetzt mit Structs und nicht mit Klassen arbeiten soll ist mir auch neu.
Ich kann per new ein Array von Arrays erstellen und dann per Schleife auf die anderen Array erstellen.
Zitat von »Gottfried«
Der Kompiler macht auch nichts anderes als die übergebenen Werte zu Multiplizieren.
Was genau meinst du damit?
C-/C++-Quelltext |
|
1 2 3 4 5 6 |
int val = arr[x+(breite*y)]; 00AC16DF mov eax,dword ptr [breite] 00AC16E5 imul eax,dword ptr [y] 00AC16EC add eax,dword ptr [x] 00AC16F2 mov ecx,dword ptr arr[eax*4] 00AC16F9 mov dword ptr [val],ecx |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
int val = arr[x][y]; 009716DA mov eax,dword ptr [x] 009716E0 imul eax,eax,28h 009716E3 lea ecx,arr[eax] 009716EA mov edx,dword ptr [y] 009716F0 mov eax,dword ptr [ecx+edx*4] 009716F3 mov dword ptr [val],eax |
Quellcode |
|
1 |
struct _S_TILEMAP meinArray; |
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Das is ja spannend, denn eine Multiplikation und Addition hast Du doch selbst oben erst (auch wenn's falscher Code war) für den Zugriff auf ein 1D-Array verwendet, um damit ein 2D-Array zu simulieren.Hier sagt mir mein Instinkt, dass ein Eindimensionales Array schneller geht.
Zitat
Hier sagt mir mein Instinkt, dass ein Eindimensionales Array schneller geht
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Werbeanzeige