sizeof() bei mehrdimensionalen Arrays



  • Hallo!

    Wenn meine Frage schon mal Gegenstand einer Frage war, dann sorry - aber ich habe lange hier und bei google gesucht und bin nicht fündig geworden...

    Bei einem mehrdimensionalen Array (z.b. 2-dimensional), wie lese ich die Werte am Besten anhand des sizeof()-Operators innerhalb einer for-Schleife aus?

    Stehe fürchterlich am Schlauch, deshalb dieser Post hier.

    // Array deklarieren
    int a_var[2][4] = {     {10, 20}, {30, 40, 50, 60}     };
    
    // funktioniert leider nicht...
    for(int i=0; sizeof(a_var[i][0]; i++) {
       for(int j=0; sizeof(a_var[0][j]; j++) {
          ...
          ...
       }
    }
    

    Danke,
    Tom.



  • 1. Da fehlt jeweils eine schließende Klammer.
    2. Damit baust du dir eine Endlosschleife.



  • sorry, die Klammer habe ich vergessen.
    In meinem Code ist die allerdings drinnen, die Schleife wird auch durchlaufen.

    Allerdings werden nicht nur die korrekten Werte des Arrays ausgegeben, sondern auch andere Speicherbereiche...



  • Du machst da völligen Quark.
    Dieser Quark ist so fest und rahmig, dass man ihn lieber wegschüttet und neuen macht.

    int a_var[2][4] = {     {10, 20}, {30, 40, 50, 60}     };
    for(int i=0; i < sizeof(a_var) / sizeof(a_var[0]); i++) {
       for(int j=0; j < sizeof(a_var[0]); j++) {
          ...
          ...
       }
    }
    

    oder

    const int n = 2, m = 4;
    int a_var[n][m] = {     {10, 20}, {30, 40, 50, 60}     };
    for(int i=0; i < n; i++) {
       for(int j=0; j < m; j++) {
          ...
          ...
       }
    }
    


  • Die Übergabe, wie du es machst, habe ich auch schon gemacht.
    Das funktioniert auch soweit, sogut.

    Allerdings möchte ich folgenden Fall wissen:
    Wenn ich nicht weiss, wie gross ist dieses mehrdimensionale Array, wie lese ich das aus?

    Auslesen möchte ich das Array mit sizeof().
    Nicht die Werte hardcoded übergeben...



  • Hallo

    Die Anzahl der Elemente von Arrays bekommst du mit sizeof nur bei statischen Arrays raus, deren Größe bereits beim Kompilieren feststeht.
    Für alles andere brauchst du die Größe in einer extra Variablen (ob nun const oder nicht) oder gleich std::vector.

    bis bald
    akari


  • Mod

    thomas_m schrieb:

    Die Übergabe, wie du es machst, habe ich auch schon gemacht.
    Das funktioniert auch soweit, sogut.

    Allerdings möchte ich folgenden Fall wissen:
    Wenn ich nicht weiss, wie gross ist dieses mehrdimensionale Array, wie lese ich das aus?

    Auslesen möchte ich das Array mit sizeof().
    Nicht die Werte hardcoded übergeben...

    C++ kennt keine mehrdimensionalen Arrays, nur Arrays aus Arrays. Ein Array

    int a[x][y][z];
    

    ist also ein Array mit x Elementen, jedes Element ist selbst ein Array des Typs

    int[y][z]
    

    Die Anzahl der Elemente eines Arrays erhalten wir mittels sizeof einfach als Verhältnis der Gesamtgröße des Arrays zur Größe eines Einzelnen Elementes.
    Also:

    int x = sizeof a / sizeof a[0];
    

    Die Frage nach der Größe der "2. Dimension" y ist dann ganz einfach zu beantworten, indem wir dieses Schema nicht auf a (unser "3-dimensionales" Array) sondern auf a[0] (unser "2-dimensionales" Unterarray) anwenden. also:

    int y = sizeof (a[0]) / sizeof (a[0])[0]
    

    usw. das ganze für weitere Dimensionen. statt a[0] kann man auch *a schreiben (da a[0] ja nichts anderes ist als *(a+0) ) - bei dieser Art von Idiom kann das besser lesbar sein. mithin:

    int x = sizeof a / sizeof *a;
    int y = sizeof *a / sizeof **a;
    int z = sizeof **a / sizeof ***a;
    


  • das hier

    int y = sizeof (a[0]) / sizeof (a[0])[0]
    

    und das

    int x = sizeof a / sizeof *a;
    int y = sizeof *a / sizeof **a;
    int z = sizeof **a / sizeof ***a;
    

    wollte ich wissen, jetzt passt es...

    Vielen Dank,
    Tom.


Anmelden zum Antworten