Pergunta

Estou tendo problemas em criar minha matriz dinâmica 2D em C ++. Eu quero que ele tenha um número dinâmico (por exemplo, NUMR) de "linhas" e número cortado (por exemplo, 2) de "colunas".

Eu tentei fazer assim:

const numC = 2;
int numR;
numR = 10;
double *myArray[numC];
myArray = new double[numR];

Infelizmente, não funciona. É possível fazer isso dessa maneira?

Claro que eu poderia usar double **myArray e inicialize como se ambas as dimensões fossem dinâmicas (com NUMC usado como limitador no loop), mas eu gostaria de evitá -lo, se possível.

Desde já, obrigado.

Foi útil?

Solução

É possível fazer isso dessa maneira?

Sim:

double (*myArray)[numC] = new double[numR][numC];
// ...
delete[] myArray;

Isso pode parecer um pouco incomum, mas 5.3.4 §5 afirma claramente:

o tipo de new int[i][10] é int (*)[10]

Observe que muitos programadores não estão familiarizados com a sintaxe do declarador C e não entenderão esse código. Além disso, a alocação dinâmica manual não é segura de exceção. Para esses reeons, um vetor de matrizes é melhor:

#include <vector>
#include <array>

std::vector<std::array<double, numC> > vec(numR);
// ...
// no manual cleanup necessary

Substituir std::array com std::tr1::array ou boost::array, dependendo do seu compilador.

Outras dicas

Por que não usar um std :: vetor, e aproveite seu construtor:

std::vector<std::vector<int> > my2Darray(2, std::vector<int>(10));
my2Darray[0][0] = 2;

É preciso haver um loop, pois você precisa criar uma matriz para cada coluna.

Eu acho que o que você procura é:

double *myArray[numC];
for (int i = 0; i < numC; i++) {
    myArray[i] = new double[numR];
}

// some code...

// Cleanup:
for (int i = 0; i < numC; i++) {
    delete [] myArray[i];
}

Isso declara uma variedade de ponteiros (para double) com numC elementos, então cria uma variedade de doubles com numR elementos para cada coluna em myArray. Não se esqueça de liberar a memória quando terminar ou você terá vazamentos de memória.

Seus índices devem ser linhas e coluna.

double** myArray = new double*[numR];
for( unsigned int i = 0; i < numR; i++ ) {
    myArray[i] = new double[numC];
}

Linha de acesso 2, coluna 5:

myArray[2][5];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top