Question

Je vais avoir mon problème avec la création tableau dynamique 2D en C ++. Je veux qu'il y ait nombre dynamique (par exemple numR) de « lignes » et fixé (par exemple 2) le nombre de « colonnes ».

J'ai essayé de le faire comme ceci:

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

Malheureusement, il ne fonctionne pas. Est-il possible de le faire de la manière d'un tel?

Bien sûr, je pourrais utiliser double **myArray et l'initialiser comme si les deux dimensions sont dynamiques (avec CSPN utilisé comme limiteur en boucle) mais je voudrais éviter, si possible.

Merci à l'avance.

Était-ce utile?

La solution

  

Est-il possible de le faire dans une telle façon?

Oui:

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

Cela peut sembler un peu inhabituel, mais 5.3.4 §5 indique clairement:

  

le type de new int[i][10] est int (*)[10]

Notez que de nombreux programmeurs ne sont pas familiers avec la syntaxe C declarator et ne comprendront pas ce code. En outre, l'allocation dynamique manuelle n'est pas sûr d'exception. Pour ces reaons, un vecteur de tableaux est mieux:

#include <vector>
#include <array>

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

Remplacer std::array avec std::tr1::array ou boost::array, selon votre compilateur.

Autres conseils

Pourquoi ne pas utiliser un std :: vecteur , et profiter de ses constructeur :

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

Il doit être une boucle puisque vous devez créer un tableau pour chaque colonne .

Je pense que ce que vous êtes après est:

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

Ceci déclare un tableau de pointeurs (à double) avec des éléments de numC, crée alors un tableau de doubles avec des éléments de numR pour chaque colonne myArray. Ne pas oublier de libérer la mémoire lorsque vous avez terminé avec elle ou vous aurez des fuites de mémoire.

Vos index doivent être ligne, puis la colonne.

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

ligne d'accès 2, colonne 5:

myArray[2][5];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top