problème de copie de structure - C - Programmation
Marsh Posté le 24-04-2006 à 15:09:19
in_your_phion a écrit :
|
Post illisible. Peux tu réduire le nombre de colonnes dans source à 80, par exemple. Merci.
Marsh Posté le 24-04-2006 à 15:41:02
Citation :
|
Le problème avec ça, c'est que tu copies tes champs un par un sans te soucier de ce qu'ils contiennent. Si ta structure contient des pointeurs, les pointeurs sont copiés tels quels et tes deux structures pointent donc vers les mêmes zones mémoires. Il te faut dans ce cas là une fonction qui recopie "intelligeamment" toutes les données de ta structure, en allouant à la main les tableaux de la nouvelle structure et en recopiant les valeurs.
Marsh Posté le 24-04-2006 à 16:23:33
franceso a écrit :
Le problème avec ça, c'est que tu copies tes champs un par un sans te soucier de ce qu'ils contiennent. Si ta structure contient des pointeurs, les pointeurs sont copiés tels quels et tes deux structures pointent donc vers les mêmes zones mémoires. Il te faut dans ce cas là une fonction qui recopie "intelligeamment" toutes les données de ta structure, en allouant à la main les tableaux de la nouvelle structure et en recopiant les valeurs. |
coucou,
merci pour vos réponses ..oui en fait j'ai remarqué ca, donc ce que j'ai fait pour y remedier c'est une version non pointeurs, parce qu'effectivement la structure
Code :
|
contient des pointeurs..alors voila :
Code :
|
Alors ca marche ....mais j'ai un nouveau problème!!! au bout de plusieurs itérations (environ 2000) j'ai un KILL qui apparait sur mon xterm et le programme se termine pourtant je comprend pas parce que plus les itérations augmentent et moins je suis censé avoir de points, c'est à dire moins de calculs...c'est bizarre, ca devrait planter des le début alors mais non. Quelqu'un sait il ce que signifie ce "Kill", merci encore
ps : je sais pas comment reduire le nombre de colonnes, désolé.
Marsh Posté le 24-04-2006 à 16:28:05
triangulate("DYYDQe", &NEW , &RefinedTriangulation, NULL);
avec ça, selon commen c'est fait, tu utilises à chaque fois une addresse d'un objet sur la pile. Sauf qu'à chaque itération, cet objet est écrasé ...
ta chose, ça serait pas un peu comme une liste chaînée ?
Marsh Posté le 24-04-2006 à 16:28:23
Taz a écrit : montre ton InitMachin stp. |
voici la fonction : le type REAL est en fait un double ou float selon, enfin la un float
Code :
|
Marsh Posté le 24-04-2006 à 16:32:17
Taz a écrit : triangulate("DYYDQe", &NEW , &RefinedTriangulation, NULL); |
ben..c'est une triangulation de delaunay en fait j'ai une structure de départ appelée NEW, de type triangulateio. Cette structure contient des champs qui sont principalement des pointeurs vers des tableaux d'entiers, de float.
la fonction triangulate() me fait une triangulation de delaunay à partir de la structure NEW et retourne le résultat dans RefinedTriangulation. La structure NEW contient en fait juste un tableaux avec un ensemble de points, et la fonction triangulate() se contente de remplir les autres champs (qui sont le nombre de triangles, etc)
Marsh Posté le 24-04-2006 à 16:38:01
OK. en fait, tu peux très bien te passer de ta structure temporaire RefinedTriangulation.
Le problème ici est simple : dans triangulate, j'imagines que tu fais des tas de malloc dans les membres de RefinedTriangulation ... sand jamais libérer cette mémoire allouée.
Marsh Posté le 24-04-2006 à 16:42:31
Taz a écrit : OK. en fait, tu peux très bien te passer de ta structure temporaire RefinedTriangulation. |
argh. Le problème c'est que c'est pas moi qui ait programmé la fonction c'est une librarie (triangle quake)...je vais regarder mais ce serait bizarre que les mecs aient mal programmé, non ?
Marsh Posté le 24-04-2006 à 16:52:40
ta bibliothèque doit sans doute fournir une fonction qui libère la mémoire allouée par triangulate. Si tu n'utilises pas cette fonction, tu as des fuites de mémoires énormes et ton programme plante au bout d'un moment.
Marsh Posté le 24-04-2006 à 17:01:41
franceso a écrit : ta bibliothèque doit sans doute fournir une fonction qui libère la mémoire allouée par triangulate. Si tu n'utilises pas cette fonction, tu as des fuites de mémoires énormes et ton programme plante au bout d'un moment. |
ben j'ai regardé mais non en fait il y a une fonction triangledeinit() à la fin de la fonction triangulate(). Je pense que c'est ok, en fait c'est fait exprès de ne pas libérer certains champs. Justement, le plus étrange ..c'est que lorsque j'essaie de faire un free apres l'appel de la fonction triangulate(), j'obtiens un fantastique segmentation fault. Je comprend vraiment pas ......
par exemple :
Code :
|
Marsh Posté le 24-04-2006 à 17:18:21
t'es sur que edgeList a été alloué (y aurait pas un switch à l'appel de triangulate qui indique si tu dois calculer ou non les segments de la triangulation ?)
tu devrais plutôt écrire :
Code :
|
C'est plus lisible à mon avis...
Marsh Posté le 24-04-2006 à 17:39:00
écoute, trouve un exemple de comment on se sert de ta lib, parce là, ça sert à rien de faire des free. lis ta doc, ça doit être écrit sur qui alloue quoi avec comment le désallouer. sinon, on peut pas t'aider.
Marsh Posté le 24-04-2006 à 14:55:00
Bongour !
j'ai un problème de copie de structure ...j'écris unprogramme ou j'ai des itérations et à chaque itération je veux pouvoir copier une structure dans une autre, basiquement mon code est dans ce genre là :
voila et j'ai toujours un segmentation fault quand j'utilise le fonction FreeTriangulation(), et ce dès la deuxième itération. Je comprend pas pourquoi ....comment on fait pour copier une structure ? y'a juste un égal à faire non ?
merci beaucoup par avance,
Message édité par in_your_phion le 24-04-2006 à 14:56:07