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 :

C++ - Problème parcours d'une map<int, pair<Point, Point>>


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut C++ - Problème parcours d'une map<int, pair<Point, Point>>
    Bonjour,

    J'avais ouvert un post qui ressemble à celui-ci dans le titre mais dans ce cas, le problème est tout autre.
    Je dispose de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vector<tuple<int,int,int>> test; 
    map<int, pair<MyPoint,MyPoint>> myMap; // La map que je remplie
    test = myPipingModel.getvectorIdPipePoint(); // vector de la forme vector<tuple<idPipe, idPoint1, idPoint2>>
    Le construction de MyPoint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyPoint::MyPoint(int id, double x, double y, double z) : idPoint(id), coordX(x), coordY(y), coordZ(z)
    {
    }
    Je rempli ma map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int p=0;
    for (auto t = test.begin(); t != test.end(); ++t) // TODO : Problème de taille ici (changer j en 2*j)
    {
    	myMap[get<0>(*t)] = make_pair(MyPoint(get<1>(*t), myPipingModel.getX(p), myPipingModel.getY(p), myPipingModel.getZ(p)), MyPoint(get<2>(*t), myPipingModel.getX(p+1), myPipingModel.getY(p+1), myPipingModel.getZ(p+1)));
    	p++;
    }
    Pour le remplissage ci-dessus, je procède de la manière suivante :
    - la clé c'est idPipe que je récupère dans test. Pour remplir la paire, je dispose de trois vectors (pour X, Y et Z) avec les coordonnées. Donc pour le premier passage de boucle, je prend la position 0 de chaque vector et ainsi de suite pour le 2ème pipe et 3ème pipe.

    J'affiche ensuite le contenu de ma map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (auto p1 = myMap.begin(); p1 != myMap.end(); ++p1 )
    {
    	cout << "pipe " << p1->first << endl;
    	cout << "IdPoint 1 : " << (p1->second).first.getIdPoint() << " - x : " << (p1->second).first.getCoordX() << " - y : " << (p1->second).first.getCoordY() << " - z : " << (p1->second).first.getCoordZ() << endl;
    	cout << "IdPoint 2 : " << (p1->second).second.getIdPoint() << " - x : " << (p1->second).second.getCoordX() << " - y : " << (p1->second).second.getCoordY() << " - z : " << (p1->second).second.getCoordZ() << endl;
                 cout << endl;
    	getchar();
    }
    Et là....il se passe quelque chose de très étrange : j'obtiens bien les bons pipe : 1, 2, 3, ... mais pour les affichage des coordonées, cela m'affiche les x, y et z du milieu de mes vectors.
    Par exemple, j'ai les coordonées suivantes dans mes vectors de coordonées :
    Pour X : 1 2 3 5 6
    Pour Y : 5 2 3 6 9
    Pour Z : 5 8 9 6 3

    et bien cela va m'afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pipe 1  idPoint 1 : 1 - x : 3 - y : 3 - z : 9
    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pipe 1  idPoint 1 : 1 - x : 1 - y : 5 - z : 5
    Ca me prend à partir de la position au milieu de mes vectors ! C'est un vrai mystère...
    Si vous avez une solution à ce problème

    Merci d'avance pour vos réponses

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    je te propose quelques améliorations pratiques:

    écrire une fonction (libre) d'affichage d'un point.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::ostream& operator<<(std::ostream& os, MyPoint const& p) {
        return os <<"IdPoint :" << p.getIdPoint() << " - x : " << p.getCoordX() << " - y : " << p.getCoordY() << " - z : " << p.getCoordZ() ;
    }
    et utiliser la range for loop dans ton code d'affichage deviendra:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (auto const& entry: myMap) {
    	cout << "pipe " << entry.first << endl;
    	cout << "point 1 : " << (entry.second).first << "\npoint 2 : " << (entry.second).second << '\n'<<endl;
    	getchar();
    }
    cela posé, tu as probablement déjà ta réponse, sous forme d'un commentaire marqué TODO.
    Il y a deux solutions envisageables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int p=0;
    for (auto const& tuple : test) {
    	myMap[get<0>(t)] = make_pair(
    		MyPoint(get<1>(t), myPipingModel.getX(p), myPipingModel.getY(p), myPipingModel.getZ(p)),
    		MyPoint(get<2>(t), myPipingModel.getX(p+1), myPipingModel.getY(p+1), myPipingModel.getZ(p+1))
    	);
    	p+=2;
    }
    et, en évitant une création de temporaire inutile (dans map::operator[]):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int p=0;
    for (auto tuple : test) {
        myMap.emplace(
    		make_pair(
    			get<0>(t),
    			make_pair(
    				MyPoint(get<1>(t), myPipingModel.getX(p), myPipingModel.getY(p), myPipingModel.getZ(p)),
    				MyPoint(get<2>(t), myPipingModel.getX(p+1), myPipingModel.getY(p+1), myPipingModel.getZ(p+1))
    			)
    		)
    	);
    	p+=2;
    }
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Je te remercie pour ta réponse rapide et efficace !
    J'utilise Visual C++, je ne peux donc pas utiliser auto de cette manière dans mon code. J'ai deja été confronté à ce problème. J'ai pu modifier le remplissage en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int p=0;
    for (auto tuple = test.begin(); tuple != test.end(); ++tuple) 
    {
    	myMap.emplace(
    		make_pair(
    			get<0>(*tuple),
    			make_pair(
    				MyPoint(get<1>(*tuple), myPipingModel.getX(p), myPipingModel.getY(p), myPipingModel.getZ(p)),
    				MyPoint(get<2>(*tuple), myPipingModel.getX(p+1), myPipingModel.getY(p+1), myPipingModel.getZ(p+1))
    			)
    		)
    	);
    	p+=2;
    }
    Ca me parait correct (dis-moi sinon)

    Mais pour l'affichage, je ne sais pas comment modifier la boucle FOR, j'ai essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (auto const& entry = myMap.begin(); entry != myMap.end(); ++entry) 
    {
    	cout << "pipe " << entry.first << endl;
    	cout << "point 1 : " << (entry.second).first << "\npoint 2 : " << (entry.second).second << '\n'<<endl;
    	getchar();
    }
    Mais j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2678: '++' binaire*: aucun opérateur trouvé qui accepte un opérande de partie gauche de type 'const std::_Tree_iterator<_Mytree>' (ou il n'existe pas de conversion acceptable)
    Je ne sais pas comment modifier !

    Merci d'avance pour ta réponse

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Je précise, j'utilise Visual C++ 2010 !

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    J'ai trouvé !!
    Pour l'affichage j'ai tout simplement mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (auto entry = myMap.begin(); entry != myMap.end(); ++entry) 
    {
    	cout << "pipe " << entry->first << endl;
    	cout << "IdPoint 1 : " << (entry->second).first.getIdPoint() << " - x : " << (entry->second).first.getCoordX() << " - y : " << (entry->second).first.getCoordY() << " - z : " << (entry->second).first.getCoordZ() << endl;
    	cout << "IdPoint 2 : " << (entry->second).second.getIdPoint() << " - x : " << (entry->second).second.getCoordX() << " - y : " << (entry->second).second.getCoordY() << " - z : " << (entry->second).second.getCoordZ() << endl;
     
    	getchar();
    }
    Merci beaucoup pour ton aide
    Je ne regrète vraiment pas de m'être inscrit sur ce forum !

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Pour information, les .begin() et .end() de map/vector/set... retourne des itérateurs, qu'il faut manipuler comme des pointeurs pour accéder à la valeur.
    Un itérateur est une classe (contenant un pointeur ou un index) et définissant deux opérations:
    • avancer (operator++())
    • comparaison (operator!=())
    • valeur courante (operator->() et operator*() )



    for (TYPE const& item : collection) permet d'accéder directement par référence constante aux éléments de la collection.
    for (Collection_type<Truc>::const_iterator it = collection.begin(); it!=collection.end(); ++it) utilise l'itérateur (constant si possible) de la collection.

    Comme c'est parfois très long à écrire, pour cause de collection template de classe template, C++11 a introduit le "auto" qui signifie littéralement:
    "Cher compilateur, puisque tu sais quel est le seul type utilisable, sers-t'en."
    ce qui autorise la notation raccourcie: for (auto it = collection.begin(); it!=collection.end(); ++it)Par contre, n'utilise auto que lorsque tu sais exactement quel type se cache derrière, et que ce sera aussi le cas du moindre lecteur.

    Comme tu l'as vu dans mes fragments de code, auto accepte certains modificateurs, tels que const et & (référence).
    D'une manière général, utilise autant que possible la référence constante quand tu manipules des classes (d'où mesauto const&)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (TYPE const& item : collection) permet d'accéder directement par référence constante aux éléments de la collection.
    n'existe malheureusement pas sous Visual C++ 2010 ...

    Merci pour toutes ces informations !

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Au plaisir, et bonne continuation

    Au passage, essaie de passer à un version plus récente, comme la 2013.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  9. #9
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Merci

    Malheureusement, je suis en stage et on m'impose cet environnement de développement ...

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tu peux toujours essayer le "avec la dernière version, les performances sont meilleurs, grace à des améliorations du langage". C'est presque vrai, et ca peut les motiver.

    Sinon, tant pis, tu as déjà une partie de C++11
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  11. #11
    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 518
    Points
    41 518
    Par défaut
    Il faut aussi avoir Windows 7 ou supérieur pour faire tourner VS2013 dessus. Il n'accepte même pas Vista, ce que je considère comme une connerie (ou malveillance) monumentale de la part de Microsoft puisque Vista était encore supposé être supporté, contrairement à XP dont le support a expiré.
    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.

  12. #12
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Je suis sous XP, donc il ne supporterai même pas la dernière version !
    Ils ont même pas acheter le pack Visual Studio, j'ai seulement la version Express alors imagine si je leur demande d'acheter...moi petite stagiaire que je suis ^^

  13. #13
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Il faut aussi avoir Windows 7 ou supérieur pour faire tourner VS2013 dessus. Il n'accepte même pas Vista, ce que je considère comme une connerie (ou malveillance) monumentale de la part de Microsoft puisque Vista était encore supposé être supporté, contrairement à XP dont le support a expiré.
    C'est une conséquence de la politique de Microsoft: le testeur est le client. Ils sont donc contraints de forcer les clients à passer à des versions plus récentes de leurs OS.
    De plus, Microsoft a toujours fait en sorte que les développeurs soient un peu des pionniers (versions gratuites de visual studio, facilités pour les VM, etc.), de façon à servir de "locomotive", pour le dire comme ça.
    C'est nul, mais c'est comme ça.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/01/2012, 11h11
  2. [PHP 4] Problème création d'une Map pour un jeu
    Par kazylax dans le forum Langage
    Réponses: 3
    Dernier message: 13/05/2011, 13h57
  3. problème parcours d'une table sql
    Par gus8543 dans le forum SAS Base
    Réponses: 2
    Dernier message: 17/06/2008, 17h57
  4. Problème de récupération dans une map
    Par sacdenoeud dans le forum C++
    Réponses: 7
    Dernier message: 26/03/2006, 08h40
  5. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 10h39

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