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.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