warum mehrdimensionales array muss Grenzen haben, wenn ich Sie in der Initialisierung in der cpp

wenn Sie versuchen, ein mehrdimensionales array zu initialisieren, wie diese:

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

Bekomme ich diesen Fehler:

error: declaration of iArray as multidimensional array must have bounds for all dimensions except the first

aber ich möchte verstehen, warum sollte der compiler wissen, dass es eine[2][3] array, weil der {}.

Ich weiß, dass ist auch erlaubt, das zu tun:

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

und für den Fall, dass in der Tat der compiler kann nicht erraten, was ist die 2. dimension, wenn es fehlt, aber warum nicht zu erlauben die Verwendung eines[][] im ersten Fall?

  • beim initialisieren ein array wie dieses int a[5] = { 1,2,3}; Sie dürfen das weglassen von Werten in das Ende. Das ist der einzige Grund den ich mir vorstellen könnte. Allerdings int a[] = {1,2,3}; erlaubt ist. Vielleicht gibt es also keinen technischen Grund, aber es ist einfach so, weil es so ist
  • Ich habe das Gefühl, dass das „warum“ ging verloren vor langer Zeit im inneren Dennis Ritchie ‚ s beard. Möglicherweise, weil das die gültige syntax für Funktions-Parameter und die Anwendung der gleichen Regel überall vereinfacht der compiler.
InformationsquelleAutor pio | 2017-07-24



2 Replies
  1. 3

    [Schulterzucken] das ist einfach so wie es ist.

    Könnte man vorschlagen, die änderung der standard dieses zu ermöglichen. Sie müssten:

    • eine Spezifikation zu schreiben
    • erklären, warum dieser Wert ist durch das hinzufügen zusätzlicher Komplexität (sowohl standard-und-Implementierungen).
    • wahrscheinlich ändern Sie eine bestehende Anwendung hinzuzufügen, dieses als Erweiterung.

    Es ist mir nicht klar, dass dies hätte viele gotcha ist, aber auf der anderen Seite, es ist auch nicht klar, wie viel von einem Vorteil wäre es (hinzufügen von zusätzliche Unterstützung für raw-arrays ist wahrscheinlich ziemlich niedrig auf jeder Verstand).

  2. 1

    C++ – array kontinuierlichen block von Zellen, Zeilen (in diesem Beispiel) beginnend am 3., 6. Platz. Ohne Größe-Erklärung dieses nicht getan werden kann.

    Schöpfer standard /compiler überprüfen möchten initialisers gegen die Erklärung – und nicht zu erraten, aus mehreren initialisers, vielleicht einige Tippfehler Fehler.
    Ich denke, erraten Größen für über 3,4 Abmessungen mit Variablen Initialisierung Längen zu schwer ist? EDIT: Stimme mit molbdnilo Kommentar, compiler Vereinfachung

    Wenn Sie haben eine Ausbildung in Java/C# (oder high-level-Objekt-Implementierungen wie std::vector), muss denken, dass im C-Stil.

    EDIT: Eine dimension array, ausdrücklich erklärt oder durch die Initialisierung in beiden Optionen ist eine sehr einfache C-lineare Struktur (d.h. zugegriffen werden kann, die auf negative oder jenseits von size-index). Zu sagen, die wahre, die kompilierten code haben KEINE Abhängigkeiten von Größe, dieses wissen wird nicht genutzt.

    • OP ist nicht gefragt, der compiler erraten Sie die dimension oder lassen Sie diese Angabe, aber die dimension sind bereits in { {1,2,3}, {4,5,6} };, also warum müssen Sie wiederholt werden?
    • Sie müssen nicht geben Sie die gesamte Anzahl der Elemente für jede Zeile (entfällt Elemente werden mit dem Wert initialisiert, in diesem Fall auf null), so dass die Regel sein muss, zumindest die Zeile, die Breite wird aus der längsten Zeile zur Verfügung gestellt, aber das macht die Erklärungen sind schwer zu Lesen, es sei denn, Sie sind ordentlich formatiert für die Ausrichtung.
    • Und ich würde lieber zu einem Fehler, wenn dort sind zu 99 Zeilen von gleicher Länge, und eine, die unterscheidet sich – werden es mehr, oder kürzer. 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.