Vorbei an multidimensionalen Arrays in C ++

Wenn Sie ein mehrdimensionales Array an eine Funktion haben, können die Dinge nur ein bisschen haarig. Das ist, weil Sie die Array-Größen in das Weglassen nicht so viel Freiheit haben, wie Sie mit eindimensionale Arrays tun. Angenommen, Sie haben diese Funktion haben:

int addAll (int MyGrid [5] [6]) {int x, y-int sum = 0-for (x = 0- x lt; 5- x ++) {for (y = 0- y lt; 6- y ++) {sum + = MyGrid [x] [y] -}} return Summen-}

Bisher ist der Funktionskopf in Ordnung, weil wir explizit die Größe jeder Dimension besagt. Aber Sie können dies tun wollen:

int addAll (int MyGrid [] []) {

oder vielleicht die Größen passieren auch:

int addAll (int MyGrid [] [], int Spalten int Zeilen) {

Aber leider, wenn Sie eine dieser beiden Linien zusammenstellen, erhalten Sie diese Fehlermeldung:

Erklärung von "MyGrid" als mehrdimensionale arraymust Schranken für alle Dimensionen außer der ersten haben

Das ist seltsam: Der Compiler sagt Ihnen, dass Sie explizit alle Dimensionen auflisten müssen, aber es ist in Ordnung, wenn Sie das erste leer ist, als mit eindimensionalen Arrays lassen.

Das bedeutet, dass diese verrückte Sache kompilieren:

int addAll (int MyGrid [] [6]) {

Wie ist es damit? Der Grund dafür ist, dass der Compiler mehrdimensionale Arrays in besonderer Weise behandelt. Ein mehrdimensionales Array nicht wirklich ein zweidimensionales Array ist, für Beispiel- eher, es ist ein Array aus einem Array.

So tief in C ++, behandelt der Compiler die Anweisung MyGrid [5] [6] als ob es MyGrid [5]wobei jedes Element im Array selbst ein Array von der Größe 6. Und du bist frei, nicht die Größe eines eindimensionalen Arrays angeben. Nun, die ersten Klammern stellen den eindimensionalen Teil des Arrays. So können Sie, dass der Raum leer lassen, wie Sie können mit anderen eindimensionalen Arrays.

Aber dann, nach diesem, haben Sie das Array zu geben Grenzen. Und vielleicht nur ein bisschen gekünstelt. Aber es ist C ++, und es ist die Regel: Sie können die erste Dimension leer in einer Funktionskopf verlassen, aber Sie müssen die restlichen Dimensionsgrößen angeben.

Wenn mehrdimensionale Arrays verwenden, ist es oft einfacher, wenn man von ihnen als denken Array von Arrays. Dann nutzen Sie ein typedef so dass, anstatt es ein Array von Arrays sein, es ist eine Anordnung von gewissen benutzerdefinierten Typ, wie beispielsweise GridRow. Eine der folgenden Funktionsköpfe, zum Beispiel, ist verwirrend:

int addAll (int MyGrid [] [6]) {int addAll (int MyGrid [] [6], int count) {

Hier ist unsere Empfehlung: Verwenden Sie ein typedef. Also hier ist ein sauberer Weg:

typedef int GridRow [6] -int addAll (GridRow MyGrid [], int Size) {int x, y-int sum = 0-for (x = 0- x lt; Size- x ++) {for (y = 0- y lt; 6- y ++) {sum + = MyGrid [x] [y] -}} return Summen-}

Das typedef Linie definiert einen neuen Typ namens GridRow. Diese Art ist eine Anordnung von sechs Zahlen. Dann wird in der Funktion, vorbei sind Sie eine Reihe von GridRows.

Mit dieser typedef ist das gleiche wie einfach zwei Klammern, mit der Ausnahme, dass Sie ein vorbei sind, betont Anordnung eines Arrays - dh ein Array, in dem jedes Mitglied selbst ein Array des Typs GridRow.

Menü