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

SL & STL C++ Discussion :

Problème d'utilisation de vector


Sujet :

SL & STL C++

  1. #1
    Membre confirmé Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Par défaut Problème d'utilisation de vector
    Bonjour,

    Je vais vous exposer mon problème en essayant de simplifier au plus les choses.

    Je dispose d'une classe Element :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Element  
    {
    private:
    	char* Name;
     
    public:
    	Element();
    	Element(char*);
    	virtual ~Element();
     
    	char* getName();
    	void  setName(char*);
    };
    Ensuite je voudrais pouvoir créer une liste d'élément de taille variable.
    Je fais un petit test:
    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
    vector<Element> Table_Element;
     
    char* nom="NOM1"; 
    Table_Element.push_back(Element(nom));
     
    nom = "NOM2"; 
    Table_Element.push_back(Element(nom));
     
    nom="NOM3"; 
    Table_Element.push_back(Element(nom));
     
    nom="NOM4"; 
    Table_Element.push_back(Element(nom));
     
    for (int i=0;i<Table_Element.size();i++)
    {
      cout <<	 Table_Element[i].getName() << "\n";
    }
    Bingo, comme prévu s'affiche à l'écran :
    NOM1
    NOM2
    NOM3
    NOM4


    Etape2 je veux lire un fichier DTD est récupérer le nom des différents éléments présents.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <!DOCTYPE ROOT[ 
    <!ELEMENT NOM1 (#PCDATA)>
    <!ELEMENT NOM2 (#PCDATA)>
    <!ELEMENT NOM3 (#PCDATA)>
    <!ELEMENT NOM4 (#PCDATA)>
    ]>
    Voila la portion de code devant me permettre d'arriver à mon but :
    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
    ifstream dtd;
    char c, mot[100], nom[100]; 
    int compteur=0;
     
    while(!dtd.eof())
    {   
      dtd >> c; //lecture caractere par caractere
     
      if (c=='<') //quand le caractere '<' est rencontrer
      {
        dtd.get(mot,9);
        if (!strcmp("!ELEMENT",mot)) //regarder si on a affaire a un element
        {
          compteur++;
          cout << "\n Boucle :" << compteur << "\n";
     
          dtd.get(nom,10,'('); //recuperer le nom de l'element
     
          Table_Element.push_back(Element(nom));//ajouter un element au vecteur
          for (int i=0;i<Table_Element.size();i++)
          {
            cout <<	 Table_Element[i].getName() << "\n";
           }
         }	 
       }
    }
    dtd.close();
    Cette fois s'affiche à l'écran :
    Boucle : 1
    NOM1

    Boucle : 2
    NOM2
    NOM2

    Boucle : 3
    NOM3
    NOM3
    NOM3

    etc...

    Je ne comprends pas pourquoi est-ce que les noms de tout les élement sont à chaque fois modifier. :
    Si quelqu'un a la solution je lui en serai très reconnaissant.

    Pour moi la seul différence est que j'utilise non plus un
    char* pour construire mon élément mais un char[100].

    Si j'utilise la fonction dtd.get(nom,10,'(') et que nom est un char* ca compile, mais au lancement du programme il y a plantage. :

    Merci d'avance à ceux qui vont prendre le temps de lire ce message et d'y répondre.

  2. #2
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Lorsque tu prend en paramètres nom, celui est un tableau de caractères.
    Dans Element(char*);

    tu dois surement faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Element(char* _Name):Name(_Name)
    Alors qu'il faudrait faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Element(char* _Name):Name(new char[strlen(Name)+1])
    {
    strcpy(Name, _Name);
    }
    Sinon Element::Name pointe toujours vers le même tableau nom.
    Donc quand tu affiches Element::Name, tu affiches n fois la variable nom.

    Auparavant cela fonctionnait bien car tu pointais vers des espaces mémoire static tous diffrents.

  3. #3
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Les char *, c'est mal.
    Dans ta classe Element, remplace char* Name par un std::string.
    http://c.developpez.com/faq/cpp/?page=strings
    De même fait plutot des lectures de mots dans des std::string avec l'opérateur >>.
    dtd >> mot;
    Pourquoi tu lis le dtd à la main ?

  4. #4
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Les char * c pas mal
    J'en utilise tt le temps, j'ai refait une class string aussi

    Faut juste faire attention sur l'utilisation !

  5. #5
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    En C++, pour les chaines de carcatères, les char * c'est mal. La preuve c'est que s'il avait utilisé std::string il n'aurait pas eu ce bug.
    http://c.developpez.com/faq/cpp/?pag...INGS_avantages

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Par défaut
    Ca vient de l'implementation de Element , vu que tu utilises toujours le pointeur MOT, c'est lui qui est assigné à l'interieur de Element.

    Il faut que dans le constructeur de Element tu COPIES le parametres et pas simlplement assigner.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Par défaut
    Le char* est MAL pour une utilisation en tant que chaine de caractere. Pas protégé, pas fait pour. En C pas de solutions, mais vu que tu fais du C++ et tu utilises la lib std, il faut l'utiliser jusqu'au bout, cad, STRING.

  8. #8
    Membre confirmé Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Par défaut
    Merci à tous.

    Ti-R tu avais raison, j'ai fait les changements que tu m'as dit et ca a fonctionné sans problèmes.

    Aurelien, si je lis le DTD à la main, c'est parce qu'on m'a demandé de faire un programme qui génère un formulaire à partir d'un DTD simple. Ce qui veut dire que j'ai simplement besoin de récupérer chaque élement, le type et les éventuelles conditions...
    http://www.developpez.net/forums/viewtopic.php?t=301577

    Ca a fait un bon moment que je n'ai plus touché au C++, et a la prog en général. Là je me retrouve en stage... le redémarage est un peu lent, mais j'ai confiance pour la suite

    Et je déclare officiellement que je laisse tomber le char* et que je me converti au "string".

    Encore merci.

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Par défaut
    Amen...

  10. #10
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Au fait, si dans cette class tu utilisais par hazard toujours les char *

    oublie pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Element::~Element()
    {
     if(Name)
    delete [] Name;
    }

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Par défaut
    Le char* c'est bon pour les dinosaures psychopathes!

    Désolé...

  12. #12
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Je crois en faire partie

  13. #13
    Membre confirmé Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Par défaut
    Les char* c'est fini, ca fait plus de 4 jours et je suis pas retombé...

    Pour ceux que ca intéresse y a des patchs à se coller sur le bras qui peuvent aider...

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 28/04/2009, 17h46
  2. Problème d'utilisation de Mysql avec dev-c++
    Par Watchi dans le forum Dev-C++
    Réponses: 10
    Dernier message: 06/08/2004, 14h35
  3. [cvs] problèmes d'utilisation
    Par gromite dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 29/06/2004, 17h41
  4. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 10h18
  5. problème d'utilisation avec turbo pascal 7.0
    Par le 27 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 03/12/2003, 10h44

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