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...
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...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
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...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 GetSProduct
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 flottants
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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 !Envoyé par booby
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Et le code de GetCoord ?
Et les déclarations des variables globales?
Jc
ok.
en variable globale:
pour getcoord:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2int *Size;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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?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.pour getcoord:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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?![]()
de me donner un tout petit exemple d'allocation correctement faite?
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 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.![]()
Ok je ferai ça.Envoyé par fearyourself
Partager