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 de vector


Sujet :

SL & STL C++

  1. #1
    Membre confirmé Avatar de Sachiel31
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Par défaut Problème de vector
    Bonjour,

    J'ai créé une classe Bordereau qui contient plusieurs objets de types Destinataire, donc un vectior<Destinataire>.

    Mon problème est que j'arrive à remplir le 1er élément du vecteur avec un destinataire, mais pour les suivants cela ne marche pas.

    Déclaration de mon vecteur :
    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
    class Bordereau
    {
    private:
    	std::string date;
    	std::string devise;
    	std::string montantTotal;
     
    public:
    	std::vector<Destinataire> conteneurDest;
    	std::vector<Destinataire>::iterator itDest;
     
    	Destinataire theDestinataire;
     
    	Bordereau();
     
    	void afficheB();
    ...
    };
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	monBordereau->theDestinataire.afficheD(n);
    	monBordereau->conteneurDest.insert(monBordereau->conteneurDest.end(), monBordereau->theDestinataire);
    	monBordereau->conteneurDest.push_back(monBordereau->theDestinataire);
    	monBordereau->conteneurDest.insert(monBordereau->itDest, monBordereau->theDestinataire);
    	monBordereau->itDest = monBordereau->conteneurDest.end();
    Je pense avoir essayer plein de solutions mais je bloque

    Merci de votre aide

  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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Et c'est quoi l'erreur ?

  3. #3
    Membre émérite
    Avatar de SnakemaN
    Profil pro
    Bidouille-tout Android
    Inscrit en
    Juillet 2006
    Messages
    871
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Bidouille-tout Android

    Informations forums :
    Inscription : Juillet 2006
    Messages : 871
    Par défaut
    Et avec une boucle bien propre avec un iterator ? ca serait pas mieux ?

  4. #4
    Membre confirmé Avatar de Sachiel31
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Par défaut
    Comme je l'ai dit le premier destinataire est stocké dans le vecteur mais pas les suivants.

    Il me garde le contenu du premier élément mais change son adresse. C'est comme si le premier élément était supprimé (en copiant le contenu) et qu'un nouveau était créé avec le contenu de l'ancien.

    Voila le contenu de mon vecteur au premier passage :
    - monBordereau
    -> conteneurDest
    => _FIRST 0x003259e8 (avec tous les champs rensignés)
    => _LAST 0x003225a68 (vide)
    => _END 0x003225a68 (vide)
    -> itDest 0x003225a68

    Voila le contenu de mon vecteur au deuxieme passage :
    - monBordereau
    -> conteneurDest
    => _FIRST 0x00326448 (avec le contenu du 1er element)
    => _LAST 0x00326548 (vide)
    => _END 0x00326548 (vide)
    -> itDest 0x00326548


    Voila donc mon problème

  5. #5
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Bon, déjà le troisième est faux, ça vaut quoi après une insertion monBordereau->itDest ? ce n'est plus valide, donc à jeter !
    Combien t'affiche un size() du vecteur ?

  6. #6
    Membre émérite
    Avatar de SnakemaN
    Profil pro
    Bidouille-tout Android
    Inscrit en
    Juillet 2006
    Messages
    871
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Bidouille-tout Android

    Informations forums :
    Inscription : Juillet 2006
    Messages : 871
    Par défaut
    Et pourquoi il t'affiche l'adresse du contenu et non pas le contenu ? c'est voulu ?

    et puis pourquoi tu n'incremente pas l'iterateur ? tu réecris sur le meme la

  7. #7
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Si tu stoques directement l'objet, c'est normal que l'adresse change parce qu'il en fait une copie. Si tu ne le veux pas, je crois qu'il faut que tu stoques des pointeurs et non des objets.

    Sinon, tu fais comment pour parcourir ton vector ?

  8. #8
    Membre émérite
    Avatar de SnakemaN
    Profil pro
    Bidouille-tout Android
    Inscrit en
    Juillet 2006
    Messages
    871
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Bidouille-tout Android

    Informations forums :
    Inscription : Juillet 2006
    Messages : 871
    Par défaut
    Citation Envoyé par Eusebe
    Si tu stoques directement l'objet, c'est normal que l'adresse change parce qu'il en fait une copie. Si tu ne le veux pas, je crois qu'il faut que tu stoques des pointeurs et non des objets.

    Sinon, tu fais comment pour parcourir ton vector ?
    Arf grilled

    je plussoie

  9. #9
    Membre confirmé Avatar de Sachiel31
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Par défaut
    Quand je fais un size() du vecteur il m'affiche 2.

    Le contenu est affiché à l'interieur du _FIRST.

    Mon iterateur est incrémenté puisqu'après l'ajout le lui donne l'adresse du dernier élément (monBordereau->itDest = monBordereau->conteneurDest.end(); )

  10. #10
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Donc il insère bien 2 éléments, le troisième ne peut pas être inséré puisque l'itérateur n'est plus valide.

  11. #11
    Membre émérite
    Avatar de SnakemaN
    Profil pro
    Bidouille-tout Android
    Inscrit en
    Juillet 2006
    Messages
    871
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Bidouille-tout Android

    Informations forums :
    Inscription : Juillet 2006
    Messages : 871
    Par défaut
    et ben voila ta réponse tu lui donne l'adresse du dernier et non pas du dernier +1

    d'ailleur c'est louche qu'il t'en crée un deuxieme car il devrait ecraser le premier directement, non ?

  12. #12
    Membre confirmé Avatar de Sachiel31
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Par défaut
    J'ai modifié l'incrémentation de l'itérateur : je lui passe end() +1
    Mais du coup quand je fais :
    monBordereau->conteneurDest.insert(monBordereau->itDest, monBordereau->theDestinataire);

    il me met un access violation


    Mais normalement end() renvoi un itérateur qui pointe apres le dernier élément, non????

  13. #13
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    end() + 1 ne peut pas exister puisque end() pointe déjà après la fin du vecteur.
    Et quand fais-tu itDest = ... ?

  14. #14
    Membre confirmé Avatar de Sachiel31
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Par défaut
    J'incrément mon itérateur apres avoir insérer mon élément (logique non???)

  15. #15
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    push_back ne te suffit pas pour l'insertion ?

  16. #16
    Membre confirmé Avatar de Sachiel31
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Par défaut
    J'ai essayé la méthode push_back, mais cela ne marche pas.

  17. #17
    Membre émérite
    Avatar de SnakemaN
    Profil pro
    Bidouille-tout Android
    Inscrit en
    Juillet 2006
    Messages
    871
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Bidouille-tout Android

    Informations forums :
    Inscription : Juillet 2006
    Messages : 871
    Par défaut
    oui bien sur un end() + 1 ne marchera pas car il n'existe pas encore...

    et ben c vraiment chelou tout ca ...

  18. #18
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par Sachiel31
    J'incrément mon itérateur apres avoir insérer mon élément (logique non???)
    Tu veux dire après avoir fait ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	monBordereau->theDestinataire.afficheD(n);
    	monBordereau->conteneurDest.insert(monBordereau->conteneurDest.end(), monBordereau->theDestinataire);
    	monBordereau->conteneurDest.push_back(monBordereau->theDestinataire);
    	monBordereau->conteneurDest.insert(monBordereau->itDest, monBordereau->theDestinataire);
    	monBordereau->itDest = monBordereau->conteneurDest.end();
    J'ai indiqué que le troisième est faux car l'itérateur n'est plus valide après une insertion.

  19. #19
    Membre confirmé Avatar de Sachiel31
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Par défaut
    Bon en oubliant que la 3eme solution est fausse, pourquoi un simple pushback ou le insert(monBordereau->conteneurDest.end()) ne marche pas???


    Ca fait 2jours que je suis dessus je commence à buguer

  20. #20
    Membre émérite
    Avatar de SnakemaN
    Profil pro
    Bidouille-tout Android
    Inscrit en
    Juillet 2006
    Messages
    871
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Bidouille-tout Android

    Informations forums :
    Inscription : Juillet 2006
    Messages : 871
    Par défaut
    et en faisant un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for ( itDest=conteneurDest. begin ( ) ;
    itDest !=conteneurDest. end ( ) ;
    ++itDest ) {
    monBordereau->theDestinataire.afficheD(n); // tu affiches
    monBordereau->conteneurDest.insert(itDest, monBordereau->theDestinataire); //tu inseres
    }
    bon apres tu adaptes car je ne sais pas ou ce situe ce code, dans une methode ta classe peut etre ?

    sinon va voir la :

    http://www.cppreference.com/

    et surtout la :

    http://www.cppreference.com/cppvector/insert.html

    car je crois que tu n'utilise pas l'adresse (&) de ton destinataire et tu n'utilise pas de "const" on plus pour ton iterator

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

Discussions similaires

  1. Problème redimensionnement vector
    Par Zacks dans le forum SL & STL
    Réponses: 2
    Dernier message: 19/06/2006, 15h18
  2. [Debutant][Vector]Petit problème de vector
    Par GyZmoO dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 25/05/2006, 10h39
  3. Problème avec vector par référence
    Par vdumont dans le forum SL & STL
    Réponses: 11
    Dernier message: 09/05/2006, 08h25
  4. Problème de vector
    Par jamesleouf dans le forum SL & STL
    Réponses: 13
    Dernier message: 22/03/2006, 22h36
  5. problème class vector
    Par Pe04 dans le forum SL & STL
    Réponses: 2
    Dernier message: 27/02/2006, 10h45

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