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
    }
    

  • Mod

    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 wie screen[ZEILENZAHL*SPALTENZAHL];
    Nur bei der 2D-Definition kannst du (in dem Scope, wo die Deklaration bekannt ist) auch mit screen[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.


Anmelden zum Antworten