Hab das Datum erst danach gesehen.
Dieses Beispiel soll zeigen, dass die Funktion foo einen Zeiger bekommt auf ein eindimensionales Array.
Es könnte genausogut so aussehen:
|
C-/C++-Quelltext
|
1
2
3
4
|
int array1[2][3];
foo(array1, 2, 3);
foo(array1, 3, 2);
|
Ausserdem kann man keine mehrdimensionalen Felder mit new anlegen (ausser mit C++11).
Und im Stack wird man wohl kaum ein größeres Feld erstellen und global erst recht nicht, da hier die Größe schon festgelegt sein muss.
Um ein dynamisches Feld mit Koordinaten kann man auch folgendes verwenden:
|
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;
|
Hiermit kann man auch mit Tilemaps, Bitmaps und sonsiges arbeiten und die größe muss dabei nicht fix vorgegeben sein.
Der Kompiler macht auch nichts anderes als die übergebenen Werte zu Multiplizieren.
Und wenn man auf einen anderen Compiler wechselt, hat man hier am wenigsten Probleme.
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
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);
}
|
Hier können zusätzlich die Arraygrenzen bei get() überprüft werden, oder mit einer set() Methode die Grenzen überprüft werden, um nicht in eine ungültige Speicherstelle zu schreiben.