3fach verschachtelte Schleife



  • Hallo zusammen,

    mit den mehrdimenssionalen Arrays, habe ich wohl noch etwas nicht ganz verstanden.
    Warum liefert dieser Code das richtige Ergebnis im Array, obwohl z während dem Setzen der Werte immer 0 ist und s über die Spaltengrenzen läuft?

    int myA [4] [6];
    
        for ( int z = 0 ; z < 4; z++ )
        {
           for ( int s = 0; s < 6; s++ )
           {
                 for ( int i = 24 ; i <= 48; i++)
                 {
                	 	 myA [ z ] [ s ] = i;
                	 	 s++;
                 }
                 z++;
           }
           z++;
        }
    

    Grüße



  • Weil du alle Zählvariablen mehrfach erhöhst. In Zeile 10 wird der Index für die zweite Dimension erhöht (allein in der innersten Schleife 25x), damit läuft s über die Arraygrenzen.


  • Mod

    Weil 4*6=24 🙂

    Arrayzugriff prüft nicht die Gültigkeit der Indizes. x[y] ist bloß kurz für *(x + y). Und entsprechend ist x[y][z] das gleiche wie ((x+y)+z). Hier ist x das myA, also ein int[4][6]. y ist das z und hat stets den Wert 0. z ist das s und geht von 0 bis 23. Also hat man effektiv *(*(myA + 0) + s)

    myA + 0 ist wieder myA. *myA ist vom Typ int[6]. Somit hat man 24 hintereinander liegende Zugriffe auf ein int-Array, welches bei myA los geht. Nun ist aber garantiert, das Arrayelemente stets direkt hintereinander im Speicher liegen. Das gilt auch, wenn die Arrayelemente selber Arrays sind, so wie hier, wo man ein 4er Array von 6er int-Arrays hat. Dementsprechend liegen bei myA 24 Integer direkt hintereinander. Und daher funktioniert auch dein falscher Zugriff. Das ist somit sogar vom Sprachstandard garantiert, dass dies immer korrekt funktionieren wird.

    edit: Nein, Moment! Deine innere Schleife läuft 25 mal, nicht 24 mal. Somit ist es natürlich falsch, weil da nur 24 ints sind, d.h. du wirst einmal über das Ende schreiben.
    Merke: Grenzen von Schleifen sollte man stets mit < oder != prüfen, nicht mit <=.



  • Danke, dass die Elemente direkt hintereinander im Speicher liegen hatte mir gefehlt.
    Die Grenzüberschreitungen hätte ich so auch nicht zugelassen.


Log in to reply