problème de copie de structure

problème de copie de structure - C - Programmation

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à :
 

Code :
  1. for (i=0;i<steps;i++) { //le nombre d'itérations
  2.    
  3.   struct triangulateio * RefinedTriangulation= malloc(sizeof (struct triangulateio )); //une strucutre avec des tableaux tout ca ..
  4.   InitTriangulation (RefinedTriangulation ); //initialise la structure
  5.   NEW = FindSmallestEdge (&OutputTriangulation); //ca me retourne une nouvelle structure déclareé avant la boucle for, et utilise OutputTriangulation qui est aussi une structure du meme type et déclarée et initialisée avant
  6.   OutputTriangulation = *RefinedTriangulation; //je copie la nouvelle structure dans l'ancienne qui sert de départ pour la fonction FindSmallestEdge()
  7.   FreeTriangulation(&RefinedTriangulation); //ca me libère et met à NULL une structure
  8. }


 
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,
 :love:

Message cité 1 fois
Message édité par in_your_phion le 24-04-2006 à 14:56:07
Reply

Marsh Posté le 24-04-2006 à 14:55:00   

Reply

Marsh Posté le 24-04-2006 à 15:09:19    

in_your_phion a écrit :

Code :
  1. NEW = FindSmallestEdge (&OutputTriangulation); //ca me retourne une nouvelle structure déclareé avant la boucle for, et utilise OutputTriangulation qui est aussi une structure du meme type et déclarée et initialisée avant




Post illisible. Peux tu réduire le nombre de colonnes dans source à 80, par exemple. Merci.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 24-04-2006 à 15:10:52    

ben ici t'as pas besoin d'allocation dynamique alors :)

Reply

Marsh Posté le 24-04-2006 à 15:12:58    

sinon montre la définition de FreeTriangulation

Reply

Marsh Posté le 24-04-2006 à 15:41:02    

Citation :

Code :
  1. OutputTriangulation = *RefinedTriangulation; //je copie la nouvelle structure dans l'ancienne


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.


---------------
TriScale innov
Reply

Marsh Posté le 24-04-2006 à 16:23:33    

franceso a écrit :

Citation :

Code :
  1. OutputTriangulation = *RefinedTriangulation; //je copie la nouvelle structure dans l'ancienne


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 :
  1. triangulateio

contient des pointeurs..alors voila :
 

Code :
  1. struct triangulateio NEW, OutputTriangulation; //deux structures
  2. for (i=0;i<steps;i++) {
  3.    
  4.     struct triangulateio RefinedTriangulation;  //une troisième
  5.    
  6.     printf("[i] Iteration ...%d/%d\r",i,steps); //la c'est pour afficher les itérations
  7.     fflush(stdout);
  8.     InitTriangulation (&RefinedTriangulation ); //ici ca initialise une triangulation de Delaunay :/
  9.     NEW = FindSmallestEdge (&OutputTriangulation); //la ca me retourne une structure de triangulation avec moins de points
  10.     triangulate("DYYDQe", &NEW , &RefinedTriangulation, NULL); //ici ca me fait la triangulation et ma la retourne dans RefinedTriangulation
  11.     OutputTriangulation = RefinedTriangulation; //ici j'interchange avant d'itérer
  12. }

   
 
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  :love:  
 
 
 
 
ps : je sais pas comment reduire le nombre de colonnes, désolé.  :sweat:


Message édité par in_your_phion le 24-04-2006 à 16:27:06
Reply

Marsh Posté le 24-04-2006 à 16:26:33    

montre ton InitMachin stp.

Reply

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 ?

Reply

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 :
  1. void InitTriangulation (struct triangulateio * OutputTriangulation ) {
  2.   OutputTriangulation->pointlist = (REAL *) NULL;
  3.   OutputTriangulation->pointmarkerlist = (int *) NULL;
  4.   OutputTriangulation->trianglelist = (int *) NULL;
  5.   OutputTriangulation->edgelist = (int *) NULL;
  6.   OutputTriangulation->edgemarkerlist = (int *) NULL; 
  7. }


Reply

Marsh Posté le 24-04-2006 à 16:32:17    

Taz a écrit :

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 ?


 
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)

Reply

Marsh Posté le 24-04-2006 à 16:32:17   

Reply

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.

Reply

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.
 
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.


 
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 ?  :sweat:


Message édité par in_your_phion le 24-04-2006 à 16:42:56
Reply

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.


---------------
TriScale innov
Reply

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 :
  1. for (i=0;i<steps;i++) {
  2.    
  3.     struct triangulateio RefinedTriangulation;
  4.    
  5.     printf("[i] Iteration ...%d/%d\r",i,steps);
  6.     fflush(stdout);
  7.      
  8.     InitTriangulation (&RefinedTriangulation );
  9.     NEW = FindSmallestEdge (&OutputTriangulation);
  10.     triangulate("DYYDQe", &NEW , &RefinedTriangulation, NULL);
  11.    
  12.     OutputTriangulation = RefinedTriangulation;
  13.  
  14.     free(&RefinedTriangulation.edgelist[0]); //ceci ne marche pas ......
  15.      //alors que c'est pas censé etre libéré par triangulate()
  16.  
  17.   }


Message édité par in_your_phion le 24-04-2006 à 17:03:51
Reply

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 :
  1. free(RefinedTriangulation.edgelist);

C'est plus lisible à mon avis...


---------------
TriScale innov
Reply

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed