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 :

modification d'un élement dans un map


Sujet :

C++

  1. #1
    Membre régulier

    Inscrit en
    Août 2007
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 308
    Points : 100
    Points
    100
    Billets dans le blog
    1
    Par défaut modification d'un élement dans un map
    Bonjour à tous,

    voilà mon problème: j'utilise un map dans lequel je stocke dans des graphes(la clé du map est un entier)

    je lance un programme pour faire des modifications sur un graphe (par exemple celui de clé=2) je vois les modifications à ce niveau

    mais quand j'affiche mon map (au final) je ne vois pas les modifications

    avez-vous une idée?
    merci

  2. #2
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Heu, ben un peu au hasard je dirai modification avec passage par valeur au lieu de adresse/reference. Mais sans le code de la fonction incriminé, ça va être dure...
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  3. #3
    Membre régulier

    Inscrit en
    Août 2007
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 308
    Points : 100
    Points
    100
    Billets dans le blog
    1
    Par défaut
    merci pour ta réponse mais les parametres sont passés par reference
    voilà le code qui fait juste la supression d'arcs entre deux noeuds d'un graphe


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    void reduire_arcs(Vertex *n1, Vertex *n2)
    {
    //suppression des deux arcs constituants le cycle entre n1 et n2
    remove_edge(*n1,*n2, graphe);
    remove_edge(*n2,*n1,graphe);
     
    }
     
     
    l'appel à la méthode se fait comme suit
    reduire_cycle(&v1, &v2);

    euhhhh

  4. #4
    Membre régulier

    Inscrit en
    Août 2007
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 308
    Points : 100
    Points
    100
    Billets dans le blog
    1
    Par défaut
    oups je voulais dire reduire_arcs(&v1, &v2);

  5. #5
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    C'est lors du passage de ton graphe que ça doit planter... Ou alors même de ta map. Je ne sais que dire, mais si tu as des pointeurs partout, un changement à un endroit se répercute à un autre >< !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  6. #6
    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
    Peux-tu donner la signature de tes fonctions, et le type de tes variable ?

    graphe m'a l'air d'un bon candidat à un objet passé par valeur malencontreusement.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    graphe m'a l'air d'un bon candidat à un objet passé par valeur malencontreusement.
    Une approche préventive serait de rendre la classe de graphe non copiable. Ca détecterait à la compilation toutes ces erreurs d'inattention et ça ne m'a pas l'air - à priori - sémantiquement déconnant.

  8. #8
    Membre régulier

    Inscrit en
    Août 2007
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 308
    Points : 100
    Points
    100
    Billets dans le blog
    1
    Par défaut
    Excusez-moi mais je connais pas trop le principe de classe non copiable
    j'ai vu un peu sur le net...ok mais mainteant, ça me sort des erreurs de compilations
    cela veut dire que je dois revoir tout mon code!!!! chose qui ne me motive pas trop
    ya t-il une autre solution?

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par nina2007 Voir le message
    Excusez-moi mais je connais pas trop le principe de classe non copiable
    Comme expliqué dans la F.A.Q., il s'agit d'indiquer qu'on ne souhaite pas que les instances de cette classe puissent être copiées. Cela s'articule avec la sémantique d'entité.
    Citation Envoyé par nina2007 Voir le message
    cela veut dire que je dois revoir tout mon code!!!! chose qui ne me motive pas trop
    ya t-il une autre solution?
    Ca veut surtout dire que partout où tu as une erreur tu dois te poser la question : est-ce que je veux vraiment copier mon objet ou est ce que je voulais juste passer une référence constante.
    Le fait de rendre ta classe non copiable permet d'obtenir une erreur à la compilation partout où tu as copié tes objets implicitement ou explicitement. Si à l'analyse de ces erreurs tu te rends compte que la copie est bien le comportement que tu voulais, et bien enlèves le code qui rend la classe non copiable. Sinon, corrige le code où une copie a lieu... Intuitivement, j'aurais quand même tendance à penser qu'un graphe a une sémantique d'entité et n'est pas copiable. Donc j'opterais pour la solution la + laborieuse

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    La première chose que je voudrais vérifier, c'est la manière dont la map est déclarée et, surtout, la manière dont tu sélectionne le graphe au départ de celle-ci.

    Une fois que nous aurons cela, nous serons en mesure de déterminer s'il est intéressant rendre la classe non copiable ( car il ne faut pas oublier que l'insertion dans une std::map se fait par copie) ou s'il faut s'assurer que la copie se fait correctement en profondeur et les différentes fonctions qui utilisent un graphe...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre régulier

    Inscrit en
    Août 2007
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 308
    Points : 100
    Points
    100
    Billets dans le blog
    1
    Par défaut
    Il faut dire que je suis un peu perdue...Mon map est déclaré comme suit

    map<int,struct_graphe> map_graphes;

    avec struct_graphe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class struct_graphe
    {
     
    Graph_noeud_etat graphe;
    set<int> liste_objets;
    .......}

    Graph_noeud_etat est un graphe de Boost Graph déclaré comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef adjacency_list<vecS, vecS, bidirectionalS, noeud, int> Graph_noeud_etat;
    ]


    ensuite je construis de petits graphes que j'insére dans le map

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    map_graphes.insert(pair<int, struct_graphe>(cpt_graphe,s_graphe));

    Je ne sais pas trop si j'ai pu vous donner une idée claire pour me conseiller quelle solution devrai-je opter!!!

    merci à vous

  12. #12
    Membre régulier

    Inscrit en
    Août 2007
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 308
    Points : 100
    Points
    100
    Billets dans le blog
    1
    Par défaut
    j'ai oublié de mentionner que la selection du graphe se fait en parcourant le map et ne selectionnant la 2ème entrée du map

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (map<int, struct_graphe>::iterator it=(map_graphes).begin();it !=map_graphes).end();++it)
    {
    s_graphe=(*it).second;
    cycle=s_graphe.detection_cycle_sous_graphe(f,(*it).first);
    }
    f c'est juste un fichier


    ensuite c'est detection_cycle_sous_graphe qui fait appel à une methode qui s'applique sur le premier noeud du graphe pour faire des modifications (je vous rappelle que le problème c'est que à ce niveau je vois les modifs mais il y a aucune modif au fianle)

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par nina2007 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    s_graphe=(*it).second;
    Ici tu fais probablement une copie du graphe ce qui fait que la modification faite au travers de s_graphe ne sera par répercutée dans la map.
    Une solution est de travailler avec une référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (map<int, struct_graphe>::iterator it=(map_graphes).begin();it !=map_graphes).end();++it)
    {
    struct_graphe &s_graphe=(*it).second;
    cycle=s_graphe.detection_cycle_sous_graphe(f,(*it).first);
    }

  14. #14
    Membre régulier

    Inscrit en
    Août 2007
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 308
    Points : 100
    Points
    100
    Billets dans le blog
    1
    Par défaut
    j'ai essayé mais ça marche toujours pas

  15. #15
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par nina2007 Voir le message
    j'ai essayé mais ça marche toujours pas
    A l'instar de cette ligne, tu en as peut être d'autre où un objet est copié alors que tu voulais le modifier. Il te faut identifier ces lignes et les corriger.

  16. #16
    Membre régulier

    Inscrit en
    Août 2007
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 308
    Points : 100
    Points
    100
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Excusez-moi de vous revenir un peu en retard sur ça!!!
    problème résolu:

    j'ai verifié mes passages de paramètres en utilisant rien que des références et ça été résolu

    merci pour vos remarques!!
    .

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

Discussions similaires

  1. Modification d'un objet dans une map
    Par Flaburgan dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 06/11/2010, 10h36
  2. Modification d'un élement dans une balise XML
    Par Krash66 dans le forum Langage
    Réponses: 2
    Dernier message: 29/03/2009, 23h37
  3. 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
  4. Réponses: 8
    Dernier message: 28/04/2004, 16h53
  5. Modif. d'un 'REG_BINARY' dans registre (2000/XP)...
    Par Boulotaur2024 dans le forum Langage
    Réponses: 4
    Dernier message: 08/05/2003, 16h12

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