pb de dédoublement du même objet

pb de dédoublement du même objet - C++ - Programmation

Marsh Posté le 28-02-2005 à 10:39:13    

j'ai un problème dans le code suivant:
 

Code :
  1. typedef struct _SonContainer {
  2. ThreatNode *a_node;
  3. _SonContainer *next;
  4. } SonContainer;
  5. class ThreatNode {
  6. private:
  7. SonContainer *son;
  8. OPERATOR op;
  9. char name[NAME_SIZE];
  10. char comment[COMMENT_SIZE];
  11. int probability[PROBABILITY_SIZE];
  12. bool is_root;
  13. bool is_treated;
  14. public:
  15. ThreatNode(OPERATOR, bool is_root = false);
  16. OPERATOR getOperator();
  17. void setOperator(OPERATOR);
  18.     void printProbability();
  19. void setProbability(int[PROBABILITY_SIZE]);
  20. int getProbability(int);
  21. bool isRoot();
  22. void setIsRoot();
  23. bool isTreated();
  24. void setIsTreated();
  25. char* getName();
  26. void setName(char*);
  27. char* getComment();
  28. void setComment(char*);
  29. SonContainer* getSon();
  30. void addSon(ThreatNode*);
  31. int evaluate(int); // evaluate the probability
  32. void printNode();
  33. };


 
 

Code :
  1. int ThreatNode::evaluate(int k) {
  2. cout << "je print la prob de "<<this->getName()<<"\n";
  3. this->printProbability();
  4. SonContainer *a_son_container, *a_brother_container;
  5. ThreatNode *a_son, *a_brother;
  6. int prob, final_prob;
  7. if (this->isTreated())
  8.  return this->probability[k];;
  9. //a_son = this->son;
  10. a_son_container = this->son;
  11. if (a_son_container == NULL) {
  12.  if (this->op != LEAF)
  13.   printf("WARNING: the node %s should be LEAF\n", this->getName());
  14.  return this->probability[k];
  15. }
  16. a_son = a_son_container->a_node;
  17. final_prob = a_son->evaluate(k);
  18. a_son->setIsTreated();
  19. a_brother_container = a_son_container->next;
  20. while (a_brother_container != NULL) {
  21.  a_brother = a_brother_container->a_node;
  22.  prob = a_brother->evaluate(k);
  23.  a_brother->setIsTreated();
  24.  if (this->op == AND)
  25.   final_prob = min_prob(final_prob, prob);
  26.  else
  27.   final_prob = max_prob(final_prob, prob);
  28.  a_brother_container = a_brother_container->next;
  29. }
  30. this->probability[k] = final_prob;
  31. return final_prob;
  32. }


 
 
le pb vient d'ici:
 
dans mon main je fais:
ThreatNode *root;
...
...
root->evaluate(0);
root->evaluate(1);
 
le problème est le suivant: quand je fais root->evaluate(0) tout se passe bien bien, mais quand je fais root->evaluate(1), il ignore le traitement que j'ai fait sur l'objet root en faisant evaluate(0), comme si je dédoublais l'objet chose que je ne veux pas faire, je veux travaillé sur les mêmes objets.
 
si quelqu'un comprend.
Merci de m'expliquer

Reply

Marsh Posté le 28-02-2005 à 10:39:13   

Reply

Marsh Posté le 28-02-2005 à 10:46:39    

tiens du C

Reply

Marsh Posté le 28-02-2005 à 10:49:16    

Taz a écrit :

tiens du C


 
je sais, je suis pas un cador en C++ mais j'ai besoin d'un petit coup de main, car la je vois vraiment pas.
 
Merci

Reply

Marsh Posté le 28-02-2005 à 10:58:05    

Laisse moi deviner: tu t'attends à ce que evaluate(1) te renvoie le même résultat que le evaluate(0) qui précède, grace au calcul de la boucle en fin de fonction qui calcul une prob finale en fonction de tous les noeuds enfants, c'est bien ça ?

Reply

Marsh Posté le 28-02-2005 à 11:02:24    

pretorienx a écrit :

je sais, je suis pas un cador en C++ mais j'ai besoin d'un petit coup de main, car la je vois vraiment pas.
 
Merci

aucun rapport. tu te complique le travail tout seul. remplace tous tes char* et char[] par des std::string, ça fera déjà un problème en moins. Et je ne parle même pas des const

Reply

Marsh Posté le 28-02-2005 à 11:08:08    

Lam's a écrit :

Laisse moi deviner: tu t'attends à ce que evaluate(1) te renvoie le même résultat que le evaluate(0) qui précède, grace au calcul de la boucle en fin de fonction qui calcul une prob finale en fonction de tous les noeuds enfants, c'est bien ça ?


 
non c pas ça.
En faite evaluate(0) doit me renvoyer une proba pour une catégorie de personne et evaluate(1) pour une autre catégorie.  
Et pour ce faire chaque objet possède en donnée membre un tableau de proba, chaque case correspond a 1 type de personne.
Ce que je pensais c ke evaluate 0 va travailler sur tout mes objets, mais précisément sur la donnée membre probability[0],... et de même pour evaluate 1 qui devrait travailler sur probability[1] de tout mes objets.
mais je contaste que root->evaluate(0); puis root->evaluate(1)
ne fais pas ce je j'escompte: on dirait que c 2 root différents alors que c le même., il fait le traitement sur evaluate(0); et le fait sur evaluate(1) sans tenir compte que evaluate(0) a modifier la donnée membre probability[0].
 
Voila.
J'espère avoir été claire.
Un petit coup de main serait le bien venu

Reply

Marsh Posté le 28-02-2005 à 11:17:19    

Taz a écrit :

aucun rapport. tu te complique le travail tout seul. remplace tous tes char* et char[] par des std::string, ça fera déjà un problème en moins. Et je ne parle même pas des const


 
cela me simplifera la vie en quoi ?
et pour les const ?
 
je vois pas trop ce que cela changerait de mettre des std::string

Reply

Marsh Posté le 28-02-2005 à 11:21:52    

pretorienx a écrit :

cela me simplifera la vie en quoi ?
et pour les const ?
 
je vois pas trop ce que cela changerait de mettre des std::string


La correction ne va pas tarder à suivre...  :whistle:  


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 28-02-2005 à 11:49:51    

je me casse

Reply

Marsh Posté le 28-02-2005 à 11:51:52    

Taz a écrit :

je me casse


 
 
je pensais que les gens de ce forum était là pour aider les autres, et pas pour se la peter quand ils savent et que les autres non ?

Reply

Marsh Posté le 28-02-2005 à 11:51:52   

Reply

Marsh Posté le 28-02-2005 à 12:10:24    

Taz a écrit :

je me casse


Non, allez, reviens, explique-lui.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 28-02-2005 à 14:39:09    

aulieu de baragouiner du mauvais C, utilise std::string, std::list et tu verras que ton probleme sera deja plus clair :o

Reply

Sujets relatifs:

Leave a Replay

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