Twitter und Facebook-Anbindung
X
Tweet Follow @twitterapi
!!! Anbindung an twitter und facebook öffnen !!!

Wenn Ihnen mein Online-Buch gefällt,
dann bedanken Sie sich doch mit einer kleinen Spende...

9.4 Mehrdimensionale Felder

9.4 Mehrdimensionale Felder

Wie ich bereits erwähnte, kann man Arrays auch ineinander verschachteln und das beliebig oft. Für die statischen Arrays hatte ich dies bereits angedeutet. Allerdings ist der Umgang mit dynamischen Arrays ein wenig kniffliger, da es sehr stark davon abhängt, was man möchte bzw. was man meint. Deswegen werde ich nun vier verschiedene Herangehensweisen, für ein zweidimensionales Array, aufzeigen. Dabei werde ich auch jeweils etwas zur Speicherverwaltung sagen.

Zum Seitenanfang
Zum Inhaltsverzeichnis

9.4.1 Statische mehrdimensionale Arrays

9.4.1 Statische mehrdimensionale Arrays

Wie bereits erwähnt, wird bei statischen Arrays die Größe zur Entwicklungszeit, durch den Programmierer, fest vorgegeben und kannen somit zur Laufzeit nicht mehr verändert werden. Nun kann man eine Matrix bauen, welche die Werte direkt enthält und eine, die nur Zeiger auf Werte enthält.

Variante 1 Variante 2

 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
					
int  iZeilen							= 2;
int  iSpalten							= 3;
int  iCounter							= 0;

int  aStaticIntArray[2][3];		// Variante 1
int* aStaticPointerArray[2][3];		// Variante 2

// Erzeugen

// Durchlaufe die Zeilen
for (int iRowCount=0; iRowCount<iZeilen; iRowCount++) {
	// Erzeugen der Spalteninhalte
	for (int iColCount=0; iColCount<iSpalten; iColCount++) {
		aStaticPointerArray[iRowCount][iColCount]	= new int;
	} // end of for
} // end of for

// Befüllen

// Durchlaufen der Zeilen
for (int iRowCount=0; iRowCount<iZeilen; iRowCount++) {
	// Befüllen der Spalten
	for (int iColCount=0; iColCount<iSpalten; iColCount++) {
		aStaticIntArray[iRowCount][iColCount]		= iCounter;
		*aStaticPointerArray[iRowCount][iColCount]	= iCounter;

		iCounter++;
	} // end of for
} // end of for

// Ausgeben

// Durchlaufen der Zeilen
for (int iRowCount=0; iRowCount<iZeilen; iRowCount++) {
	// Ausgeben der Spalten
	for (int iColCount=0; iColCount<iSpalten; iColCount++) {
		printf("%i ", aStaticIntArray[iRowCount][iColCount]);
		printf("%i \t\t", *aStaticPointerArray[iRowCount][iColCount]);
	} // end of for

	printf("\n");
} // end of for

// Freigeben

// Durchlaufen der Zeilen
for (int iRowCount=0; iRowCount<iZeilen; iRowCount++) {
	// Löschen der Spalteninhalte
	for (int iColCount=0; iColCount<iSpalten; iColCount++) {
		delete aStaticPointerArray[iRowCount][iColCount];
	} // end of for
} // end of for
					

Ausgabe:

0 0        1 1        2 2
3 3        4 4        5 5
		

Die Variante 1 benötigt keinerlei Speicherverwaltung. Variante 2 benötigt für den Aufbau des Arrays ebenso keine Speicherverwaltung, jedoch für die Werte, auf welche die Pointer zeigen und genau diese müssen abschließend auch wieder freigegeben werden.

Zum Seitenanfang
Zum Inhaltsverzeichnis

9.4.2 Dynamische mehrdimensionale Arrays

9.4.2 Dynamische mehrdimensionale Arrays

Als wäre das nicht schon alles kompliziert genug, packe ich jetzt noch einen drauf. Falls zur Laufzeit die Größe des Arrays erst festgelegt werden soll, benötigt man dynamische Arrays. Hierbei gibt es wieder eine Fallunterscheidung. Man kann nur die zweite Dimension dynamisch machen, oder die komplette Matrix. Erstere Variante ist ein statisches Array mit Zeigern auf dynamische Arrays. Die zweite Variante ist ein Zeiger auf ein dynamisches Arrays, welches wiederum Zeiger auf dynamische Arrays beinhaltet.

Variante 1 Variante 2

 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
					
int iZeilen							= 2;
int iSpalten							= 3;
int iCounter							= 0;

int* aStaticArrayWithDynArray[2];	// Variante 1
int** pDynArrayWithDynArray;		// Variante 2

// Erzeugen

pDynArrayWithDynArray						= new int*[iZeilen];

// Durchlaufe die Zeilen
for (int iRowCount=0; iRowCount<iZeilen; iRowCount++) {
	aStaticArrayWithDynArray[iRowCount]			= new int[iSpalten];
	pDynArrayWithDynArray[iRowCount]			= new int[iSpalten];
} // end of for

// Bef�llen

// Durchlaufen der Zeilen
for (int iRowCount=0; iRowCount<iZeilen; iRowCount++) {
	// Befüllen der Spalten
	for (int iColCount=0; iColCount<iSpalten; iColCount++) {
		aStaticArrayWithDynArray[iRowCount][iColCount]	= iCounter;
		pDynArrayWithDynArray[iRowCount][iColCount]	= iCounter;

		iCounter++;
	} // end of for
} // end of for

// Ausgeben

// Durchlaufen der Zeilen
for (int iRowCount=0; iRowCount<iZeilen; iRowCount++) {
	// Ausgeben der Spalten
	for (int iColCount=0; iColCount<iSpalten; iColCount++) {
		printf("%i ", aStaticArrayWithDynArray[iRowCount][iColCount]);
		printf("%i\t\t", pDynArrayWithDynArray[iRowCount][iColCount]);
	} // end of for

	printf("\n\n");
} // end of for

// Freigeben

// Durchlaufen der Zeilen
for (int iRowCount=0; iRowCount<iZeilen; iRowCount++) {
	delete [] aStaticArrayWithDynArray[iRowCount];
	delete [] pDynArrayWithDynArray[iRowCount];
} // end of for

delete [] pDynArrayWithDynArray;
					

Die Ausgabe ist wieder exakt das Gleiche wie eben (daher hab ich sie hier weggelassen), aber hinter den Kulissen läuft einiges anders. Das Befüllen und das Zugreifen auf die Werte ist weitestgehend gleich, aber die Speicherverwaltung ist grundlegend anders.

Bei Variante 1 ist das äußere Array statisch und somit müssen nur die Spalten erzeugt und abschließend wieder freigegeben werden. Bei Variante 2 muss auch noch das äußere Array erzeugt und ganz zum Schluss wieder freigegeben werden. Gerade hier ist die Reihenfolge wichtig, da man sich sonst den Ast absägt auf dem man sitzt und somit Speicherleichen produzieren würde.

Natürlich würden mir jetzt noch ein paar Möglichkeiten einfallen, aber ich denke mal, bei den vier gezeigten kann man es belassen, da in der Praxis weitere Variationen kaum bis gar nicht auftreten. Notfalls lassen sie sich aber aus den vier gezeigten Beispielen ab - bzw. herleiten.

Zum Seitenanfang
Zum Inhaltsverzeichnis

© Copyright by Thomas Weiß, 2009 - 2012