La méthode plus pédagogique mais moins optimale (101 appels à malloc) est la suivante:
Code :
- double** abondances_s_tab; // utilisé comme double abondances_s_tab [nb_sp] [100];
- abondances_s_tab = (double **) malloc(nb_sp * sizeof(double*));
- for (i = 0; i < nb_sp; ++i) {
- abondances_s_tab[i] = (double *) malloc(100 * sizeof(double));
- }
- // a ce stade, on peut employer abondances_s_tab comme un tableau
|
La méthode la plus optimale (2 appels à malloc seulement) est la suivante:
Code :
- double** abondances_s_tab; // utilisé comme double abondances_s_tab [nb_sp] [100];
- abondances_s_tab = (double **) malloc(nb_sp * sizeof(double*));
- abondances_s_tab[0] = (double *) malloc(nb_sp * 100 * sizeof(double));
- for (i = 0; i < nb_sp; ++i) {
- abondances_s_tab[i] = (*abondances_s_tab + (100 * i));
- }
- // a ce stade, on peut employer abondances_s_tab comme un tableau
|
Noter aussi qu'avec cette dernière méthode, tous les doubles sont rangés dans une zone contiguë en mémoire, comme ce serait le cas si on avait un vrai tableau.
Dans les deux cas, on alloue nb_sp * (sizeof(double*) + 100 * sizeof(double)) octets. On alloue donc nb_sp * sizeof(double*) octets de plus (ie la première allocation) que pour un vrai tableau.
A+,
Message édité par gilou le 23-11-2015 à 15:00:16
---------------
There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! --