mehrdimensionale Felder



  • ich bin neu im forum und lerne c++.

    meine frage:
    im meinem Buch(c++ Programmierung lernen) steht das hier:

    int [6][8]
    a[x][y]=3

    dann rechnet c++ die zwei Indizies auf einen um:
    a[x*8+y]=3 // Diese Berechnung versteh ich überhaupt nicht.

    kann mir jemand die "interne verwaltung mehrdimensionaler Felder" anhand eins Beispiels erklären bitte ? 🙄



  • Die exakte Art und Weise kann ich dir nicht erklären aber:

    Der Hauptspeicher des Rechners ist nicht mehrdimensional, dH. dein mehrdimensionales Array muss auf eine Dimension abgebildet werden.

    Da die Daten in einem Array sequentiell (hintereinander im Arbeitsspeicher) abgelegt werden, muss eine "formel" benutzt werden um zur nächsten dimension zu kommen.

    zB,

    int[3,4]

    [1,2,3,4]
    [5,6,7,8]
    [9,10,11,12]

    Hier oben siehst du 2 Dimensionen (ergo eine Tabelle)

    im RAM sieht das aber so aus:

    [1,2,3,4,5,6,7,8,9,10,11,12]

    Wenn du jetzt a[1][2] aufrufst, muss das programm berechnen, wo sich der Wert befindet.

    Welche "Formel" verwendet wird um auf einen Index umzurechnen hängt von der Anzahl der Dimensionen, Der maximalen Indizies pro Dimension und natürlich von der Größe des Datentyps ab.



  • Da wirds erklärt: cplusplus.com: Arrays

    Link schrieb:

    Multidimensional arrays are just an abstraction for programmers, since we can obtain the same results with a simple array just by putting a factor between its indices:

    int jimmy [3][5];   // is equivalent to
    int jimmy [15];     // (3 * 5 = 15)
    

    With the only difference that with multidimensional arrays the compiler remembers the depth of each imaginary dimension for us.



  • Die Formel ist nicht x * y, denn da kommt man ja bei vertauschen Indexen auf gleiches Ergebnis (a[3][5] == a[5][3] weil 3 * 5 == 5 * 3 == 15). Richtig ist (y * x_ausdehnung) + x .
    Es hilft immer sich die Sache vorzustellen/aufzuzeichnen:

    [11][3]
      0 1 2 3 4 5 6 7 8 9 10 - x
    0 X X X X X X X X X X X
    1 X X X X X X + X X X X
    2 X X X X X X X X X X X
    |
    y
    

    Das '+' hat Position 6|1, d.h es ist im 18. Feld (Index 17, weil die Zählung bei 0 beginnt)
    ->Berechnung

    Feld mit '+':  1 * 11     + 6 = 17
    Allgemein:     y * Breite + x = Feld-Nr.
    

    Logisch, denn 1 Reihe zu 11 Feldern + 6 (das 6. Feld der 2. Reihe), bzw.
    y-1 Reihen zu x_ausdehnung/breite Feldern + das x (das x.Feld in der y. Reihe).

    Ich hoffe das war jetzt nicht zu konfus erklärt. 🙂



  • danke für die erklärungen
    jetzt hab ichs verstanden
    😃



  • Oberon_0 schrieb:

    Die Formel ist nicht x * y, denn da kommt man ja bei vertauschen Indexen auf gleiches Ergebnis (a[3][5] == a[5][3] weil 3 * 5 == 5 * 3 == 15).

    Du musst es im Kontext betrachten. Es ging in dem gezeigten Code um die Deklaration (deshalb steht ja auch ein int davor) und da ist a[3][5] und a[5][3] gleich lang.
    Vielleicht habe ich einen unpassenden Teil von dem Artikel zitiert, aber Genaueres erfährt man ja beim Lesen des selbigen.



  • gamemaker83 schrieb:

    kann mir jemand die "interne verwaltung mehrdimensionaler Felder" anhand eins Beispiels erklären bitte ? 🙄

    Es ist noch zu erwähnen, daß es zwei mögliche Varianten gibt Multidimensionale Felder im Speicher abzulegen. C und C++ verwenden die row-major order Fortran die column-major order.
    C legt eine Matrix Zeilenweise im Ram ab, Fortran speichert eine Matrix spaltenweise.
    Die folgende Matrix wird wie folgt gespeichert

    $$\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix}$$

    C:
    index = dim(columns)*row+column
    Die Reihenfolge im Speicher ist:

    $[1,2,3,4,5,6,7,8,9]$

    Fortran:
    index = row+dim(row)*column
    Die Reihenfolge im Speicher ist:

    $[1,4,7,2,5,8,3,6,9]$


  • gamemaker83 schrieb:

    meine frage:
    im meinem Buch(c++ Programmierung lernen) steht das hier:

    int a[6][8];
    a[x][y]=3;

    dann rechnet c++ die zwei Indizies auf einen um:
    a[x*8+y]=3; // Diese Berechnung versteh ich überhaupt nicht.

    _____a[0]____   _____a[1]____   _____a[2]____   _...
     /             \ /             \ /             \ /
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+...
    | | | | | | | | | | | | | | | | | | | | | | | | | |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+...
                     |                         |
                     |                         |
                  a[1][0]                   a[2][5]
    

Anmelden zum Antworten