bebert37
Messages postés38Date d'inscriptionjeudi 17 juillet 2003StatutMembreDernière intervention16 février 2005
-
18 juil. 2003 à 10:39
bebert37
Messages postés38Date d'inscriptionjeudi 17 juillet 2003StatutMembreDernière intervention16 février 2005
-
21 juil. 2003 à 15:04
Salut
c'est l'histoire d'un probleme bizarre (les voies de l'informatique sont impenetrables )
J'ai un objet RdP avec son constrcucteur par recopie et une surcharge d'operateur=
Cet objet contient 2 Listes (STL)(LTrans,LPlace). Je veux donc les recopiers dans les 2 cas. Lorsque les deux listes sont recopiees, une autre fonction se met a buguer (Descript()) qui decrit la classe RdP sous la forme d'un string !!! Pour construire ce string j'utilise des methodes Get&Set de mon objet RdP
Je pense que le probleme viens de là puisque si je n'utilise ni la surcharge = ni le constructeur par recopie dans le main() la fonction descript() ne bugue pas.
C'est bizarre non ...
si quelqu'un a une idée ???
merci .
(voici le code )
RdP::RdP(const RdP& o){
Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
strcpy(Nom,o.Nom);
/* je recopie les listes ici */
LPlace = o.LPlace;
LTrans = o.LTrans;
}
RdP RdP::operator=(const RdP& o){
Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
strcpy(Nom,o.Nom);
/* et la */
LPlace = o.LPlace;
LTrans = o.LTrans;
return *this;
}
string RdP::Descript(){
std::string Chaine;
list::iterator p;
list<TransTemp>::iterator t;
Chaine = "Reseaux de Petri : ";
Chaine = Chaine + Nom;
/* recapitulation des Places */
if(LPlace.empty() != true){
p = LPlace.begin();
/* Le Probleme arrive ici */
// lorsqu'on debug ..... BAM ça saute là
// alors que sous le debugger on a acces aux elements du RdP
// on dirait que l'affectation de la chaine bugue à cet endroit précis quoi qu'on fasse
cs_Kaid
Messages postés949Date d'inscriptionmardi 2 octobre 2001StatutMembreDernière intervention 8 juillet 20061 18 juil. 2003 à 14:41
- Dans le constructeur, tu alloues de l'espace pour une chaine de caractères mais tu oublies un caractère pour le '\0' final.
- Même erreur dans l'opérateur d'affectation. De plus, si le membre Nom de la classe pointe déjà sur quelque chose, il faudrait le libérer pour éviter les fuites mémoires.
- Quel est le type de ce que tu stockes dans les std::list ?
bebert37
Messages postés38Date d'inscriptionjeudi 17 juillet 2003StatutMembreDernière intervention16 février 2005 21 juil. 2003 à 09:31
Merci bien pour ton aide precieuse.
c'est une erreur banale et je m'y suis laissé prendre.
Pour ce qui est du type des listes il s'agit d'objets Translation et Places qui sont eux même composés de listes d'objets Arcs, qui pointent sur un objet Place ou Transition suivant le cas. C'est un structure un peu bizarre mais c'est comme ça que sont fait les reseaux de Petri.
bebert37
Messages postés38Date d'inscriptionjeudi 17 juillet 2003StatutMembreDernière intervention16 février 2005 21 juil. 2003 à 11:47
J'ai effectué tous les changements qui s'imposaient malgres cela le probleme persiste.
J'ai remarquer que si j 'enlevai les lignes dans le constructeur par recopie et dans la surcharge d'operateur :
LTrans= o.LTrans
LPlace = o.LPlace
La recopie des liste ne se fait plus : on n'a plus d'erreur mais malheureusement nos listes ne sont alors plus recopiées.
Comment éviter ce probleme ???