2009-02-17 10 views
1

Comment initialiser et désinitialiser un tableau de caractères multidimensionnel en C++?Tableau de caractères multidimensionnel

+1

Dépend de la langue. Et que voulez-vous dire par uninitialize? – tehvan

+0

Je dois être aveugle, vous avez déjà spécifié en C++: S – tehvan

+0

La balise de devoirs est obsolète. –

Répondre

4

Lisez le FAQ - vous y trouverez tout ce dont vous avez besoin!

Création:

alloués statiquement:

char mda[ dim1_size ][ dim2_size ]...[ dimn_size ]; 

alloué dynamiquement: appels. Nested new[]

Initialisation:

pour les boucles Nested; autant de for que de dimensions.

Unitialisation: Voulez-vous dire Destruction?

Allocation statique: le compilateur le fait lorsque le cadre de la pile est déroulé (ou pour les variables globales - lorsque le programme s'arrête).

Dynamiquement alloué:

Using nested delete[]. 
0

vous pouvez initialiser un tableau multidimensionnel comme ceci:

int grid[2][3] = {1, 3, 5, 2, 4, 6}; 

dans ce cas, les valeurs séparées serait:

grid[0, 0]: 1 
grid[0, 1]: 3 
grid[0, 2]: 5 
grid[1, 0]: 2 
grid[1, 1]: 4 
grid[1, 2]: 6 
1

Un extrait rapide - il compile en g ++.

int rows = 10; 
int cols = 10; 

char** array = new char*[rows]; 
for(int i = 0; i < cols; ++i) { 
    array[i] = new char[cols]; 
} 

//do stuff with array 

for(int i = 0; i < cols; ++i) { 
    delete array[i]; 
} 
delete array; 
+1

Oh mon dieu c'est affreux. C'est C avec un déguisement en C++! –

1

Ce qui est intéressant, et cela nécessite un regard sérieux.

La réponse donnée par roo est largement utilisé, mais j'aime son observation - juste parce qu'il compile ne je pense pas que cela fonctionne signifie

une meilleure solution serait d'allouer un bloc contigious de mémoire (rows * cols) longtemps et ensuite le traiter comme un tableau 2D?

+1

Il serait intéressant d'allouer un bloc de mémoire contigu mais, ce faisant, vous perdez toute possibilité de changer la taille de votre tableau dans chaque dimension. –

2

Je vous suggère d'utiliser la bibliothèque Boost.Multi_Array. La dimension du tableau doit être fournie au moment de la compilation, mais les tailles ne sont utilisées qu'à l'exécution. Cela signifie que vous avez les avantages de l'allocation dynamique sans avoir à faire face à des problèmes de mémoire. Voici l'exemple de Boost documentation.

int 
main() { 
    // Create a 3D array that is 3 x 4 x 2 
    typedef boost::multi_array<double, 3> array_type; 
    typedef array_type::index index; 
    array_type A(boost::extents[3][4][2]); 

    // Assign values to the elements 
    int values = 0; 
    for(index i = 0; i != 3; ++i) 
    for(index j = 0; j != 4; ++j) 
     for(index k = 0; k != 2; ++k) 
     A[i][j][k] = values++; 

    // Verify values 
    int verify = 0; 
    for(index i = 0; i != 3; ++i) 
    for(index j = 0; j != 4; ++j) 
     for(index k = 0; k != 2; ++k) 
     assert(A[i][j][k] == verify++); 

    return 0; 
} 
0

Je l'ai appris avec une planche de tic tac toe

const int ROW = 3; 
const int COLUMN = 3; 
char board [ROW] [COLUMN] = {{'O', 'X', 'O'}, 
          {'X', 'X', 'X'}, 
          {'X', 'O', 'X'}}; 

J'espère que cela a aidé.

Questions connexes