IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

pb de déboublement d'objet


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Par défaut pb de déboublement d'objet
    J'ai un pb sur le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    typedef struct _SonContainer {
    	ThreatNode *a_node;
    	_SonContainer *next;
    } SonContainer;
     
     
    class ThreatNode {
    private:
    	SonContainer *son;
    	OPERATOR op;
    	char name[NAME_SIZE];
    	char comment[COMMENT_SIZE];
    	int probability[PROBABILITY_SIZE];
    	bool is_root;
    	bool is_treated;
    public:
    	ThreatNode(OPERATOR, bool is_root = false);
     
    	OPERATOR getOperator();
    	void setOperator(OPERATOR);	
        void printProbability();
    	void setProbability(int[PROBABILITY_SIZE]);
    	int getProbability(int);
     
    	bool isRoot();
    	void setIsRoot();
     
    	bool isTreated();
    	void setIsTreated();
     
    	char* getName();
    	void setName(char*); 
     
    	char* getComment();
    	void setComment(char*); 
     
     
    	SonContainer* getSon();
    	void addSon(ThreatNode*);
     
    int evaluate(int); // evaluate the probability
     
     
    	void printNode();
     
    };

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    int ThreatNode::evaluate(int k) {
    	cout << "je print la prob de "<<this->getName()<<"\n";
    	this->printProbability();
    	SonContainer *a_son_container, *a_brother_container;
    	ThreatNode *a_son, *a_brother;
    	int prob, final_prob;
     
    	if (this->isTreated())
    		return this->probability[k];;
     
    	//a_son = this->son;
    	a_son_container = this->son;
     
    	if (a_son_container == NULL) {
    		if (this->op != LEAF)
    			printf("WARNING: the node %s should be LEAF\n", this->getName());
    		return this->probability[k];
    	}
     
    	a_son = a_son_container->a_node;
    	final_prob = a_son->evaluate(k);
    	a_son->setIsTreated();
     
    	a_brother_container = a_son_container->next;
     
    	while (a_brother_container != NULL) {
    		a_brother = a_brother_container->a_node;
    		prob = a_brother->evaluate(k);
     
    		a_brother->setIsTreated();
     
    		if (this->op == AND)
    			final_prob = min_prob(final_prob, prob);
    		else
    			final_prob = max_prob(final_prob, prob);
     
    		a_brother_container = a_brother_container->next;
    	}
    	this->probability[k] = final_prob;
    	return final_prob;
    }
    dans mon main je fais
    ThreatNode *root;
    ...
    root->evaluate(0);
    root->evaluate(1);

    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

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    A priori ton code est correct, mais bon difficile d'en dire plus sans savoir ce qu'il est censé faire. Essaye de mettre des affichages un peu partout pour voir à quel moment ta fonction ne se comporte pas comme prévu.
    A quel endroit root->evaluate(1) a besoin de probability[0], dans ta fonction ?

    PS : oublie un peu la syntaxe du C Et le préfixage par un underscore est réservé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct SonContainer {
       ThreatNode *a_node;
       SonContainer *next;
    };

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Par défaut
    Citation Envoyé par Loulou24
    A priori ton code est correct, mais bon difficile d'en dire plus sans savoir ce qu'il est censé faire. Essaye de mettre des affichages un peu partout pour voir à quel moment ta fonction ne se comporte pas comme prévu.
    A quel endroit root->evaluate(1) a besoin de probability[0], dans ta fonction ?

    PS : oublie un peu la syntaxe du C Et le préfixage par un underscore est réservé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct SonContainer {
       ThreatNode *a_node;
       SonContainer *next;
    };


    ok, merci pour le conseil.
    En ce qui concerne, mon code et là ou ça dérrape, c'est là:
    root->evaluate(0); // ok ça roule
    root->evaluate(1); // il vire ce ke 0, a fait

    voila

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ce que je voulais dire c'est que dans evaluate(k) a priori on n'a toujours besoin que de probability[k]. Je ne vois pas de "k - 1", qui ferait que evaluate(1) aurait besoin de probability[0].
    Quand tu dis "il vire ce ke 0, a fait", à quoi le vois-tu exactement ? Tu as comparé les valeurs de probability[0] avant et après appel à evaluate(0) et evaluate(1) ?

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Par défaut
    Citation Envoyé par Loulou24
    Ce que je voulais dire c'est que dans evaluate(k) a priori on n'a toujours besoin que de probability[k]. Je ne vois pas de "k - 1", qui ferait que evaluate(1) aurait besoin de probability[0].
    Quand tu dis "il vire ce ke 0, a fait", à quoi le vois-tu exactement ? Tu as comparé les valeurs de probability[0] avant et après appel à evaluate(0) et evaluate(1) ?

    imagine j'ai mes objet Node.
    Chaque objet possède une donnée membre probability[PROBA_SIZE];

    Donc evaluate(0), travaille sur la donnée membre probability[0] de tous les objets.
    Et evaluate(1), travaille sur la donnée membre probability[1] de tous les objets.

    et le problème c'est que lorsque je fais evaluate(1), après evaluate(0);
    la probability[0] qui aurait du changer avec evaluate(0); ne change pas .

    en gros imagine je voudrais un tab final avec [0.2;0.4]
    et lorsque j'exécute j'ai:
    root->evaluate(0); // tabfinal=[0.2;0]
    root->evaluate(1);//tabfinal=[0;0.4] alors que je voulais [0.2;0.4]

    j'espère que tu as mieux compris.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Oui j'ai compris

    Donc comme je te disais, le meilleur moyen est d'afficher à chaque étape les valeurs de probability[0] pour voir à quel moment il est remis à zéro (tu es sûr qu'il est mis à 0.2 par evaluate(0) au moins ?). Bref il faut voir comment se comporte ton programme et à quel endroit ça merde.

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Par défaut
    Citation Envoyé par Loulou24
    Oui j'ai compris

    Donc comme je te disais, le meilleur moyen est d'afficher à chaque étape les valeurs de probability[0] pour voir à quel moment il est remis à zéro (tu es sûr qu'il est mis à 0.2 par evaluate(0) au moins ?). Bref il faut voir comment se comporte ton programme et à quel endroit ça merde.
    en fait ça merde quand je rentre dans root->evaluate(1);
    je comprends pas pourquoi il croit que c'est un autre objet.

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Dans le code que tu nous présentes c'est bien le même objet (affiche la valeur de this pour t'en assurer). L'erreur doit venir d'ailleurs.
    Mais je te le répète, avec le peu d'information dont on dispose on ne pourra pas t'aider (à moins que j'ai loupé quelque chose de vraiment flagrant dans ton code), c'est à toi de faire un petit boulot de debugging. Avec quelques tests bien placés tu devrais être en mesure de savoir exactement ce qui cloche dans ton programme, et pourquoi ta variable n'a pas la valeur escomptée.

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Par défaut
    Citation Envoyé par Loulou24
    Dans le code que tu nous présentes c'est bien le même objet (affiche la valeur de this pour t'en assurer). L'erreur doit venir d'ailleurs.
    Mais je te le répète, avec le peu d'information dont on dispose on ne pourra pas t'aider (à moins que j'ai loupé quelque chose de vraiment flagrant dans ton code), c'est à toi de faire un petit boulot de debugging. Avec quelques tests bien placés tu devrais être en mesure de savoir exactement ce qui cloche dans ton programme, et pourquoi ta variable n'a pas la valeur escomptée.
    j'ai trouvé ma faute...
    En fait chaque objet possède un bool pour savoir s'il a été traité ou non et je ne remet pas bool a false apres le premier traitement.

  10. #10
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    Bonjour,

    N'oublie pas de mettre le tag [RESOLU], merci.

    Citation Envoyé par pretorienx
    j'ai trouvé ma faute...
    En fait chaque objet possède un bool pour savoir s'il a été traité ou non et je ne remet pas bool a false apres le premier traitement.
    Loulou24 aurait pu détecter ton erreur dès le 1er post si tu avais donné plus d'informations dès le début. Lorsqu'une fonction perso ne donne pas le résultat escompté, on peut difficilement deviner d'où vient l'erreur sans le code.

    La prochaine fois pense que nous ne disposons pas de toutes les infos contrairement à toi

  11. #11
    mat.M
    Invité(e)
    Par défaut
    pretorienx , tu sais qu'en général les compilos C++ sont livrés avec un excellent outil qui s'appelle débogueur et qu'en mettant des points d'arrêt sur une portion de code qui pose problème on a les valeurs instantanées des variables

    C++ Builder , VC++ et sûrement KDevelop ont ça .....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. codage objet
    Par charly dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 22/08/2002, 16h49
  2. algo : rotation d'objet 3d
    Par numeror dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/08/2002, 22h58
  3. Importer des objets de 3dsMax
    Par Anonymous dans le forum OpenGL
    Réponses: 3
    Dernier message: 06/05/2002, 13h53
  4. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20
  5. [Kylix] Erreur objet
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo