Initialisation du tableau 2D avec un nombre dynamique de lignes et nombre fixe de colonnes. C ++
-
27-09-2019 - |
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.
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]
estint (*)[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 double
s 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];