mehrdimensionales Array ansprechen
-
hallo
ich Habe ein Mehrdimensionales Array und will die einzelnen Elemente des Arrays ansprechen. Ich weiß aber leider nicht wie die Syntax dafür ist.
der Ansatz mit *screen[i][j] so wie es die Logische Erweiterung bei einem eindimensionalen Array wäre bringt eine Fehlermeldung im Compiler --> subscript value is nether array nor pointer. verschiedenen Klammerungen bringen auch keine besserung.übergeben tue ich die erste Speicheradresse meines Arrays an eine Funktion, innerhalb der Funktion will ich das Array dann mit werten bestücken, indem ich die Speicherbereiche anspreche,
void schiffupdate(char *screen,int *HorizontalMove,int *VerticalMove){ int i=0,j=0,k=0,up=20,left=0; int zeileabsolut=0,spalteabsolut=0; //---Ausgabe Leerraum vor Raumschiff for(i=1;i<=ZEILENZAHL-*VerticalMove;i++){ for(j=1;j<=SPALTENZAHL;j++){ //printf(" "); *(screen+i+j)='v';// hier versuche ich die einzelnen Ellemente anzusprechen weis aber nicht ob das so richtig ist } //printf("\n"); //*(screen+i+j)='\n'; } }
-
screen[i][j]
-
Das muesste dann aber doch
char **screen
sein, nicht?
-
Nein.
-
DirkB schrieb:
Nein.
Aber das kompiliert doch sonst gar nicht?
void schiffupdate(char *screen,int *HorizontalMove,int *VerticalMove) { int i = 0, j = 0; screen[i][j] = 'a'; // Compilation Error }
-
Zum tausendsten Mal: Ein Array ist kein Zeiger und ein zweidimensionales Array ist erst recht kein Zeiger auf einen Zeiger.
-
Wenn du unbedingt Pointerarithmetik machen willst, versuche mal folgendes:
for(i=1;i<=ZEILENZAHL-*VerticalMove;i++){ for(j=1;j<=SPALTENZAHL;j++){ *(screen + (i * SPALTENZAHL) +j)='v'; } } }
Und überprüfe nochmals, ob die Zählvariablen wirklich bei 1 anfangen sollen. Das ist nämlich ungewöhnlich...
Ansonsten würde ich auch sagen, dass das char **screen heißen muss.
-
Steffo schrieb:
Ansonsten würde ich auch sagen, dass das char **screen heißen muss.
Das kommt auf die Definition der Variablen an.
Wenn du ein
screen[ZEILENZAHL][SPALTENZAHL];
nimmst, bekommst du einen zusammenhängenden Speicherbereich von ZEILENZAHL*SPALTENZAHL Elemente.
Das ist das gleiche wiescreen[ZEILENZAHL*SPALTENZAHL];
Nur bei der 2D-Definition kannst du (in dem Scope, wo die Deklaration bekannt ist) auch mitscreen[i][j]
darauf zugreifen.Bei der Übergabe an eine Funktion als Zeiger ist jedoch die Dimension nicht bekannt. Darum dann
*(screen + (i * SPALTENZAHL) +j)
Wenn du dagegen ein
char *screen[ZEILENZAHL];
nimmst und jedem Zeiger des Arrays einen Speicher zuweist, dann kannst du da auch in der 2D-Array-Schreibweise zugreifen:screen[i][j]
. Das ist dann aber*(screen[i]+j)
. bzw*(*(screen+i)+j)
. Also etwas ganz anderes.
-
Hm, ok.
-
RajHid schrieb:
verschiedenen Klammerungen bringen auch keine besserung.
So?
Dann hast du aber nicht genügend 'Klammerungen' ausprobiert.
Es sieht so aus, dass du mit ZEILENZAHL+SPALTENZAHL schon Compilezeitkonstanten vorliegen hast, die kannst du für die Parameter nutzen,void schiffupdate(char screen[][SPALTENZAHL],int *HorizontalMove,int *VerticalMove) oder äquivalent void schiffupdate(char screen[ZEILENZAHL][SPALTENZAHL],int *HorizontalMove,int *VerticalMove)
Dann kannst du einfach mit screen als Array hantieren,
screen[zeilenindex][spaltenindex]
Deine Laufbereiche sind falsch,
for(i=1;i<=ZEILENZAHL-*VerticalMove;i++){ for(j=1;j<=SPALTENZAHL;j++){
Arrayindexe beginnen immer bei 0 und nicht bei 1.