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 :

Mal a la tete avec liste chainée d'objet


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 39
    Points
    39
    Par défaut Mal a la tete avec liste chainée d'objet
    Salut a tous...

    Voila je suis en train d'essayer de creer une liste doublement chainée d'objet et j'avou que je commence a avoir un peu mal a la tete la :p

    Mon objet n'est constitue que de TCHAR (et oui en plus je suis en UNICODE :p ). Voila la déclaration de ma liste (que j'ai aussi creer en tant qu'objet)

    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
    class CListeProduit
    {
    	private:
    		CProduit m_valeur;
    		class CListeProduit *m_Prec;
    		class CListeProduit *m_Suiv;
     
    	public:
    		void Insert (CProduit p_ajout);
    		void Retirer ();
    		void Rechercher (TCHAR* p_code);
    		void Afficher ();
    }
     
    Jusque la pas de probleme... C'est lors de l'ajout que ca coince...
     
    void CListeProduit::Insert (CProduit p_ajout)
    {
    	CListeProduit *nouveau = new CListeProduit;
     
    	nouveau->m_valeur = p_ajout;
    	nouveau->m_Prec = *this;
    	nouveau->m_Suiv = NULL;
     
    	m_Suiv = *nouveau;
     
    	this = nouveau;
    }
    La, impossible de compiler. Pas d'operateur qui prend en charge ma class pour =.

    Quelqu'un pourrait m'aider a demeler le meli melo de pointeur que j'ai dans la tete ?

    Merci d'avance


    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est quelle ligne qui pose problème ?
    Pourquoi n'utilises-tu pas la STL ? Les listes doublement chaînées sont déjà implémentées !

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Les lignes qui posent problemes sont... Toutes celles ou je fais une affectations

    nouveau->m_Prec = *this;
    nouveau->m_Suiv = NULL;

    m_Suiv = *nouveau;
    this = nouveau;


    Et si il existe deja quelque chose qui marche bien ca pourrait peut etre m'interesse :p

    Meme si je prefererai reussir a le coder moi meme :Ego Inside:

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Hum la STL c'est bien connu pour éviter les maux de tete

    regarde de ce coté là :

    http://www.sgi.com/tech/stl/List.html

    notamment du coté de push_front() et push_back()

    essayer la STL c'est l'adopter !


    NhyMbuS

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Sinon concernant tes erreurs, tu essayes d'affecter des CListeProduit à des CListeProduit*. Il ne faut pas déréférencer tes pointeurs.

    La réaffectation de this pose problème aussi. C'est impossible et si tu y réflechis bien, c'est logique (c'est d'ailleurs bien pour cela que this est const).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void CListeProduit::Insert (CProduit p_ajout)
    {
       CListeProduit *nouveau = new CListeProduit;
     
       nouveau->m_valeur = p_ajout;
       nouveau->m_Prec = this;
       nouveau->m_Suiv = NULL;
     
       m_Suiv = nouveau;
     
       // this = nouveau; Outch !
    }
    Et... de manière générale tu t'y prends mal. Idéalement il faut séparer les tâches : l'objet liste ne doit pas être un noeud de celle-ci, mais simplement pointer vers le premier (et le dernier pour une liste double). Il y a pas mal de posts qui parlent de design de liste chaînées, tu peux peut-être trouver plus de détails avec la recherche avancée.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Les autres problemes j'avais trouvé... Mais c'est vrai qu'en ayant réfléchi 2s... la réaffectation de this me choque moi meme...

    Merci du coup de main. Je vais essayer de trouver d'autre exemple pour que ca marche

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Bon apres mur reflexion et une illumination de ma part, j'ai décidé de me lancer dans la création d'un arbre binaire. En effet, je risque d'avoir un grand nombre de données a stocke (jusque 200k lignes) mais je ne peux pas utiliser de bdd... Vive les pockets pc au rabais :p

    Donc en attendant je me suis dit qu'un arbre binare serait mieux car recherche faciliter..

    Voila la dec.

    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
    class CListeProduit
    {
    	private:
    		CProduit m_valeur;
    		class CListeProduit *m_gauche;
    		class CListeProduit *m_droite;
     
    	public:
    		void Insert (CProduit p_ajout);
    		void Retirer ();
    		void Rechercher (TCHAR* p_code);
    		void Afficher ();
    		CListeProduit();
     
    };

    Et l'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
    25
    26
    void CListeProduit::Insert (CProduit p_ajout)
    {
    	if (m_valeur.GetGenCode() != TEXT(""))
    	{
    		if (wcscmp(m_valeur.GetGenCode(), p_ajout.GetGenCode()) > 0)
    		{
    			if (m_gauche != NULL)
    				m_gauche->Insert(p_ajout);
    			else
    				m_gauche = new CListeProduit;
    			m_gauche->Insert(p_ajout);
    		}
    		else
    		{
    			if (m_droite != NULL)
    				m_droite->Insert(p_ajout);
    			else
    				m_droite = new CListeProduit;
    			m_droite->Insert(p_ajout);
    		}
    	}
    	else
    		m_valeur = p_ajout;
     
     
    }
    Ca compile parfaitement. Toutefois, je ne vais pas pouvoir le tester avant un petit moment... Donc si vous pouviez me dire si vous voyez es trucs faux dedans... Je ne suis pas sur de moi au niveau de la création des branches surtout...


    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu veux rechercher un élément en fonction de son identifiant (ici une chaîne), std::map sera parfait.

    Et s'il-te-plaît,

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Bon le je vais exploser... J'ai essayer d'installer la STL. J'ai bien ajouter le dossier dans VS. Mais il ne trouve pas... iostream.h !

    J'ai peut etre oublier de preciser que je dev pour un produit Win CE et que je travailles donc sur EVS. Est il possible que iostream ne soit pas compatible Win CE ?

    Et pour les balises... je n'étais pas au courant (j'entends deja les mais c'est marqué dans les regles :p) et je le ferai maintenant

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu n'as pas à installer la STL, elle vient normalement avec ton compilo quelqu'il soit. Concernant iostream.h, c'est normal, depuis la norme de 98 c'est iostream sans .h (voir la FAQ pour plus de détails).

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    J'ai reussit a ajouter iostream. Mais chez moi il a fallut que je mette #include <iostream.h>.

    Mais la ou je ne comprends plus rien... C'est qu'il ne veut toujours pas que j'utilise le namespace... Des que j'essaie de l'apeller comme la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    	switch (message) 
    	{
    		case WM_INITDIALOG:
    			std::ifstream fichier( "fichier.txt" );
    Il me dit que std n'existe pas...

    [edit]

    En retirant le std:: il ne bloque plus dessus ( a parement il n'y a vais pas besoin de specifier le namespace...)... Mais maintenant je me retrouve avec des unresolved external symbol...

  12. #12
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Quel est la lib relier a iostream ? Parce que generalement les unresolved external c'est que l'on a pas inclu la lib dans le projet.

    J'ai lu a divers endroit qu'il fallait modifier les propriétés du projet (au niveau de use runtime lib) mais je ne peux pas (parce que projet Win CE).

    Quelqu'un aurait une idée ?

  13. #13
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Il n'y a pas de librairies a linker.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <iostream>
    using namespace std;
     
    int main(void) {
       cout << "Coucou" << endl;
       return 0;
    }
    Si tu veux utiliser les listes
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  14. #14
    Membre émérite
    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
    Points : 2 747
    Points
    2 747
    Par défaut
    utilises des pointeurs, ca t'evitera de recréer des instances de CProduit à tout va
    il y a du linge sur la corde à linge

  15. #15
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Le probleme.. C'est que si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    using namespace std;
    Il me dit que std n'est pas un namespace...

    Voila mes déclarations à l'initialisation..

    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
     
     
    // Logistik.cpp : Defines the entry point for the application.
    //
     
    #include <stdio.h>
    #include <windows.h>
    #include <windowsx.h>
    #include <commctrl.h>
     
    #include "stdafx.h"
    #include "Logistik.h"
    #include "Functions.h"
    #include "Inventaire.h"
    #include "audiocapi.h"
    #include "LPro.h"
    #include <ScanCAPI.h>
    #include <fstream.h>
    #include <iostream.h>
     
    using namespace std;
    Et juste avec ca il ne veut pas compiler.

    Si j'essaie de ne pas declarer le namespace, ca ne plante pas. La compil se passe bien. Mais lorsque je fais l'édition des liens, il me sort des nresolved pour chaque fonction apartenant au std que j'utilise...

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    De deux choses l'une :

    1- Ton compilo est vieux ou limité (possible dans ton cas) : en-têtes standards avec .h et pas d'histoire de namespace std.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <fstream.h>
    fstream f;
    2- Ton compilo est suffisamment récent : en-têtes standards sans .h et utilisation de l'espace nommé std.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <fstream>
    std::fstream f;

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tu as quelle version de VS ?
    Tu peux vérifier dans ton aide que le namespace est bien défini pour ta plateforme - il n'y a pas de raison pour que ça ne soit pas le cas, mais bon... -

  18. #18
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    je suis sous Embedded VS 4.0, et non je n'ai pas le choix des outils donc je ne peux pas changer :p.

    Visiblement il faut que je conserve le .h et que je ne declare pas le namespace. Dans ce cas la ca compile normalement.

    Mais lorsque je fais l'édition des liens, je me tape des unresolved external symbol sur les fonction que j'utilises (pour l'instant ifstream je n'ai pas pu en rajouter d'autre étant donné que ca ne marche deja pas).

    Ce qui me parait bzarre c'est que j'ai quand meme deja eu a utiliser iostream pour bien d'autre projet (pour pc normaux ceux la) et que je n'ai jamais eu de probleme... Je me demande si ce n'est pas le fait que je dev pour Win CE qui pourrait poser probleme... Mais ca me paraitrait bizarre parce que iostream est tout de meme une des lib de base...

    Si quelqu'un a une idée parce que la sincèrement... Je me sens un peu perdu

  19. #19
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Je ne connais pas cette version, mais elle est datée de quelle année ?
    Il te faut peut-être ajouter un fichier .lib dans l'édition des liens...

  20. #20
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    J'y avais penseR... Mais pas moyen de trouver a quelle lib correspond iostream...

    Mais ce qui me parait bizarre aussi.. C'est que le chemin vers iostream.h n'"tait pas de base dans la liste des chemins vers les includes. Je l'ai rajoute tout comme celui de slib.

    Je suis en train de me demander si par hasard ca ne serait pas l'install de VS qui serait foireuse... Ce n'est pas moi qui l'ai faite et je ne sais pas si elle aurait pas été faite a l'arrache...

    Je vais essayer de tout desinstaller et reinstaller des fois que...

Discussions similaires

  1. Probléme avec Liste Chainée
    Par Lucas42 dans le forum C
    Réponses: 6
    Dernier message: 24/01/2008, 20h15
  2. Probleme avec liste chainée
    Par Lucas42 dans le forum C
    Réponses: 3
    Dernier message: 20/11/2007, 19h46
  3. probleme avec liste chainée
    Par isoman dans le forum C
    Réponses: 14
    Dernier message: 29/11/2006, 23h03
  4. probleme avec liste chainée
    Par Liiscar dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 28/11/2006, 20h37
  5. [debutant] pb avec liste Chainée.
    Par FamiDoo dans le forum Débuter
    Réponses: 2
    Dernier message: 19/03/2006, 16h41

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