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

Langage C++ Discussion :

Insertion d'objet dans liste


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Par défaut Insertion d'objet dans liste
    Bonjour à tous et à toutes !

    Bon, premièrement je vous souhaite à tous une joyeux Noël en retard ainsi qu'une bonne année plutôt que prévu

    Maintenant passons aux choses sérieuses.. Un problème que je ne comprends pas du tout et j'ai besoin de votre aide !

    Pour le cours de C++ de cette année nous devons gérer des clients, des vendeurs, une liste de modèle etc.. Chaque classe disposera d'une liste triée dans laquelle on ajoutera chaque objet (à partir d'un fichier).

    Le problème survient lorsque je fais la lecture d'un fichier Modele.csv. J'effectue la lecture du fichier, je créer un objet que j'ajoute dans la liste.
    Voici la portion de code correspondante :

    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
    void ChargerListeModele(ListeTriee<Modele> &listemodele)
    {
     
        char nom[100], buffer[100];
        int puissance;
        bool diesel;
        float prix;
        char temp[20];
     
        ifstream fichier("Modeles.csv", ios::in);
     
        if(fichier)
            {
              fichier.getline(buffer, 100, '\n');  // la 1ere ligne du fichier contient le nom des colonnes
     
                    while(fichier.peek() != EOF)   // peek() => prochain caractère
                    {
     
                            fichier.getline(nom, 100, ';');
                            fichier.getline(temp, 20, ';');
                            puissance = atoi(temp);               // atoi = string/char* en int
                            fichier.getline(temp, 20, ';');
                            diesel = atoi(temp);
                            fichier.getline(temp, 20, '\n');
                            prix = atof(temp);                    // atof = string/char* en float
     
                            listemodele.insere(Modele(nom,puissance,diesel,prix));
                    }
                    fichier.close();
             }
     
        listemodele.Affiche();
        cin.ignore(1024,'\n');
        cout<<"Appuyez sur une touche pour revenir au menu"<<endl;
        cin.get();
    }
    (PS : Oh mais quelle horreur ! Des char et char* partout.. ^^ Je sais.. Pourquoi pas des strings ? Car notre professeur nous l'interdit )

    Avec mes clients, mes employés la liste triée marche parfaitement. Cependant, dès qu'il y a plus d'un objet Modèle dans la liste, la variable Nom de l'objet modèle contient n'importe quoi ! Comme si elle changeait à chaque ajout d'un nouvel objet alors que je n'y touche même pas..

    Vous trouverez ici une capture d'écran du problème :



    Je précise aussi que sous Windows je n'ai aucun problème. L'ajout s'effectue de façon correcte. Cependant, sous Linux ça ne marche pas.
    Cela fait maintenant quelques jours que j'essaye de trouver une solution mais je n'y arrive pas ^^'

    Pour les plus curieux, je vous annexe l’entièreté de mon projet.

    Merci à tous et bonne soirée ! =)
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Oh, mais quelle horreur, des char[] et des char* partout ! Je sais, tu n'as pas le choix, et je te plains vraiment, mais ce genre de prof mériterait vraiment de se faire tirer les oreilles !

    J'ai juste jeté un œil rapide, et en effet le problème n'existerait pas avec des strings.... Car avec des strings, tu n'aurais pas besoin de t'embêter avec les constructeurs de copie et autres operateurs=, tu pourrait appliquer la règle des 0, alors que là, tu en es réduit à appliquer la règle est 3 (ou 5).

    Donc, en un mot : Tu n'as pas défini l'opérateur= pour ta classe Modèle, alors que ton template en fait usage, ce qui va mal marcher...

    Sinon, en vrac dans ce que j'ai aperçu en 2 minutes :
    - Pour un template, on met le code dans le .h, pas dans un .cpp
    - Faire dériver une liste triée d'une liste non triée est mauvais, car contraire au principe de substitution de Liskov (LSP)
    - Tu utilises sémantique de copie et héritage dans la même classe, c'est souvent une mauvaise idée. J'interdirais la copie d'une Personne, plutôt que de la permettre et qu'elle se passe mal la plupart du temps (avec éventuellement l'idiome du constructeur de copie virtuel, à savoir une fonction clone, mais là, je ne crois pas que ce soit utile de cloner des personnes).
    - Ta classe de liste triée a une fonction d'ajout en O(N). Beurk ! Et donc ajouter N éléments est en O(N²). Rebeurk ! Est-ce qu'on t'impose aussi cette structure de données bancale ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Par défaut
    Merci beaucoup pour ta réponse !
    J'ai complètement zappé l'opérateur =... Mais maintenant tout marche.

    Et merci pour tes remarques. J'essayerais de modifier ce que je peux pour avoir un code correct. Maintenant pour la liste la structure m'est imposée :/ Tout comme les char ^^

    Sur ce, je marque le sujet comme résolu.

    Bonne soirée JolyLoic, et encore une fois, merci pour ton aide qui me sort du pétrin =)

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    La première chose à faire si tu n'as pas le droit d'utiliser std::string, c'est de faire ta propre classe de string, avec forme canonique (def-const, copy-const, operator= (de préférence via copy-and-swap), dest).
    Ainsi tu montres à ton prof échappé d'Epit(a|ech) (si on est charitable; sinon, c'est qu'il est échappé du XXe siècle à la place) que tu sais manipuler les char*, puis tu te débarrasses de leur manipulation aussi vite que possible.
    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.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Oh, mais quelle horreur, des char[] et des char* partout ! Je sais, tu n'as pas le choix, et je te plains vraiment, mais ce genre de prof mériterait vraiment de se faire tirer les oreilles !
    Je te trouve magnanime. Je préconiserais plutôt de mettre sa tête au bout d'une pique.

    Sinon, la proposition de Médinoc est excellente.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par oodini Voir le message
    Je te trouve magnanime.
    Je n'ai pas dit de combien de km je tirais
    Citation Envoyé par oodini Voir le message
    Sinon, la proposition de Médinoc est excellente.
    Dans l'absolu, je suis d'accord, j'ai même failli la proposer. Là où j'ai hésité, c'est qu'un prof très obtus risquerait de ne pas apprécier.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. [Débutant] Insertion d'objet dans une liste
    Par Uranne-jimmy dans le forum VB.NET
    Réponses: 3
    Dernier message: 15/10/2013, 09h03
  2. Modifier un objet dans list d 'objets
    Par topolino dans le forum ASP.NET
    Réponses: 3
    Dernier message: 31/08/2009, 12h27
  3. [phpBB] Script pour insertion d'objets
    Par Lorely dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 30/12/2006, 18h15
  4. Réponses: 15
    Dernier message: 29/10/2006, 18h01
  5. insertion d'objets dans une liste chainee
    Par mathher dans le forum C++
    Réponses: 8
    Dernier message: 20/04/2006, 16h28

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