C++ : allocation d'un tableau à deux dimensions

De Wiki de Calcul Québec
Aller à : Navigation, rechercher
Autres langues :anglais 100% • ‎français 100%

L'allocation d'un tableau à deux dimensions (imax*jmax), où les données sont alignées de façon contiguë en mémoire, n'est pas si triviale en C ou C++. Il faut dans un premier temps créer un vecteur de pointeurs de pointeurs de dimension égale au nombre de lignes du tableau (imax). Ensuite, il faut allouer l'espace mémoire nécessaire pour imax*jmax éléments à partir de la première adresse du tableau. Finalement, il faut s'assurer que les pointeurs du premier élément de chaque ligne pointent à la bonne adresse.

Les deux exemples suivants (un en C et l'autre en C++) illustrent bien comment créer un tableau à deux dimensions d'éléments en double précision.


Fichier : allocation2D.c
/*
Allocation d'un tableau 2D en C
*/
 
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
 
int main(int argc,char** argv)
{
    int i,j,imax,jmax
 
    /* Déclaration du tableau 2D */
 
    double **tableau2D;
 
    /* Allocation du tableau 2D */
    tableau2D = (double **)malloc(sizeof(double *)*imax)
    tableau2d[0] = (double *)malloc(sizeof(double)*imax*jmax);
    for(i=1;i<imax;i++)
        tableau2D[i]=tableau2D[i-1]+jmax;
 
    /* Utilisation du tableau */
 
    for(i=0;i<imax;i++)
    {
        for(j=0;j<jmax;j++)
        {
            tableau2D[i][j]=1.0
        }
    }
 
    /* Libération de la mémoire */
 
    free(tableau2D[0]);
    free(tableau2D);
 
}



Fichier : allocation2D.cpp
//////////////////////////////////////////////////
// Allocation d'un tableau 2D en C++
 
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
 
int main(int argc,char** argv)
{
    int i,j,imax,jmax
 
    // Déclaration du tableau 2D
    double **tableau2D;
 
    // Allocation du tableau 2D
 
    tableau2D = new double*[imax];
    tableau2D[0] = new double[imax*jmax];
    for(i=1;i<imax;i++)
        tableau2D[i]=tableau2D[i-1]+jmax;
 
    // Utilisation du tableau
 
    for(i=0;i<imax;i++)
    {
        for(j=0;j<jmax;j++)
        {
            tableau2D[i][j]=1.0
        }
    }
 
    // Libération de la mémoire
 
    delete [] tableau2D[0];
    delete [] tableau2D;
 
}


Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Ressources de Calcul Québec
Outils
Partager