# [C] char array in switch statement



## SparkMonkay (7. Oktober 2014)

Moinsen!
Ich habe hier einen char array erstellt und in Abhängigkeit einer anderen variable soll dieser array anders aussehen. mein Problem ist eine Fehlermeldung, die ich nciht verstehe.

Also Editor wird Sublime Text 2 benutzt und MinGW als Compiler genutzt.

Hier ist nun der Ausschnitt:

```
char map [10][10];
switch(stage){
	case 1:
	//Map NR1
	map [10][10]={ //die unten genannte Zeile 32
		{'#','#','#','#','#','#','#','#','#','#'},
		{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
		{'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
		{'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
		{'#',' ','#',' ','&',' ','#',' ',' ','#'},
		{'#',' ','#',' ',' ',' ','#',' ',' ','#'},
		{'#',' ','#','#','#','#','#',' ',' ','#'},
		{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
		{'#','S','T','A','G','E','1',' ',' ','#'},		
		{'#','#','#','#','#','#','#','#','#','#'} };
		break;
	case 2:
	//Map NR2
	map [10][10]={ //die unten genannte Zeile 46
		{'#','#','#','#','#','#','#','#','#','#'},
		{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
		{'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
		{'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
		{'#',' ','&',' ',' ',' ','#',' ',' ','#'},
		{'#',' ','#',' ',' ',' ','#',' ',' ','#'},
		{'#',' ','#','#','#','#','#',' ',' ','#'},
		{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
		{'#','S','T','A','G','E','2',' ',' ','#'},
		{'#','#','#','#','#','#','#','#','#','#'} };
		break;
	}
```

Und hier die Fehlermeldung:


> main.c: In function 'map_initialisation':
> main.c:32:15: error: expected expression before '{' token
> map [10][10]={
> ^
> ...



was habe ich hier falsch gemacht?

MfG Sparkay


----------



## Keksdose12 (7. Oktober 2014)

verstehe ich das richtig, dass die funktion die nummer der Stage als paramter erwartet und dann das array mit der entsprechenden map belegt ? mach mal aus map[10][10] = {..  --> map[][] = {.. denn so würdest du nur das eine element mit den ganzen zeichen belegen, was nicht gehen kann.


----------



## SparkMonkay (8. Oktober 2014)

Moinsen, 
@Keksdose12.
Ja, ich habe die Variable stage, sowie andere Variablen global definiert. in der main-Funktion ist eine große while loop. In dieser while loop habe ich die Aktionen als Funktion in benutzung, wenn das Feldchen mit dem '&' betreten wird, habe ich es so angelegt, dass der Parameter 'stage' um 1 erhöht wird und folglich eine andere Karte ausgegeben wird.


es sah so aus, als ich es nur mit einer Map zu tun hatte.

```
//Map NR1
char map [10][10]={
	{'#','#','#','#','#','#','#','#','#','#'},
	{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
	{'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
	{'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
	{'#',' ','#',' ','&',' ','#',' ',' ','#'},
	{'#',' ','#',' ',' ',' ','#',' ',' ','#'},
	{'#',' ','#','#','#','#','#',' ',' ','#'},
	{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
	{'#','S','T','A','G','E','1',' ',' ','#'},		
	{'#','#','#','#','#','#','#','#','#','#'} };
//Map NR2
char map2 [10][10]={
	{'#','#','#','#','#','#','#','#','#','#'},
	{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
	{'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
	{'#',' ',' ',' ',' ',' ','#',' ',' ','#'},
	{'#',' ','&',' ',' ',' ','#',' ',' ','#'},
	{'#',' ','#',' ',' ',' ','#',' ',' ','#'},
	{'#',' ','#','#','#','#','#',' ',' ','#'},
	{'#',' ',' ',' ',' ',' ',' ',' ',' ','#'},
	{'#','S','T','A','G','E','2',' ',' ','#'},
	{'#','#','#','#','#','#','#','#','#','#'} };
```

Problem ist hierbei, dass ich dann in jeder Funktion eine switch-Funktion einbauen muss, dass die entsprechende Funktion auch für map2 gilt, daher die oben wie oben formulierte Funktion um das zu umgehen. Es würde so einfach übersichtlicher aussehen, denn ich muss nicht mehr die anderen Funktionen für map2 umstellen, sondern kann einfach so wie ich es oben wollte an die Sache ran gehen.


----------



## Magogan (8. Oktober 2014)

Edit: Hmm, also irgendwie geht das nicht so, wie ich gedacht habe. Mit einem eindimensionalen Array könntest du einfach char* map benutzen und das dann setzen je nach stage, z.B. auf map=&map1[0].
Wie es aber mit einem zweidimensionalen Array geht, weiß ich nicht, da die Adressierung dann schwierig wird und ich keine Ahnung habe, wie der Compiler das macht (gibt ja zwei Möglichkeiten bei zwei Dimensionen).

Du könntest aber einfach ein dreidimensionales Array nutzen und mit map[stage]_[j] darauf zugreifen.

Alternativ ginge natürlich auch das Kopieren des Arrays mit memcpy von &map1[0][0] oder &map2[0][0] nach &map[0][0]. Die Größe müsste dann ja sizeof(char)*10*10, also 100 Byte sein._


----------



## VikingGe (9. Oktober 2014)

> Mit einem eindimensionalen Array könntest du einfach char* map benutzen und das dann setzen je nach stage, z.B. auf map=&map1[0].


Das geht in nem zweidimensionalen Array ganz genau so, also:

```
char test[10][10];
char* a = test[0];
char* b = &test[0][0];
printf("%d\n", a == b); // 1
```

Trotzdem würde ich, um Unklarheiten zu vermeiden, möglichst einen Bogen um mehrdimensionale Arrays machen. Die Dinger sind mehr pain in the *** als sonstwas und die Addressierung kann man auch selbst vornehmen.


----------



## Magogan (9. Oktober 2014)

Ne, in mehrdimensionalen Arrays gäbe es ja 2, 6, 24, ... Möglichkeiten der Adressierung, bei zweidimensionalen Arrays zum Beispiel für char a[5][10]: 1) &a_[j] == a+i*10+j oder 2) &a[j] == a+i+j*5

Nun müsste man natürlich wissen, welche davon der Compiler benutzt, sonst bekommt man die falsche Adresse._


----------



## DarkMo (9. Oktober 2014)

dann machs doch einfach selber ^^ eindimensionales array der größe x*y und akt_zeile*breite als offset. also bei dir haste *nachschau* joa 10*10 also 100 felder. willst du nun öh feld 3|5 oder so auslesen, fragste einfach (breite ist wie gesagt 10) 5*10+3 ab. ma guggn, ob das stimmt ^^ feld 53 szs... jo, scheint zu passen (also wenn die koords bei 0|0 beginnen).


----------



## VikingGe (9. Oktober 2014)

> Nun müsste man natürlich wissen, welche davon der Compiler benutzt, sonst bekommt man die falsche Adresse.


Wenn sich der Compiler auch nur ansatzweise an irgendwelche Standards hält, dann weiß man das


----------



## SparkMonkay (9. Oktober 2014)

so da bin cih wieder.

ich benutze MinGW als Compiler auf Windows. Ubuntu benutze ich grade nicht.


----------



## crys_ (12. Oktober 2014)

Wenn ich mich recht entsinne ist die Schnellschreibweise mit den geschweiften Klammern nur in der Kombination aus Deklaration und Initialisierung moeglich, bin mir aber nicht ganz sicher.
Des weitern macht es schon rein logisch keinen Sinn das du dem Array eine feste Groesse gibst, da der Compiler mit der Klammerschreibweise das selbst ermitteln kann.


----------

