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 :

Arbre Binaire... Ajout et recherche


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Par défaut Arbre Binaire... Ajout et recherche
    Salut a tous. Voila je suis veux créer un arbre binaire contenant des objets. J'ai déjà fait 75% de boulot puisque a parement mon insertion fonctionne. Mais j'ai pas mal de probleme avec ma fonction de recherche.

    En effet, des que je fais une recherche, mon prog plante lorsque j'essaie de quitter la fenetre...

    Quelqu'un pourrait il m'aider ?

    Voici la déclaration de mon arbre :

    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
     
    class CListeProduit
    {
    	private:
    		CProduit m_valeur;
    		class CListeProduit *m_gauche;
    		class CListeProduit *m_droite;
     
    	public:
    		void Insert (CProduit p_ajout);
    		void Liberer ();
    		void Rechercher (TCHAR* p_code);
    		CProduit Afficher (TCHAR* p_code = TEXT(""));
    		CListeProduit()
    		{
    			m_gauche = NULL;
    			m_droite = NULL;
    		}
    		~CListeProduit()
    		{
    			//Liberer();
    		}
     
    };
    Mon Ajout :

    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
     
    void CListeProduit::Insert (CProduit p_ajout)
    {
    	if (wcscmp(m_valeur.GetGenCode(),TEXT("")) != 0)
    	{
    		if (wcscmp(m_valeur.GetGenCode(), p_ajout.GetGenCode()) > 0)
    		{
    			if (m_gauche == NULL)
    				this->m_gauche = new CListeProduit;
     
    			m_gauche->Insert(p_ajout);
     
    		}
    		else
    		{
    			if (m_droite == NULL)
    				this->m_droite = new CListeProduit;
     
    			m_droite->Insert(p_ajout);
    		}
    	}
    	else
    		m_valeur = p_ajout;
    }
    et enfin ma fonction de recherche

    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
     
    CProduit CListeProduit::Afficher (TCHAR* p_code)
    {
    	CProduit tmp;
     
    	//Si on est pas sur le bon produit
    	if (wcscmp(p_code,TEXT("")) != 0)
    	{
    		//Alors si le code est plus grand
    		if (wcscmp(p_code, m_valeur.GetGenCode()) > 0)
    		{
    			//Et que la branche de droite existe
    			if (m_droite == NULL)
    				return tmp;
    			else
    				//On va chercher dans la branche de droite
    				tmp = m_droite->Afficher(p_code);
    		}
    		else if(wcscmp(p_code, m_valeur.GetGenCode()) < 0)
    		{
    			if (m_gauche == NULL)
    				return tmp;
    			else
    				tmp = m_gauche->Afficher(p_code);
    		}
    		else
    			tmp = m_valeur;
     
    	}
    	else
    		tmp = m_valeur;
     
    	return tmp;
    }
    Et la fonction que j'utilise pour detruire mon arbre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void CListeProduit::Liberer()
    {
    	if (m_gauche != NULL)
    		m_gauche->Liberer();
    	if (m_droite != NULL)
    		m_droite->Liberer();
     
    	delete m_gauche, m_droite;
    }
    VOila.

    Lorsque je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SetDlgItemText(hDlg, IDC_GENCODE, ListeProduit.Afficher(mongencode).GetGencode());
    Il m'affiche bien mon gencode et apres... Il plante quand j'essaie de fermer...
    Quelqu'un aurait il une idée ?

  2. #2
    Membre Expert
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Par défaut
    et le debugger t'indique quelle ligne de code ???

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Par défaut
    C'est la que ca devient comique... Je dev pour un peripherique Win CE. Donc a partir du moment ou ca compile, pas moyen de savoir ou ca plante puisque je ne peux pas me servir du debuggeur. C'est d'ailleur aussi pour ca que je ne me suis pas servi d'une CMap ou d'un truc dans le genre...

    En gros la seule chose que je sais c'est que si je ne fais pas de recherche mon app ne plante pas et que si j'en fait une, ca plante... Je sais ca fait pas beaucoup.

    MAis a vu de nez, mon insertion est bonne. J'ai regarder sur 3-4 exemples que j'ai vu sur le net et ca collait a peut pres. La destruction doit coller aussi.

    Donc le probleme doit venir de la recherche. Mais le je ne vois vraiment pas d'ou

  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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (m_gauche == NULL)
                return tmp;
    Dans ce cas tmp n'est pas initialisé. Si la classe CProduit est correctement codée ça ne devrait pas poser de problème, par contre dans le cas contraire ça pourrait expliquer ton plantage. On peut voir cette classe ?

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Par défaut
    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
     
    class CProduit 
    {
    	private:
    		TCHAR m_GenCode[13], m_Des[31], m_Prix[12], m_NbEtiquette[2], m_Promo[12], m_DateCreation[8];
    		TCHAR m_DateCom[8], m_QteCom[10], m_DateLivr[8], m_QteLiv[10], m_DateCaisse[8], m_stock[10];
    		TCHAR m_VenteSem[10], m_NbUC[8];
     
    	public:
     
    		CProduit(){}
    		CProduit(TCHAR* p_GenCode, TCHAR* p_Des, TCHAR* p_Prix, TCHAR* p_NbEtiquette, TCHAR* p_Promo, TCHAR* p_DateCreation, TCHAR* p_DateCom, TCHAR* p_QteCom, TCHAR* p_DateLivr, TCHAR* p_QteLivr, TCHAR* p_DateCaisse, TCHAR* p_stock, TCHAR* p_VenteSem, TCHAR* p_NbUC)
    		{
    			wcscpy(m_GenCode, p_GenCode);
    			wcscpy(m_Des, p_Des);
    			wcscpy(m_Prix, p_Prix);
    			wcscpy(m_NbEtiquette, p_NbEtiquette);
    			wcscpy(m_Promo, p_Promo);
    			wcscpy(m_DateCreation, p_DateCreation);
    			wcscpy(m_DateCom, p_DateCom);
    			wcscpy(m_QteCom, p_QteCom);
    			wcscpy(m_DateLivr, p_DateLivr);
    			wcscpy(m_QteLiv, p_QteLivr);
    			wcscpy(m_DateCaisse, p_DateCaisse);
    			wcscpy(m_stock, p_stock);
    			wcscpy(m_VenteSem, p_VenteSem);
    			wcscpy(m_NbUC, p_NbUC);
    		}
    };

    Je vous mets aussi un exemple d'accesseur... Je vais pas tous vous les mettre apres c'est tous les meme :p

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    TCHAR* GetGenCode ()
    {
    	return m_GenCode;
    }
     
    void SetGenCode (TCHAR* p_texte)
    {
    	wcscpy(m_GenCode,p_texte);
    }

  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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ok, pas de souci de ce côté donc. Par contre... outch ! ce serait tellement plus simple avec des string et les données membres en accès publique. Non ?

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Par défaut
    Pour les string... malheuresement pas possible... Vive l'UNICODE :p

    Sinon pour mettre les chaine en public.... Ca serait plus facil... Mais tellement moins jolie niveau logique objet

  8. #8
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Par défaut
    Apres quelques tests, je viens de trouver, je penses la cause du probleme... A vu de nez c'est la destruction de l'arbre qui merde a mort... En effet, si je ne fais pas de recherche, j'arrive a quitter mon app normalement mais alors... mon periph rame pire qu'un abruti de kolantha poursuivi par un troupeau de croco...

    Je me demandais...

    Est ce que je dois déclarer ma liste comme ca :

    ou comme ca ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CListeProduit *maListe = new CListeProduit;

  9. #9
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pour les string... malheuresement pas possible... Vive l'UNICODE :p
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::basic_string<TCHAR> ustring;
    Par exemple.

    Sinon pour mettre les chaine en public.... Ca serait plus facil... Mais tellement moins jolie niveau logique objet
    Ca c'est discutable... Personnellement je trouve idiot de blinder sa classe d'accesseurs pour ne finalement fournir ni plus ni moins qu'un accès publique. Avec les tableaux de TCHAR ok, cela permettait de cacher l'appel à wsccpy, mais avec des ustring aucune excuse

    Est ce que je dois déclarer ma liste comme ca :
    [...]
    A priori pas besoin d'allouer dynamiquement ta racine, par contre attention aux copies. D'ailleurs tu devrais interdire celle-ci (j'imagine que c'est ce que tu veux) en déclarant constructeur par copie et opérateur d'affectation privés.

  10. #10
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Par défaut
    Je n'ai pas le droit au std... SDK spécial pour périphérique chiant. Bon et pour les TCHAR... C'est une question de point de vue... Et puis de toute maniere c'est fait

    Qu'est ce que tu veux dire par operateur d'affectation privé ? Que je surcharge = pour ma classe ? Pour quelle classe ? L'arbre ou le produit ?

    Pour le produit j'ai déjà fait le constructeur par recopie mais pas la surcharge... Et pour l'arbre... Aucun des deux mais je ne penses pas avoir a copier mon arbre. Il me sert uniquement a stocker des données venant d'un fichier et a faire des recherches dessus...

  11. #11
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pour le produit j'ai déjà fait le constructeur par recopie mais pas la surcharge...
    Pour une classe copiable, ces 3 là vont de paire : constructeur par copie, destructeur et opérateur d'affectation. Ta classe telle qu'elle est pourrait produire ce genre d'incohérence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CProduit a; // Ok, constructeur par défaut
    CProduit b = a; // Ok, constructeur par copie
    b = a; // Nok, pas d'opérateur = défini
    A noter qu'avec des objets automatiques du genre std::string tu n'aurais pas besoin de redéfinir tout ça, mais bon si tu ne peux pas les utiliser.

    Et pour l'arbre... Aucun des deux mais je ne penses pas avoir a copier mon arbre
    C'est bien ce que je disais : il faut donc interdire la copie et l'affectation, ainsi tu es sûr qu'il ne s'en produira pas une malencontreusement (lors d'un passage de paramètre par valeur par exemple).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class CListeProduit
    {
        // ...
     
    private :
     
       CListeProduit(const CListeProduit&); // pas d'implémentation, le but est de générer une erreur si on tente de l'utiliser
       CListeProduit& operator =(const CListeProduit&); // pareil...
    };

  12. #12
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Par défaut
    Alors ca pourrait etre ca qui me fout le brin dans mes objets CProduit... Je vais essayer de surchargé l'opétateur = pour voir si ca change quelque chose.

  13. #13
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si tu n'as que des tableaux statiques dans ta classe alors non, ça ne changera rien. L'opérateur d'affectation défini par le compilateur fera l'affaire, puisqu'il fait une bête copie membre à membre. Par contre si tu avais une ressource ou n'importe quel autre truc dynamique, là ça aurait été une autre histoire.

    Moi je pensais plus à ta classe CListeProduit. Tu es sûr qu'il n'y a jamais aucune copie d'effectuée ?

  14. #14
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Par défaut
    Tout le code que j'utilise est en haut... Les seules chose que je fais avec CListeProduit c'est d'ajouter, de chercher et de la supprimer. Rien d'autre...

Discussions similaires

  1. arbre binaire : ajout d'élements
    Par darkwall_37 dans le forum Débuter
    Réponses: 2
    Dernier message: 01/06/2010, 11h40
  2. Ajout dans les arbres binaires de recherche
    Par chouki dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 28/12/2008, 15h32
  3. Arbre binaire: Ajout précis avec récursion
    Par loic911 dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 22/03/2008, 10h40
  4. Réponses: 11
    Dernier message: 07/04/2004, 13h06
  5. [Arbre binaire de Recherche]
    Par Giovanny Temgoua dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 06/02/2004, 11h45

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