Allocation dynamique Continue
Bonjour,
Actuellement je developpe un programme ayant besoin d'allocation mémoire contenue et j'ai besoin de réallouer cet espace mémoire, c'est un tableau de flotant à trois dimensions. Cependant, des erreurs de segmentation dans mon code. pouvez-vous m'aider car je ne vois vraiment pas l'erreur . Merci,
Mon Code est le suivant :
Structure pour conserver tous les éléments :
Code:
1 2 3 4 5 6 7 8
| typedef struct ougdata_t{
float *ttt;
float **tt;
float ***t;
int n,m,p,c ; /* Index : X,Y,Z */
int max_n,max_m,max_p; /* Capacité : X,Y,Z */
}ougdata_t; |
Code:
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
|
/* Fonction d'allocation de la mémoire au départ */
ougdata_t* initDisplacement(){
int nmp,nm,i,j;
ougdata_t *tmp = (ougdata_t*)malloc(sizeof(ougdata_t));
if(tmp==NULL) return NULL;
tmp->n = 0; /* Initialisation des indices dans le tableau */
tmp->m = 0;
tmp->p = 0;
tmp->max_n = 1000; /* Taille du tableau au départ */
tmp->max_m = 10;
tmp->max_p = 12; /* Taille des déplacements du noeud */
tmp->c=tmp->n;
/* On alloue tout l'esplace mémoire necessaire */
nmp = tmp->max_n * tmp->max_m * tmp->max_p;
tmp->ttt = (float *) malloc(nmp * sizeof(float));
/* Allocation mémoire pour n x m x 1 */
nm = tmp->max_n * tmp->max_m;
tmp->tt = (float **) malloc(nm * sizeof(float *));
/* Allocation mémoire for n x 1 x 1 */
tmp->t = (float ***) malloc(tmp->max_n * sizeof(float **));
/* Attache des différents tableau entre eux */
for (i = 0; i < tmp->max_n; i++){
tmp->t[i] = tmp->tt + tmp->max_m*i;
for (j = 0; j < tmp->max_m; j++){
tmp->t[i][j] = tmp->ttt + tmp->max_m*tmp->max_p*i + tmp->max_p*j;
}
}
return tmp;
} |
/* Fonction pour ajouter une donnée, si la taille de la ligne n'est pas assez grande, on réalloue */
Code:
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
| int AddDisplacement(ougdata_t* tmp, float *val){
int nmp, nm, j, i;
/* Le tableau de donné n'est pas initialisé */
if(tmp->t == NULL) return 0;
/* Le nombre de colonne est au max, nous devons réallouer */
if(tmp->m == tmp->max_m){
printf("Double X");
system("PAUSE");
/* On double la capacité du nombre de ligne du tableau */
tmp->max_m = tmp->max_m*2;
/* Nous devons réallouer un nouvel espace mémoire pour tout contenir */
nmp = tmp->max_n * tmp->max_m * tmp->max_p;
tmp->ttt=(float *)realloc(tmp->ttt,sizeof(float) * nmp);
/* Allocation mémoire pour n x m x 1 */
nm = tmp->max_n * tmp->max_m;
tmp->tt=(float **)realloc(tmp->tt,sizeof(float *) * nm);
/* Pour chaque nouvel emplacement, nous liquons les données */
tmp->t[tmp->n] = tmp->tt + tmp->max_m*tmp->n;
for (j = (tmp->m); j < tmp->max_m; j++){
tmp->t[tmp->n][j] = tmp->ttt + (tmp->max_m*tmp->max_p*tmp->n) + tmp->max_p*j;
}
}
for(i=0;i<12;i++)
tmp->t[tmp->n][tmp->m][i] = val[i];
tmp->m = tmp->m+1;
return 1;
} |
/* Fonction qui permet de passer à une autre ligne */
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
int AddLine(ougdata_t* tmp, hdf_f* tmp_hdf){
int nmp, nm, i,j;
printf("New Line\n");
system("PAUSE");
/* Le tableau de donné n'est pas initialisé */
if(tmp->t == NULL) return 0;
/* Le nombre de ligne est au maximum, nous devons réallouer le tableau pour plus de place */
if(tmp->n == tmp->max_n){
/* Appel à la fonction de vidage du buffer des données dans le tableau de déplacements */
/* Vide le tableau en l'ecrivant dans un fichier */
tmp->n=-1;
}
tmp->n=(tmp->n)+1;
tmp->c = tmp->m;
tmp->m = 0;
return 1;
} |
L'erreur provient juste àpres la fonction addLine().
SVP, cela fait 2 jours que je suis dessus sans succés.