2d-array als funktionsparameter

Nord-Süd-Richtung

Erfahrenes Mitglied
Hi

ich brauche ein 2d-array in einer Funktion. Allerdings kann ich nur ein 1d array einlesen.
Wie kann ich denn ein 2d (oder noch höheres) benutzen?
Mein bisheriger Versuch:
C++:
void writeIn(char* Feld, char Spieler);

char Feld[3][3];
	//Array mit Leerzeichen befuellen
	for( int i = 0; i <= 2; ++i ){
		for( int j = 0; j <= 2; ++j )
			Feld[i][j] = ' ';
	}
char Spieler = 'x';
writeIn(Feld, Spieler);
//error C2109: Index erfordert ein Array oder einen Zeigertyp
//in der funktion:
if( Feld[x-1][y-1] == ' ' ){
				Feld[x-1][y-1] = Spieler;
				ok3 = 1;
			}
 
Beim 1D Array ÜBergibt man immer die Addresse auf das erste Element, weshalb man hier ein normalen Pointer übergibt. Beim 2D Array übergibt man zu erst einen Zeiger auf das erste Element der ersten Demension und dann muss man noch einmal auf das erste Element der 2. Demension zeigen, also ein Pointer Pointer benutzen. Der Prototyp würde dann wie folgt aussehen:
Code:
void writeIn(char** Feld, char Spieler); // char** <-- 2 Sternchen
 
Hi.
Beim 1D Array ÜBergibt man immer die Addresse auf das erste Element, weshalb man hier ein normalen Pointer übergibt. Beim 2D Array übergibt man zu erst einen Zeiger auf das erste Element der ersten Demension und dann muss man noch einmal auf das erste Element der 2. Demension zeigen, also ein Pointer Pointer benutzen. Der Prototyp würde dann wie folgt aussehen:
Code:
void writeIn(char** Feld, char Spieler); // char** <-- 2 Sternchen
Das ist aber leider in dem Fall nicht richtig, bedenkt man wie das Array definiert wurde:
C:
char Feld[3][3];
Das ist zwar ein 2-dimensionales Feld, wird aber einfach als Block hintereinander im Speicher gehalten. Im Gegensatz zu einem dynamisch allozierten Array.

D.h. es ist kein Zeiger als erstes Element des Arrays auf das erste Element des Unterarrays gespeichert. So das man auch nicht auf diese Weise darauf zugreifen kann.

Will man ein statisches mehrdimensionales Array in einer Funktion verwenden, muß man entweder genau ein solches Array übergeben (wobei man die erste Dimensionsangabe weglassen darf) oder man übergibt einen Zeiger auf den Beginn des Arrays und die Dimensionen und rechnet das Element aus:
C:
void foo(char Feld[][3], size_t size) {
  Feld[0][size-1] = 5;
}

// ODER

void bar(char* Feld, size_t dim_x, size_t dim_y) {
  Feld[i * dim_y + j] = 5;
}

// Aufruf:
char feld[3][3];

foo(feld, 3);

bar(&feld[0][0], 3, 3);
Gruß
 
Hi

Danke für eure drei Lösungvorschläge. Ich habe den ersten von deepthroat genommen. Würde das auf die gleiche Weise auch mit einem 3D (oder höher) array klappen?
C++:
void foo(char Feld[][1]);
void bar(char Feld[][][1]);
void foobar(char Feld[][][]1);

mfg
 
Ich brauch auch genau sowas hier.
Allerdings weiß ich nicht wie ich in der Funktion genau auf die Elemnte zugreifen kann. Wenn ich jetzt z.B auf Feld[1][3] oder Feld[2][1] zugreifen möchte.

C++:
void bar(char* Feld, size_t dim_x, size_t dim_y) {
  Feld[i * dim_y + j] = 5;


}
 
Zurück