Darstellung von zweidimensionalen Arrays - Verständnis Problem..



  • So, ich verstehe das nicht wie da ein ein 8*8 Feld dargestellt wird:
    http://www.c-howto.de/tutorial-arrays-felder-zweidimensional.html
    Die Schleife müsste doch alle Möglichkeiten durchgehen oder?
    ([1][2], [1][1]...)
    Ich hab mir das kapitel ueber schleifen schon angeguckt und die Übungen Problem los bewältigt..
    Aber die Schleife müsste doch den ersten Array also die erste Dimension bis 8 durchgehen, und die zweite Dimension dann auch bis 8 durchgehen lassen..
    Sorry für sie blöde Formulierung, aber ich hoffe ihr erkennt mein Problem...

    Kurz und knapp: Wie funktioniert die verschachtelte Schleife in den Link? siehe oben.
    Danke:)



  • DerCer schrieb:

    Die Schleife müsste doch alle Möglichkeiten durchgehen oder?
    ([1][2], [1][1]...)
    ...
    Aber die Schleife müsste doch den ersten Array also die erste Dimension bis 8 durchgehen, und die zweite Dimension dann auch bis 8 durchgehen lassen..
    Sorry für sie blöde Formulierung, aber ich hoffe ihr erkennt mein Problem...

    Tut sie doch auch. Sie fängt sogar bei [0][0] an. Geht über [0][7] bis [7][7].

    DerCer schrieb:

    Sorry für sie blöde Formulierung, aber ich hoffe ihr erkennt mein Problem...

    Nicht so ganz.

    DerCer schrieb:

    Kurz und knapp: Wie funktioniert die verschachtelte Schleife?
    Danke:)

    // Schleife fuer Zeilen, Y-Achse
    for(i=0; i<8; i++) {                      // Alles in der Schleife wird 8 mal wiederholt.
    	// Schleife fuer Spalten, X-Achse
    	for(j=0; j<8; j++) {              // Dadurch wird auch diese Schleife wird 8 mal aufgerufen ( einmal bei i= 0, bei i = 1, .... i = 7
               printf("%d ", brett[i][j]);   // und dieses wird in der inneren Schleif 8 mal aufgerufen.
    	                                  // das macht dann 8*8 Aufrufe.
    	}  
    	printf("\n");
    }
    


  • Ah okay, ich glaube ich Hab es jetzt verstanden 🙂
    Danke!



  • Ich hänge mich mal an das Thema dran.
    Ich habe im Internet ein wenig durchstöbert und festgestellt bzw. möchte sichergehen, dass man die Funktion strleng() nur auf eindimensionale Arrays ausführen kann. Für 2-Dimensionale Arrays funktionert der Aufruf nicht. Was mich zu der Frage bringt, ob es es eine Möglichkeit gibt auch die größe 2 bis mehrdimensionale Arrays abzufragen? Als Beispiel:

    char char2DArray[][20] = {"Hallo","Du","Da!"};
    int zaehler1;
    int zaehler2;
    
    for(zaehler1 = 0; zaehler1<strlen(char2DArray); zaehler1++){
    
            for(zaehler2 = 0; zaehler2<strlen(char2DArray[zaehler1]); zaehler2++){
    
                   printf("Inhalt[%i][%i] = %s\n", zaehler1, zaehler2, char2DArray[zaehler1][zaehler2]);
      }
    }
    

    Also das Ziel wäre es, die äußere und dann erst durch die innere Schleife zudurchlaufen.


  • Mod

    Ganz falsch. Unbedingt mal Arrays und Zeichenketten angucken.

    strlen(char2DArray)
    

    Das hier ist die Länge der ersten Zeichenkette, also von "Hallo". Du benutzt es aber als Laufweite für den äußeren Arrayindex, der hier von 0 bis 2 geht, also gehst du über den Index hinaus. Ein Array von Zeichenketten ist keine Zeichenkette, da musst du die Länge anders feststellen. Also entweder explizit merken oder, wenn man wie hier das Array als lokales Objekt vorliegen hat und nicht bloß einen Zeiger da drauf, das gute alte sizeof(array)/sizeof(*array) .

    Weiterhin ist char2DArray[zaehler1][zaehler2] ein char, den kannst du nicht mit %s ausgeben.

    Vor beiden Fehler sollte dich dein Compiler laut warnen, wenn du ihn nur ließest.

    Dann klappt's auch:

    #include <stdio.h>
    #include <string.h>
    int main()
    { 
      char char2DArray[][20] = {"Hallo","Du","Da!"};
      int zaehler1;
      int zaehler2;
    
      for(zaehler1 = 0; zaehler1<sizeof(char2DArray)/sizeof(*char2DArray); zaehler1++){
    
        for(zaehler2 = 0; zaehler2<strlen(char2DArray[zaehler1]); zaehler2++){
    
          printf("Inhalt[%i][%i] = %c\n", zaehler1, zaehler2, char2DArray[zaehler1][zaehler2]);
        }
      }
    }
    

    Ich bin mir jedoch nicht so sicher, ob du wirklich char2DArray[][20] meinst und nicht const char *char2DArray[] . Ist dir der Unterschied klar?

    Außerdem ist es bei performancekritischem Code ungeschickt, bei jeder Schleifenbedingung die Länge neu zu berechnen, das ist nämlich O(N). hier sicher nicht wichtig, sollte man sich aber richtig angewöhnen.



  • Der Programmcode war mehr ein Pseudocode (der Compiler warnt mich durchaus 😉 ) aber deine Hinweise werde ich mir konkret nochmals vornehmen. Bin noch Anfänger und wackelig was Pointer und Zugriffe angehet, aber sizeof() war der entscheidene Hinweis. Ich werde mal einige Versuche starten unter Berücksichtigung deiner Punkte. Vielen vielen Dank. 👍



  • Mit "Größe" bei Arrays solltest du sorgfältig umgehen, manchmal ist damit die Größe in Bytes (sizeof(array)) und manchmal die Anzahl der definierten Elemente (sizeof(array)/sizeof*array) gemeint.
    Auch solltest du darauf achten, dass es sich um reale, d.h. nicht promotete Arrays handelt, also liefert

    void fkt(int a[3])
    {
      size_t groesse = sizeof(a);
    }  
    
    size_t groesse;
    int a[3];
    groesse = sizeof(a);
    fkt(a);
    

    unterschiedliche Ergebnisse.


Anmelden zum Antworten