bonjour comment allouer la mémoire pour un tableau 3 D?
bonjour comment allouer la mémoire pour un tableau 3 D?
Salut,
En calculant le nombre d'éléments de ton tableau * la taille d'une cellule
Ou je ne comprend pas bien ta question ?
non je voulais savoir avoir les malloc car je ne connais pas au départ la taille de mon tableau;
int *** tableau_3D;
et j'ai par exemple hauteur , largeur, profondeur comme dimentions
Quelles boucles avec malloc dois je faire?
Bonjour,
le principe est le même qu'avec 2 dimensions :
Comment allouer dynamiquement un tableau à 2 dimensions ?
alors pour un 3-D je dois ajouter dans le boucle de i une boucle j :
//1D
tab = malloc ( sizeof(*tab) * taille);
//2D
for (i=0; i<taille; i++)
{
tab[i] = malloc ( sizeof(**tab) * taille2);
//3D
for (j=0; j<taille; j++)
tab[i] [j]= malloc ( sizeof(**tab) * taille3);
}
??? C'EST ÇA?
Lorsqu'on fait de l'allocation dynamique, il faut toujours faire des tests sur le retour de la fonction malloc. C'est une erreur grave de ne pas le faire...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 int ***allocation(int premdim, int deuxdim, int troisdim) { int i,j,k; int ***res; //1ere dimension res = (int ***) malloc(sizeof(int**) * premdim); if(res==NULL) return NULL; //2ere dimension for(i=0;i<premdim;i++) { printf("%d\n",i); res[i] = (int **) malloc(sizeof(int *) * deuxdim); if(res[i] == NULL) { //Probleme on libére la mémoire for(; i>=0;i--) free(res[i]); free(res); return NULL; } //2eme dimension for(j=0;j<deuxdim;j++) { res[i][j] = (int *) malloc(sizeof(int) * troisdim); //Si probleme if(res[i][j] == NULL) { //On libere la memoire for(;j>=0;j--) free(res[i][j]); for(i=0;i<premdim;i++) free(res[i]); free(res); return NULL; } //Initialisation à 0 for(k=0;k<troisdim;k++) res[i][j][k] = 0; } } return res; }
Le même en un peu plus court avec le code de destruction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 int *** CreerTab(int dim1, int dim2, int dim3) { int i; int * p = malloc(dim1*dim2*dim3*sizeof(int)); int **pp = malloc(dim1*dim2*sizeof(int*)); int *** tab = malloc(dim1*sizeof(int**)); if(p==NULL || pp==NULL|| tab ==NULL) { free(p); free(pp); free(tab); return NULL; } for(i=0; i<dim2*dim1;i++) pp[i] = p+i*dim3; for(i=0; i<dim1;i++) tab[i] = pp+i*dim2; return tab; } void DetruireTab(int*** Tab) { free(Tab[0][0]); free(Tab[0]); free(Tab); } .... int*** tab; tab = CreerTab(2,3,5); ..... tab[1][2][3] = 12345; tab[0][1][2] = 789; .... DetruireTab(tab);
Faut-il encore pouvoir faire l'allocation... Pas toujours possible. Ma solution découpe la mémoire en plusieurs sous-blocs...int * p = malloc(dim1*dim2*dim3*sizeof(int));
Mais je suis d'accord avec ta solution...
Partager