Une corruption de ce genre est généralement très difficile à retrouver. Mais c'est généralement du à un dépassement de buffer, alors si tu as des outils pour les dépister, n'hésite pas, sinon il ne te reste plus qu'à passer ton code au peigne fin...
Version imprimable
Une corruption de ce genre est généralement très difficile à retrouver. Mais c'est généralement du à un dépassement de buffer, alors si tu as des outils pour les dépister, n'hésite pas, sinon il ne te reste plus qu'à passer ton code au peigne fin...
quel genre d'outil on utilise pour "depister" ce genre de probleme?
valgrind, je crois bien (mais je n'en suis pas sûr) : Je n'utilise pas les outils de débogage de GCC depuis que j'ai comparé Dev-C++ et Visual...
ok merci pour tes réponses, je poste reposte des que j'ai resolu le probleme...
Ce bout de code ne m'inspire pas confiance :
Tu alloues un tableau et après tu perds le pointeur... Pas une bonne idée...Code:
1
2
3 C = f2float(Size[0], Size[1]); C = GetCoord(Mtab, Size);
Jc
je perds le pointeur? ben si c'est ça c'est surement de là que vient mon erreur... scusez mes modestes connaissances, mais tu me conseilles de faire comment?
parce que si j'alloue pas avec "f2float" j'ai un warning à la compilation: "return adress of a local variable"....
en plus ça expliquerai pourquoi des fois ça plante pendant un free...
En regardant de plus prêt, je vois que tu utilises un pointeur global... Ce n'est pas non très conseillé...
Donc le problème ne vient pas de là si tu ne change jamais la valeur de la variable globale C et qu'à la fin de la fonction tu retournes C (mais alors où est l'intérêt?)
Le plus simple serait d'avoir le code de chacune de tes fonctions... Serait-ce possible?
Jc
ok. Voici les fonctions que j'utilise:
l'appel de mes fonctions:
fonction d'allocation de memoire pour mes tableaux d'entier (celle pour le tableau de flottant est identique mis à part le cast en float)Code:
1
2
3
4
5
6
7
8
9
10
11 int main (int argc, char *argv[]){ C = f2float(Size[0], Size[1]); C = GetCoord(Mtab, Size); Cos = CosCompute(C, Size); C = deletePointer2float(C, Size[0], Size[1]); printMCos(NVecteurs, Cos, Size); Madj = f2int(Size[0], Size[0]); Madj = MadjCreate(Cos, Size, SEUIL); Madj = deletePointer2int(Madj, Size[0], Size[0]); return 0; }
fonction CosCompute appelle GetNorm et GetSProductCode:
1
2
3
4
5
6
7
8 int **f2int(int a, int b){ int i; int **myPointer = (int **)malloc (a * sizeof(int*)); for (i=0; i<a; i++) myPointer[i] = (int *)malloc (b * sizeof(int)); return myPointer; }
fonction de liberation de la memoire alloué pour mes tableaux de flottantsCode:
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 float GetNorm(float *Coord, int *Dimension){ float result = 0; float temp = 0; int i = 0; int siz = Dimension[1]; for (i = 0; i < siz-1; i++) temp = temp + (Coord[i]*Coord[i]); result = sqrt(temp); return result; } float GetSProduct(float *V1, float *V2, int *Dimension){ int i = 0; float result = 0; int siz = Dimension[1]; for (i = 0; i < siz-1; i++){ printf(" i = %d V1 = %f V2 = %f\n", i, V1[i], V2[i]);*/ result = result + (V1[i]*V2[i]); } return result; } float **CosCompute(float **Coord, int *Dimension){ int line = Dimension[0]-1; int i,j; float Scalaire; float NormV[line]; float **Cosinus; Cosinus = f2float(Dimension[0],Dimension[0]); for (i = 0; i < line; i++){ NormV[i] = GetNorm(Coord[i], Dimension); } for (i = 0; i < line; i++){ for (j = i+1; j < line; j++){ Scalaire = GetSProduct(Coord[i], Coord[j], Dimension); Cosinus[i][j] = (Scalaire)/((NormV[i])*(NormV[j])); Cosinus[j][i] = Cosinus[i][j]; } } return Cosinus; }
fonction de conversion du tableau de flottants en entier (0/1) en fonction de SEUIL:Code:
1
2
3
4
5
6
7
8
9
10
11 char **deletePointer2float(float **myPointer, int a, int b){ int i; for (i=0; i < a; i++) { free(myPointer[i]); } free (myPointer); myPointer = NULL; return myPointer; }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int **MadjCreate(float **Cos, int *Size, float SEUIL){ int **TEMP; int i, j; TEMP = f2int(Size[0], Size[0]); for(i = 0; i < Size[0]-1; i++){ for(j = 0; j < i; j++){ if (Cos[i][j] <= SEUIL) TEMP[i][j] = 1; else TEMP[i][j] = 0; TEMP[j][i] = TEMP[i][j]; } } return TEMP; TEMP = deletePointer2int(TEMP, Size[0], Size[0]); }
Valgrind si tu est sous Linux est un bon choix, il permet entre autre de détecter les memory leak, il vérifie et suit chaque malloc/calloc/realloc/free !Citation:
Envoyé par booby
Et le code de GetCoord ?
Et les déclarations des variables globales?
Jc
ok.
en variable globale:
pour getcoord:Code:
1
2int *Size;
Code:
1
2
3
4
5
6
7
8
9
10
11
12 float **GetCoord(char ***M, int *DimTab){ float **coord; int i, j; coord = f2float(DimTab[0]-1,DimTab[1]-1); for (i = 1; i < DimTab[0]; i++){ for (j = 1; j < DimTab[1]; j++) { coord[i-1][j-1] = atof(M[i][j]); } } return coord; }
Et la zone mémoire allouée pour Size et les valeurs que tu y mets?Citation:
Envoyé par booby
Donc je confirme, ta façon d'allouer ton tableau C provoque une fuite de mémoire. Ensuite, on utilise pas atof mais strtod.Citation:
pour getcoord:
Code:
1
2
3
4
5
6
7
8
9
10
11
12 float **GetCoord(char ***M, int *DimTab){ float **coord; int i, j; coord = f2float(DimTab[0]-1,DimTab[1]-1); for (i = 1; i < DimTab[0]; i++){ for (j = 1; j < DimTab[1]; j++) { coord[i-1][j-1] = atof(M[i][j]); } } return coord; }
Jc
ok, merci de te pencher sur mon problème. Serait-il possible, maintenant que je sais mon mes allocations provoquent des fuites de mémoire, de me donner un tout petit exemple d'allocation correctement faite? :ccool:
Citation:
de me donner un tout petit exemple d'allocation correctement faite?
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 **f2int(int a, int b) { int i; int **myPointer = malloc (a * sizeof(int*)); if(myPointer==NULL) { return NULL; } for (i=0; i<a; i++) { myPointer[i] = malloc (b * sizeof(int)); if(myPointer[i]==NULL) { i--; while(i>=0) { free(myPointer[i]); } free(myPointer); return NULL; } } return myPointer; }
Et pareil pour f2float... Par contre, je pense que t'auras encore un problème pour ta déclaration de Size... Ce serait plus simple de l'intégrer dans le main comme tableau statique du main...
Jc
Ok, merci pour ta réponse, j'essaie ça de suite. :merci:
Ok je ferai ça.Citation:
Envoyé par fearyourself
apparemment ça MARCHE!!! un grand merci @ tous!
:lahola: :merci: :lahola: