Passant tableaux multidimensionnels en C ++

Si vous devez passer un tableau multidimensionnel à une fonction, les choses peuvent devenir un peu poilue. Cela est parce que vous ne disposez pas d'autant de liberté en laissant au large des tailles de tableau comme vous le faites avec des tableaux unidimensionnelles. Supposons que vous ayez cette fonction:

int AddAll (int MyGrid [5] [6]) {int x, y-int somme = 0-en (x = 0- x lt; 5- x ++) {for (y = y 0- lt; 6- Y ++) {somme + = MyGrid [x] [y] -}}} retour l'été

Jusqu'à présent, la fonction header est très bien parce que nous indiquant explicitement la taille de chaque dimension. Mais vous pouvez faire ceci:

int AddAll (int MyGrid [] []) {

ou peut-être passer les tailles ainsi:

int AddAll (int MyGrid [] [], les lignes int, int colonnes) {

Mais, malheureusement, lorsque vous compilez une de ces deux lignes, vous obtenez cette erreur:




déclaration de 'MyGrid »comme arraymust multidimensionnelles avoir des bornes pour toutes les dimensions, sauf la première

Cela est étrange: Le compilateur vous dit que vous devez énumérer explicitement toutes les dimensions, mais il est correct si vous laissez une première découpe, comme avec les tableaux unidimensionnels.

Cela signifie donc que cette chose folle compilera:

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

Comment à ce sujet? La raison en est que le compilateur traite tableaux multidimensionnels d'une manière spéciale. Un tableau multidimensionnel est pas vraiment un tableau à deux dimensions, par exemple-, plutôt, il est un tableau d'un tableau.

Ainsi, au plus profond de C ++, le compilateur traite la déclaration MyGrid [5] [6] comme si elle était MyGrid [5]où chaque élément du tableau est lui-même un tableau de taille 6. Et vous êtes libre de ne pas spécifier la taille d'un tableau à une dimension. Eh bien, les premières tranches représentent la partie à une dimension de la matrice. Ainsi vous pouvez laisser cet espace vide, que vous pouvez avec d'autres tableaux unidimensionnels.

Mais alors, après cela, vous devez donner le tableau limites. Et peut-être juste un peu artificiel. Mais il est C ++, et il est la règle: Vous pouvez laisser la première ébauche de dimension dans un en-tête de la fonction, mais vous devez spécifier les tailles de dimensions restantes.

Lors de l'utilisation des tableaux multidimensionnels, il est souvent plus facile si vous pensez d'eux comme un tableau de tableaux. Ensuite, vous utilisez un typedef de sorte que, au lieu d'être un tableau de tableaux, il est un réseau d'un type défini par l'utilisateur, tel que GridRow. Chacune des têtes de fonction suivantes, par exemple, est source de confusion:

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

Voici notre recommandation: Utilisez un typedef. Alors, voici un moyen plus propre:

typedef int GridRow [6] -int AddAll (GridRow MyGrid [], int taille) {int x, y-int somme = 0-en (x = 0- x lt; Taille- x ++) {for (y = y 0- lt; 6- Y ++) {somme + = MyGrid [x] [y] -}}} retour l'été

La typedef ligne définit un nouveau type appelé GridRow. Ce type est un tableau de six nombres entiers. Puis, dans la fonction, vous passez un tableau de GridRows.

L'utilisation de ce typedef est le même qu'en utilisant simplement deux supports, sauf qu'il souligne que vous êtes de passage un tableau de tableaux - soit un tableau dans lequel chaque élément est lui-même un tableau de type GridRow.


» » » » Passant tableaux multidimensionnels en C ++