Passando arrays multidimensionais em C ++

Se você tem que passar uma matriz multidimensional para uma função, as coisas podem ficar um pouco peludo. Isso é porque você não tem tanta liberdade em deixando de fora os tamanhos de matriz como você faz com matrizes de uma dimensão. Suponha que você tenha esta função:

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

Até agora, o cabeçalho da função é bom porque estamos declarando explicitamente o tamanho de cada dimensão. Mas você pode querer fazer isso:

int AddAll (int MyGrid [] []) {

ou talvez passar os tamanhos, bem como:

int AddAll (int MyGrid [] [], linhas int, int colunas) {

Mas, infelizmente, quando você compila qualquer uma destas duas linhas, você receber esse erro:

declaração de 'MyGrid "como arraymust multidimensionais têm limites para todas as dimensões, exceto a primeira

Isso é estranho: O compilador está lhe dizendo que você deve listar explicitamente todas as dimensões, mas está tudo bem se você deixar a primeira em branco, como com matrizes unidimensionais.

Então isso significa que essa coisa louca irá compilar:

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

Que tal isso? A razão é que o compilador trata arrays multidimensionais de uma maneira especial. A matriz multidimensional não é realmente uma matriz bidimensional, por exemplo- mas sim, é uma matriz de uma matriz.

Assim, no fundo dentro de C ++, o compilador trata a declaração MyGrid [5] [6] como se fosse MyGrid [5]onde cada item na matriz é em si uma matriz de tamanho 6. E você está livre para não especificar o tamanho de uma matriz unidimensional. Bem, os primeiros suportes representam a porção unidimensional da matriz. Então você pode deixar que o espaço em branco, como você pode com outras matrizes unidimensionais.

Mas então, depois disso, você tem que dar a matriz limites. E talvez apenas um pouco artificial. Mas é C ++, e é a regra: Você pode deixar o primeiro espaço em branco dimensão em um cabeçalho da função, mas você deve especificar os tamanhos de dimensão restantes.

Ao usar arrays multidimensionais, muitas vezes é mais fácil se você pensar neles como um array de arrays. Em seguida, você usar um typedef de modo que, em vez de ser uma matriz de matrizes, é um array de algum tipo definido pelo usuário, tais como GridRow. Um dos seguintes cabeçalhos de função, por exemplo, é confuso:

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

Aqui está nossa recomendação: Use um typedef. Então aqui está uma maneira mais limpa:

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

o typedef linha define um novo tipo chamado GridRow. Este tipo é um conjunto de seis inteiros. Em seguida, na função, você está passando uma matriz de GridRows.

usando este typedef é o mesmo que simplesmente usando dois suportes, exceto que ele enfatiza que você está passando uma de uma matriz - isto é, uma matriz na qual cada membro é em si uma matriz do tipo GridRow.

menu