Mehrdimensionale Arrays: Warum keine Längenangabe für die erste Dimension?



  • Der Titel sagts eigentlich schon.

    Warum kann ich sowas hier schreiben:

    int v1[][3] = {1,3,5,2,4};
    

    Bei Stackoverflow hat das schonmal einer gefragt:

    http://stackoverflow.com/questions/7432831/why-cant-i-omit-the-dimensions-altogether-when-initializing-a-multi-dimensional

    Ich versteh die Antwort leider nicht. Kann mir das einer für Dummies erklären? 😃


  • Mod

    hamster01 schrieb:

    Der Titel sagts eigentlich schon.

    Warum kann ich sowas hier schreiben:

    int v1[][3] = {1,3,5,2,4};
    

    Bei Stackoverflow hat das schonmal einer gefragt:

    http://stackoverflow.com/questions/7432831/why-cant-i-omit-the-dimensions-altogether-when-initializing-a-multi-dimensional

    Ich versteh die Antwort leider nicht. Kann mir das einer für Dummies erklären? 😃

    Spiel mal Compiler den Compiler für mich:

    int v1[][] = {1,3,5,2,4};
    

    Sag mir, von welche Dimensionen die Arrays hier haben.



  • SeppJ schrieb:

    hamster01 schrieb:

    Der Titel sagts eigentlich schon.

    Warum kann ich sowas hier schreiben:

    int v1[][3] = {1,3,5,2,4};
    

    Bei Stackoverflow hat das schonmal einer gefragt:

    http://stackoverflow.com/questions/7432831/why-cant-i-omit-the-dimensions-altogether-when-initializing-a-multi-dimensional

    Ich versteh die Antwort leider nicht. Kann mir das einer für Dummies erklären? 😃

    Spiel mal Compiler den Compiler für mich:

    int v1[][] = {1,3,5,2,4};
    

    Sag mir, von welche Dimensionen die Arrays hier haben.

    Das kann man nicht sehen.


  • Mod

    hamster01 schrieb:

    Das kann man nicht sehen.

    Oh, Moment, du hast die Frage anders herum gemeint? Also, wieso man überhaupt die erste Dimension weglassen kann? Ich glaube, du bist der Erste hier im Forum mit dieser Frage. Alle anderen wollen immer wissen, wieso man nur die erste Dimension weglassen kann. Dann ist es doch aber noch einfacher. Spiel wieder Compiler und sag mir, wie groß ist das Array:

    int v1[][3] = {1,3,5,2,4};
    

    Wenn du es dir selber erschließen kannst und der Compiler es sich selber erschließen kann, wieso sollte die Angabe dann notwendig sein?



  • Ich geh mal von einem Flüchtigkeitsfehler aus:

    {1,3,5,2,4}
    

    = ? Elemente 😕

    Das gibt dann bei einem mehr-dimensionalen Array ein kleines Problem. 😉



  • Da gibts (außer einer Compiler-Warnung) gar kein Problem.
    Der Compiler zählt im Gegensatz zum Programmierer immer fehlerfrei, natürlich nur die statisch d.h. zur Compilezeit feststehenden Größen.
    Es ist eine verbreitete (laienhaft naive) Unsitte, Nutzdaten (d.h. die zur Laufzeit veränderlich sind) nur mal schnell als Array zu implementieren, weil das ja so schön einfach geht und man sizeof u.ä. verwenden kann.
    Allenfalls sollte man Arrays nur für Daten(listen) benutzen, die auch zur Laufzeit konstant sind, z.B. für Status,Fehlermeldungs-IDs/Strings,....

    Im Vorgriff auf evtl. jetzt wieder folgende ungefragte Naivlingsantworten (Motto: ich will doch nur helfen):

    • nein, ein Array ist kein Zeiger
    • nein, ein Zeiger ist kein Array
    • nein, es gibt keine dynamischen Arrays
    • nein, es gibt keine mehrdimensionalen Arrays (ergänzt für ontopic)

    Wer das und alle diesbzgl. Sonderfälle (ohne nachzuschlagen) herbeten kann, hat C verstanden bzw. kann C programmieren.
    Für alle anderen gilt: Klappe halten



  • Wutz schrieb:

    Da gibts (außer einer Compiler-Warnung) gar kein Problem.
    ...

    Für alle anderen gilt: Klappe halten

    Okay, eine Compilerwarnung ist also kein Problem. Gut das du das schreibst.

    Und zu deinem Liebingsspruch "Klappe halten". Brauchst du einen Link dahin wo du das selbst ignorierst?



  • SeppJ schrieb:

    hamster01 schrieb:

    Das kann man nicht sehen.

    Oh, Moment, du hast die Frage anders herum gemeint? Also, wieso man überhaupt die erste Dimension weglassen kann? Ich glaube, du bist der Erste hier im Forum mit dieser Frage. Alle anderen wollen immer wissen, wieso man nur die erste Dimension weglassen kann. Dann ist es doch aber noch einfacher. Spiel wieder Compiler und sag mir, wie groß ist das Array:

    int v1[][3] = {1,3,5,2,4};
    

    Wenn du es dir selber erschließen kannst und der Compiler es sich selber erschließen kann, wieso sollte die Angabe dann notwendig sein?

    Ich weiß es hört sich absurd an, aber ich kann es mir nicht erschließen. Ich sehe dass es so sein muss wenn ich mir vorstelle wie das Array gefüllt wird. Vielleicht ist meine Wahrnehmung auch getäuscht. Ich kann mir nicht erklären warum das so ist.



  • Wer lesen kann, ist klar im Vorteil.

    Um es auch für dich begreiflich zu machen:
    "Da gibt es ...", vielleicht noch begreiflicher für solche Leute wie du, die Aussagen anderer Leute gern pauschalisieren:
    "Hier gibt es ..."
    bzw.
    "Hier in diesem Fall gibt es ...".

    Ich habe nicht gesagt, dass Compilerwarnungen pauschal ignoriert werden können, das hast du unterstellt und ich werde deswegen jetzt hier nicht mehr dazu antworten, das Diskussionsniveau ist mir zu pubertär und außerdem schon offtopic.



  • hamster01 schrieb:

    Ich weiß es hört sich absurd an, aber ich kann es mir nicht erschließen. Ich sehe dass es so sein muss wenn ich mir vorstelle wie das Array gefüllt wird. Vielleicht ist meine Wahrnehmung auch getäuscht. Ich kann mir nicht erklären warum das so ist.

    der compiler zählt die anzahl der elemente durch und teilt das ganze dann (in diesem fall) durch 3, und schon weiß er, wie viele "zeilen" das array hat.



  • HansKlaus schrieb:

    hamster01 schrieb:

    Ich weiß es hört sich absurd an, aber ich kann es mir nicht erschließen. Ich sehe dass es so sein muss wenn ich mir vorstelle wie das Array gefüllt wird. Vielleicht ist meine Wahrnehmung auch getäuscht. Ich kann mir nicht erklären warum das so ist.

    der compiler zählt die anzahl der elemente durch und teilt das ganze dann (in diesem fall) durch 3, und schon weiß er, wie viele "zeilen" das array hat.

    Ist diese Antwort nicht perse irreführend? Der Aussage entnehme ich, wenn ich das Array also anstatt mit 5 Werten mit 6 Werten initialisiere, erhalte ich automatisch ein Array n[2][3] da 6 / 3 = 2.

    Die Antwort ist doch viel banaler? Wenn ich ein mehrdimensionales Array habe, dessen einzelnen 'Zeilen' jeweils eine maximale Größe von 3 Elementen hat und ich erhalte die Initialisierung für eine 'Zeile', wieviele 'Zeilen' reserviere ich für dieses Array? Wenn ich nicht etwas komplett missverstanden habe, ist es das, worauf SeppJ mit seinem Ansatz drauf hinaus wollte.



  • also ob es einen Fehler gibt, wenn man dann auf [1][2] zugreift, weiß ich auch nicht, aber grundsätzlich läuft es so ab.

    Streng genommen haut ja auch das Betriebssystem die speicherfehler raus, während der Programmierer eigentlich (in seinem eigenen Betriebssystem) wie wild im Speicher rumschreiben kann, wenn es sein Herzenswunsch ist.


  • Mod

    HansKlaus schrieb:

    also ob es einen Fehler gibt, wenn man dann auf [1][2] zugreift, weiß ich auch nicht, aber grundsätzlich läuft es so ab.

    Streng genommen haut ja auch das Betriebssystem die speicherfehler raus, während der Programmierer eigentlich (in seinem eigenen Betriebssystem) wie wild im Speicher rumschreiben kann, wenn es sein Herzenswunsch ist.

    Bitte nicht raten bei Antworten! Antworte nur, wenn du die Antwort weißt. Wenn du prüfen musst, ob deine vermeintliche Antwort auch wirklich richtig ist, dann tu das bevor du die Antwort abschickst. Beglücke uns nicht mit deinen Spekulationen, außer in Form einer Frage!

    Wie du diesem Hinweise sicherlich entnehmen kannst, ist so ziemlich alles, was du hier gesagt hast, totaler Unsinn.


  • Mod

    Bierkorken schrieb:

    HansKlaus schrieb:

    hamster01 schrieb:

    Ich weiß es hört sich absurd an, aber ich kann es mir nicht erschließen. Ich sehe dass es so sein muss wenn ich mir vorstelle wie das Array gefüllt wird. Vielleicht ist meine Wahrnehmung auch getäuscht. Ich kann mir nicht erklären warum das so ist.

    der compiler zählt die anzahl der elemente durch und teilt das ganze dann (in diesem fall) durch 3, und schon weiß er, wie viele "zeilen" das array hat.

    Ist diese Antwort nicht perse irreführend? Der Aussage entnehme ich, wenn ich das Array also anstatt mit 5 Werten mit 6 Werten initialisiere, erhalte ich automatisch ein Array n[2][3] da 6 / 3 = 2.

    Was ist da dran irreführend? Bei 5 Elementen hast du doch auch ein n[2][3]. Es wird selbstverständlich genügend Platz für alle Elemente gemacht, aber es kann keine halben Elemente geben, d.h. der Bedarf wird aufgerundet.


Anmelden zum Antworten