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 :

Liste chainée générique en c++


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 62
    Points : 38
    Points
    38
    Par défaut Liste chainée générique en c++
    Bonjour,

    voila, je veux faire une liste chainée générique ou plutot polymorphique !!
    dans ma classe Element j'ai un membre donné de type void* pour pouvoir stocké n'importe quel type que je veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Element 
    {
      friend class Liste; 
      private:
        Element ( void * unNombre );
        Element ( const Noeud & unNoeud ); 
     
        void * MonNombre; 
        Noeud * suivant; 
    };
    mais quand je veux ajouté un element de type float dans ma liste grace à une méthode 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
     
    void Liste :: Ajouter( void * leNombre )
    {
      Element * punNouveauNoeud = new Element( leNombre );
      if ( prmier  == 0 )
      {
        prmier =  punNouveauNoeud;
      }
      else
      {
        while( Suivant() ){} 
        courant->suivant = punNouveauNoeud;
     
      }
      courant = prmier; 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneListe->Ajouter((void*)3.15);
    j'ai cette erreur :
    cannot convert '3.149999...' from type 'double' to type 'void*'

    Et dans le cas d'un type de char, ça s'ajoute mais c'est au niveau d'affichage que je coince !! quoi faire SVP

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    Pour le premier point (l'appel), il serait plus juste de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double val = 3.15;
    void* p = static_cast<void*>(&val);
    uneListe->Ajouter(p);
    Cordialement,
    A.
    Un ordinateur fait au bas mot 1 million d'opérations à la seconde, mais il n'a que ça à penser, aussi. (brèves de comptoirs, JM.Gourio)


  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Et attention à la durée de vie.
    Ton double doit survivre à la liste, car il n'est pas copié.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Et au lieu d'utiliser des void* utilisent des templates.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  5. #5
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Mis à part si c'est un exercice, je te conseille plutôt d'utiliser std::list<boost::any> .

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 62
    Points : 38
    Points
    38
    Par défaut
    Ok, Merci ^^

    ça marche, mais j'ai toujour un probléme d'affichage ! maintenant même pour les double

    Avec des template je ne peut faire que des liste d'Entier, ou Double, Char,...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Liste <int> I;
    Liste <double> D;
    Or, moi je veux faire un truc :
    premier->int->char->float->int->NULL : polymorphique quoi !

    Et le boost::any ou le boost::variant, c''est pas quelque chose de standard

  7. #7
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Goten Voir le message
    Et au lieu d'utiliser des void* utilisent des templates.
    +1
    Les template, c'est fait pour ça. Les void*, bof bof.
    Boost::any ça va rajouter de la complexité pour rien. Les template s'en chargent largment.

  8. #8
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Bah les templates c'est pour faire une liste qui contient UN SEUL type d'éléments (voir ses sous-types éventuellement). une list de boost::any c'est pour faire une liste hétérogène.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 62
    Points : 38
    Points
    38
    Par défaut
    Avec des template je ne peut faire que des liste d'Entier, ou Double, Char,...
    Code :
    Liste <int> I;
    Liste <double> D;
    Or, moi je veux faire un truc :
    premier->int->char->float->int->NULL : polymorphique quoi !

    Et le boost::any ou le boost::variant, c''est pas quelque chose de standard
    Et si vous me répondiez à ma question, plutôt ??
    Comment afficher mes Elements ?? parce ke ça marche que pour des int

  10. #10
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Alp Voir le message
    Bah les templates c'est pour faire une liste qui contient UN SEUL type d'éléments (voir ses sous-types éventuellement). une list de boost::any c'est pour faire une liste hétérogène.
    Certes... il faut demander au posteur ce qu'il veut!
    • Stocker dans une liste chainée n'importe quel type d'éléments, qui peuvent être chacun de type différent.
    • Stocker dans une liste chainée n'importe quel élément du même type.

    medi, qu'est ce qu'il te faut ? 1 ou 2 ?

  11. #11
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par Alp Voir le message
    Bah les templates c'est pour faire une liste qui contient UN SEUL type d'éléments (voir ses sous-types éventuellement). une list de boost::any c'est pour faire une liste hétérogène.

    Ben j'avais pas compris ça à la lecture de son premier post.. Maintenant qu'il la précisé oui t'a raison, c'est bien une liste hétérogène, donc boost::any.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 62
    Points : 38
    Points
    38
    Par défaut
    LE 2
    Stocker dans une liste chainée n'importe quel type d'éléments, qui peuvent être chacun de type différent.
    Et surtout comment afficher les élément de ma liste ??

  13. #13
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Goten Voir le message
    Ben j'avais pas compris ça à la lecture de son premier post.. Maintenant qu'il la précisé oui t'a raison, c'est bien une liste hétérogène, donc boost::any.
    Pareil
    Donc +1 pour std::list<boost::any>

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 62
    Points : 38
    Points
    38
    Par défaut
    Donc +1 pour std::list<boost::any>
    le boost::any ou le boost::variant, c''est pas quelque chose de standard !!

    Et je ne me suis pa prét pour refaire tot mon code !!

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 62
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par agamitsudo Voir le message
    Bonjour,

    Pour le premier point (l'appel), il serait plus juste de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double val = 3.15;
    void* p = static_cast<void*>(&val);
    uneListe->Ajouter(p);
    Cordialement,
    A.
    pourquoi c'est plus juste ?, alors que pour les int je fais que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneListe->Ajouter((void*)314);

  16. #16
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Je comprend ce que tu veux dire. Maintenant, nous te proposons une autre voie, celle de boost. Pourquoi?

    1 - Le code que tu nous montre prouve que tu débutes en C++. Sinon tu n'essaierai même pas ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneListe->Ajouter((void*)3.15);
    3,15 n'est pas un pointeur, donc le cast échoue, bien évidemment. Et en plus tu fournis un objet temporaire, qui sera détruit dès que tu sors de la portée! C'est dangereux, tu risques une seg fault à tous les coups.

    2 - Tout Boost n'est pas standard il est vrai, mais ça reste LA bibliothèque actuelle de référence C++ . On t'encourage donc à la télécharger, la compiler et à l'utiliser. D'ailleurs un formidable exemple de ce que tu veux faire existe déjà ICI

    Bonne continuation ,

    Poukill

  17. #17
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Ca c'est un cast à la "C-style" en C++ on utilise les casts en _cast<> qui sont beaucoup plus propres et moins dangereux .

    http://cpp.developpez.com/faq/cpp/in...s#DIVERS_casts


    edit : encore une fois... trop lent :p
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  18. #18
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par poukill Voir le message
    2 - Tout Boost n'est pas standard il est vrai, mais ça reste LA bibliothèque actuelle de référence C++ . On t'encourage donc à la télécharger, la compiler et à l'utiliser. D'ailleurs un formidable exemple de ce que tu veux faire existe déjà ICI
    Toutefois, on a une petite floppée de bibliothèques de Boost qui seront standards en C++0x.

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 62
    Points : 38
    Points
    38
    Par défaut
    okey, Merci les gars pour vos explication, mais c'est un school project ! alors je suis obligé de travaillé avec void* ! Et aussi je suis obligé de trouver une méthode pour afficher les éléments de la liste ! parce que je n'ai pas encore trouver comment afficher les éléments Double et char

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par _medi Voir le message
    pourquoi c'est plus juste ?, alors que pour les int je fais que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    uneListe->Ajouter((void*)314);
    Ne fais pas ça.
    Si tu tiens à faire un truc de ce genre, utilise des intptr_t, pas des void*. Et encore, même avec ça, tu ne pourras pas mettre un double dans ta liste sur un système 32 bits.

    De plus, je te conseille de rajouter à ta liste un indicateur de type (un entier avec des valeurs précises)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Liste doublement chainée générique, erreurs !
    Par Virus721 dans le forum C++
    Réponses: 4
    Dernier message: 05/11/2010, 13h47
  2. Réponses: 4
    Dernier message: 30/10/2009, 11h45
  3. Réponses: 25
    Dernier message: 17/11/2008, 09h11
  4. Liste chainée double générique
    Par issou dans le forum C
    Réponses: 3
    Dernier message: 11/11/2005, 02h48
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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