Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2546 connectés 

  FORUM HardWare.fr
  Programmation
  C

  problème de copie de structure

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème de copie de structure

n°1352724
in_your_ph​ion
Posté le 24-04-2006 à 14:55:00  profilanswer
 

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
mood
Publicité
Posté le 24-04-2006 à 14:55:00  profilanswer
 

n°1352744
Emmanuel D​elahaye
C is a sharp tool
Posté le 24-04-2006 à 15:09:19  profilanswer
 

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/
n°1352747
Taz
bisounours-codeur
Posté le 24-04-2006 à 15:10:52  profilanswer
 

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

n°1352751
Taz
bisounours-codeur
Posté le 24-04-2006 à 15:12:58  profilanswer
 

sinon montre la définition de FreeTriangulation

n°1352796
franceso
Posté le 24-04-2006 à 15:41:02  profilanswer
 

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
n°1352835
in_your_ph​ion
Posté le 24-04-2006 à 16:23:33  profilanswer
 

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
n°1352839
Taz
bisounours-codeur
Posté le 24-04-2006 à 16:26:33  profilanswer
 

montre ton InitMachin stp.

n°1352841
Taz
bisounours-codeur
Posté le 24-04-2006 à 16:28:05  profilanswer
 

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 ?

n°1352843
in_your_ph​ion
Posté le 24-04-2006 à 16:28:23  profilanswer
 

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


n°1352848
in_your_ph​ion
Posté le 24-04-2006 à 16:32:17  profilanswer
 

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)

mood
Publicité
Posté le 24-04-2006 à 16:32:17  profilanswer
 

n°1352852
Taz
bisounours-codeur
Posté le 24-04-2006 à 16:38:01  profilanswer
 

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.

n°1352857
in_your_ph​ion
Posté le 24-04-2006 à 16:42:31  profilanswer
 

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
n°1352865
franceso
Posté le 24-04-2006 à 16:52:40  profilanswer
 

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
n°1352876
in_your_ph​ion
Posté le 24-04-2006 à 17:01:41  profilanswer
 

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
n°1352898
franceso
Posté le 24-04-2006 à 17:18:21  profilanswer
 

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
n°1352919
Taz
bisounours-codeur
Posté le 24-04-2006 à 17:39:00  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  problème de copie de structure

 

Sujets relatifs
probleme d extensions sur upload de fichierproblème exit /b
Problème avec IE, (plantage complet sur mon site)problème page html avecMyeclipse
Problème de bordure de tableau CSS sous Internet Explorerproblème de diaporama creé en javascript
Probléme affichage image avec firefox sur smartblog[Flash] Problème cadre au passage de la souris
Probleme de création "formulaire d'inscription"Probleme Forms [VB.net]
Plus de sujets relatifs à : problème de copie de structure


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR