C – allocation multidimensionnelle de tableau

J’utilise la fonction C suivante pour émuler un tableau 4D. Outre l’ajout de boucles supplémentaires, existe-t-il un bon moyen de rendre cette fonction suffisamment générique pour créer des tableaux à n dimensions?

double ****alloc_4D_data(int wlen, int xlen, int ylen, int zlen) { int i,j,k; double ****ary = (jdouble****)malloc(wlen*sizeof(jdouble***)); for (i = 0; i < wlen; i++) { ary[i] = (jdouble***)malloc(xlen*sizeof(jdouble**)); for (j = 0; j < xlen; j++) { ary[i][j] = (jdouble**)malloc(ylen*sizeof(jdouble*)); for (k = 0; k < ylen; k++) { ary[i][j][k] = (jdouble*)malloc(zlen*sizeof(jdouble)); } } } return ary; } 

En langage C, tous les éléments du tableau multidimensionnel sont stockés dans une zone de mémoire continue. Il suffit donc de calculer le nombre total d’éléments de toutes les N dimensions et de malloc toute la mémoire. Tel que:

 /* int *Nlen is a N length array to store every dimensional array length * int N is the Nlen array length indicates how many dimensions. */ double *alloc_ND_data(int wlen, int *Nlen, int N) { int i; int total = 1; double *array; for(i = 0; i < N; i ++) { /* Every dimension should mul the next depth dimension size */ total *= Nlen[i]; } array = malloc(wlen*total*sizeof(jdouble)); return array; } 

Les tableaux que vous construisez de cette manière ont une structure récursive très évidente. Par exemple, la mémoire de niveau 1 est simplement un tableau de pointeurs vers la mémoire de niveau (i-1). Seule la mémoire de niveau 0 contient les objects réels au lieu de pointeurs. Ainsi, vous pouvez facilement l’implémenter de cette manière, en passant les tailles dans un tableau entier séparé.

La récursion dans ce cas va être la récursion de la queue, ce qui signifie qu’elle peut être assez facilement remplacée par une implémentation réellement cyclique (sans besoin de stockage LIFO intermédiaire). Mais pour moi, cela ressemble à un de ces cas où la récursivité fonctionnera bien et semblera plus lisible.