Domanda

Sto avendo problemi con la creazione di mia matrice dinamica 2D in C ++. I desidera avere numero dinamica (ad esempio numR) di "righe" e fissato (esempio 2) numero di "colonne".

Ho provato a fare in questo modo:

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

Purtroppo, non funziona. E 'possibile farlo in tal modo un?

Naturalmente ho potuto utilizzare double **myArray e inizializzarlo come se entrambe le dimensioni sono dinamiche (con NUMC usato come limitatore in loop) ma vorrei evitare se possibile.

Grazie in anticipo.

È stato utile?

Soluzione

  

E 'possibile farlo in tal modo un?

Si

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

Questo può sembrare un po 'inusuale, ma 5.3.4 §5 afferma chiaramente:

  

il tipo di new int[i][10] è int (*)[10]

Si noti che molti programmatori non hanno familiarità con la sintassi dichiaratore C e non capiranno questo codice. Inoltre, l'allocazione dinamica manuale non è sicuro eccezione. Per queste reaons, un vettore di array è meglio:

#include <vector>
#include <array>

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

Sostituire std::array con std::tr1::array o boost::array, a seconda del compilatore.

Altri suggerimenti

Perché non usare un std :: vector , e approfittare del suo costruttore :

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

Ci deve essere un loop in quanto è necessario per creare un array per ogni colonna .

Credo che quello che cercate è:

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];
}

Questo dichiara un array di puntatori (a double) con elementi numC, poi crea un array di doubles con elementi numR per ogni colonna in myArray. Non dimenticate di rilasciare la memoria quando si è fatto con esso o avrete perdite di memoria.

I tuoi indici dovrebbero essere fila, poi colonna.

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

Accesso riga 2, colonna 5:

myArray[2][5];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top