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 avec les std::map


Sujet :

SL & STL C++

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 18
    Points : 10
    Points
    10
    Par défaut Problème avec les std::map
    Bonjour,

    Je suis complètement perdue face à un bug que je n'arrive pas du tout à cibler... Je ne sais pas quelle démarche adopter pour le résoudre et je viens crier au secours et écouter tous les conseils avisés que vous pourrez me donner.


    Je travaille en fait sur un projet existant, qui fonctionne sans problème. J'y ai rajouté 2-3 méthodes deci delà et là ça bugge.


    Voici les exceptions qui sont générées:
    Violation d'accès lors de la lecture de l'emplacement 0x00000014
    L'endroit exact où ça plante est lors de l'appel à cette méthode, il ne trouve a priori pas mon_map[cle1][cle2].

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void MaClasse::Ajout(Cle1* cle1_, Cle2* cle2_, int indice_, int valeur_){
     
    	if (mon_map[cle1_][cle2_].empty() == 1 ){
    		for (int i = 0; i<=CONSTANTE; i++) {mon_map[cle1_][cle2_].push_back(0);}
    	}
     
     
     
    	mon_map[cle1_][cle2_][indice_] = valeur_;
    }
    Pour info, mon_map est déclarée comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map<Cle1*, map<Cle2*, vector<int> > > mon_map;

    A quelle type d'erreur cela peut correspondre? Est-ce possible que dans mon code il y ait une toute autre erreur qui se répercute par une violation d'accès par la suite?

    Mon message est un peu brouillon, excusez-moi... Je ne sais pas si c'est très simple de relire des bouts de code comme ça, mais si vous avez déjà rencontré les mêmes erreurs peut-être que votre expérience pourra m'aider à orienter mes recherches!!


    Merci d'avance pour vos réponses.


    EDIT: j'ai changé quelques noms d'objets.

  2. #2
    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,
    Il faut savoir que map[] créé un élément si celui-ci n'existe pas. Je préfère systématiquement utiliser map::find pour retrouver un élément et n'utiliser [] que pour l'ajout ou en ayant au préalable testé l'existence de l'élément. Donc, la première ligne à laquelle je me suis arrêté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (mon_map[cle1_][cle2_].empty() == 1 ){
    	for (int i = 0; i<=CONSTANTE; i++) {mon_map[cle1_][cle_2].push_back(0);}
    }
    Perso, je change en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(
          (mon_map.find(cle1_)!=mon_map.end())
       && (mon_map[cle1_].find(cle2_)!=mon_map[cle1_].end())
    {
       if (mon_map[cle1_][cle2_].empty()){
    	   for (int i = 0; i<=CONSTANTE; i++) {mon_map[cle1_][cle2_].push_back(0);}
       }
       mon_map[cle1_][cle2_][indice_] = valeur_;
    }

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Merci pour l'info sur l'opérateur [], j'essaierai de l'utiliser avec précaution.

    Là, rien ne semble être créé par cet opérateur car rien que le test mon_map[cle1_][cle2_].empty() == 1 plante.

    Il semblerait que mon_map[cle1_][cle2_] n'existe pas, mais je ne comprends vraiment pas pourquoi...

    Avec si peu de code vous pouvez difficilement m'aider, mais je prends toutes remarques d'ordre général qui m'aideraient à avancer!

  4. #4
    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 iori11 Voir le message
    Là, rien ne semble être créé par cet opérateur car rien que le test mon_map[cle1_][cle2_].empty() == 1 plante.
    Mon message n'était pas très clair, mais il est possible que cela plante car il n'existe pas d'entrée avec les clés que tu lui fournis et donc il créé des valeurs par défaut qui sont mal initialisées -> d'où l'erreur.

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Hum hum... intéressant.
    Il me reste donc à voir pourquoi il pourrait ne pas exister d'entrée avec les clés fournies, et là c'est un grand mystère...

  6. #6
    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
    Une autre remarque qui m'a échappé à la première lecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(mon_map[cle1_][cle2_].empty() == 1)
    Il vaut mieux utiliser true pour les comparaisons avec un type bool :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(mon_map[cle1_][cle2_].empty() == true)
    Certain préfère écrire d'abord la constante et ensuite le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(true==mon_map[cle1_][cle2_].empty() )
    Ca évite les étourderies de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(mon_map[cle1_][cle2_].empty() = true)
    ou tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(mon_map[cle1_][cle2_].empty())

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Oui, j'ai vu les dégâts que pouvaient engendrer ces étourderies sur une autre discussion du forum! Merci pour ces remarques.

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

Discussions similaires

  1. Problème avec les objets d'une map
    Par demonia dans le forum C++
    Réponses: 2
    Dernier message: 27/11/2007, 20h37
  2. Problème de fonction "const" avec une std::map
    Par Clad3 dans le forum SL & STL
    Réponses: 3
    Dernier message: 02/01/2007, 12h38
  3. [gsoap] Problème avec les std::vector
    Par LePhasme dans le forum SL & STL
    Réponses: 1
    Dernier message: 25/04/2006, 11h46
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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