2010-11-23 7 views
3

J'ai un problème avec la création de mon tableau dynamique 2D en C++. Je veux qu'il ait un nombre dynamique (par exemple numR) de "rangées" et un nombre fixe (par exemple 2) de "colonnes".Initialisation du tableau 2D avec nombre dynamique de lignes et nombre fixe de colonnes. C++

moi avons essayé de le faire comme ceci:

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

Malheureusement, cela ne fonctionne pas. Est-il possible de le faire de cette manière?

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

Merci d'avance.

+1

Qu'est-ce qui ne fonctionne pas exactement? Qu'est-ce que 'threadAccelerationTable' et comment est-il lié à' myArray'? – Cameron

+0

Erreur de frappe :) – Moomin

Répondre

6

Est-il possible de le faire de telle manière?

Oui:

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

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

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

Remarque que de nombreux programmeurs ne connaissent pas la syntaxe du déclarant C et ne comprendront pas ce code. En outre, l'allocation dynamique manuelle n'est pas une exception sûre. 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.

1

Il doit y avoir une boucle car vous devez créer un tableau pour chaque colonne.

Je pense que ce que vous êtes AFTER 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]; 
} 

Ce déclare un tableau de pointeurs (à double) avec numC éléments, crée alors un tableau de double s avec numR éléments pour chaque colonne myArray. N'oubliez pas de libérer la mémoire lorsque vous en avez fini ou si vous avez des fuites de mémoire.

+0

Vous n'avez pas besoin d'une boucle, voir ma réponse. (Je n'ai pas baissé BTW. – fredoverflow

+0

@Fred: Aha, cool! Un peu plus énigmatique, cependant ;-) – Cameron

+0

C'est la syntaxe du déclarant C pour toi :) – fredoverflow

2

Pourquoi ne pas utiliser un std::vector et tirer parti de ses constructor:

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

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]; 
+0

Peu importe ce qui vient en premier, tant qu'il est consistant à les indexer dans le même ordre. – Cameron

+0

Vous n'avez pas besoin d'une boucle, voir ma réponse. (Je n'ai pas downwote BTW.) – fredoverflow

Questions connexes