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 :

STL, map et operateur '+'


Sujet :

SL & STL C++

  1. #1
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut STL, map et operateur '+'
    Bonjour.

    J'ai un problème avec cette ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                for (int pos_x = x;
                    pos_x <= x+(m_pFileData->Get_DataDecors(m_Sprites[DECORS])[TAILLEX])
                    && pos_x < longueur;
                    pos_x++)
                {
    A la ligne "x+(m_pFileData[...]", le compilateur me donne une erreur très longue (je met que le début): "no match for operator+ in 'x+(mp_FileData[...]"

    mp_FileData retourne un map<int, int>... D'ou vient le problème ?? Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    tu es totalement sûr que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_pFileData->Get_DataDecors(m_Sprites[DECORS])[TAILLEX]
    tu renvois un int ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut
    Logiquement oui, puisque Get_DataDecors(m_Sprites[DECORS]) renvoit un map<int, int>, donc j'y rajoute l'opérateur [] avec [TAILLEX], je devrais donc obtenir un int...

  4. #4
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    en effet...

    ça serait possible que tu donnes le message d'erreur en entier s'il te plaît ? (c'est vrai qu'il sont très longs... ^^)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #5
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut
    Pas moyen de copier-coller le message d'erreur sous Code::Blocks

    Alors le voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: no match for 'operator+' in 'x + *(((C_Case*)this->C_Case::m_pFileData->C_FileData::Get_DataDecors((((std::map<int, int, std::less<int>, std::allocator<std::pair<const int, int> > >*)((C_Case*(this))+8u)->std::map<_Key, _Tp, _Compare, _Alloc>::opera
    J'ai pas la suite...

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Dans ce cas là décompose pour mieux cerner l'erreur. De toute façon, faire une recherche dans une map à chaque tour de boucle est une mauvaise idée. Et ton code n'en sera que plus clair.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const std::map<int, int>& Data = m_pFileData->Get_DataDecors(m_Sprites[DECORS]);
    int Size = Data[TAILLEX];
     
    for (int pos_x = x; (pos_x <= x + Size) && (pos_x < longueur); pos_x++)

  7. #7
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut
    A la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int Size = Data[TAILLEX];
    C::B me donne cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    passing 'const std::map<int, int [...] >' as 'this' argument pf '_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const Key&) [with _Key = int, _Tp = int, _Compare = std::less<int>, _Alloc
    Là encore, je n'est pas la suite...

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ah oui zut... Si tu ne veux pas t'embêter, il ne faut pas que ta map soit constante.

    Tant qu'on y est, je suppose que m_pFileData->Get_DataDecors(...) renvoie une map par valeur et non par référence ? Bonjour les performances

    Donc pour tester avec ton code actuel sans te faire ch*** tu peux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<int, int> Data = m_pFileData->Get_DataDecors(m_Sprites[DECORS]);
    Mais dans le code final, idéalement il faudrait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Get_DataDecors renvoie un const std::map<int, int>&
     
    const std::map<int, int>& Data = m_pFileData->Get_DataDecors(m_Sprites[DECORS]);
     
    std::map<int, int>::const_iterator It = Data.find(TAILLEX);
     
    if (It == Data.end())
    {
        // Erreur : clé TAILLEX non présente dans la table
    }
     
    int Size = It->second;

  9. #9
    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
    C'est vrai, on a pas le droit de faire [] sur une map constante
    Vire le const devant une fois.

  10. #10
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const std::map<int, int>& Data = m_pFileData->Get_DataDecors(m_Sprites[DECORS]);
    int Size = *Data.find(TAILLEX);
     
    for (int pos_x = x; (pos_x <= x + Size) && (pos_x < longueur); pos_x++)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  11. #11
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut
    Tant qu'on y est, je suppose que m_pFileData->Get_DataDecors(...) renvoie une map par valeur et non par référence ? Bonjour les performances
    Comment ça ? Ca renvoit juste une map<int, int>...

    Sinon, pourquoi y a-t-il un & à :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::map<int, int>& Data = m_pFileData->Get_DataDecors(m_Sprites[DECORS]);
    Merci de m'aider, je vais essayer ça.

  12. #12
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Les map sont des gros objets, leur copie prend énormément de temps processus et de mémoire...

    c'est pour ça qu'ils sont généralement renvoyés par référence, et non par valeur

    le & est justement là pour créer une référence (ici à la valeur de retour de la fonction), et donc épargner le temps et la mémoire d'une copie de map
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  13. #13
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut
    D'accord.
    Merci

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Donc finalement, d'où venait ton erreur ?

    int Size = *Data.find(TAILLEX);
    Data.find(TAILLEX)->second, plutôt, vu que les itérateurs de map pointent sur des std::pair. Mais ne pas vérifier le retour d'un find est dangereux.

  15. #15
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    je pense que c'était le [] sur un const map<...>
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  16. #16
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par Swoög
    je pense que c'était le [] sur un const map<...>
    A la base il n'y avait pas de const, c'est moi qui l'ait introduit.

  17. #17
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut
    Citation Envoyé par Swoög
    je pense que c'était le [] sur un const map<...>
    Il y avait de ça, mais c'est aussi parce que j'avais déclarer Get_DataDecors en tant que retournant un pointeur -_-''

    Par contre, comment faut-il que je fasse pour que Get_DataDecors retourne par référence ?? Au sein meme de la fonction, ça ne change pas ?

  18. #18
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Par contre, comment faut-il que je fasse pour que Get_DataDecors retourne par référence ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const std::map<int, int>& C_Case::Get_DataDecors(...) const
    {
        return la_meme_chose_qu_avant;
    }

  19. #19
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    pour que ça retourne une référence, il faut déjà que ta fonction ait la particulaité de renvoyer une variable qui ne sera pas détruite à la fin de la fonction (si avant elle renvoyait un pointeur ça doit être bon)

    ensuite, au lieu de déclarer ta fonction comme renvoyant :
    map<int, int>

    tu la déclares renvoyant
    map<int, int>&

    et d'ailleurs, comme c'est un getter, je suppose qu'il ne faut pas pouvoir modifier la map qui est renvoyée...

    donc fait la renvoyer un
    const map<int, int>&

    ensuite, dans le corps de la fonction lui-même il n'y a rien à modifier
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  20. #20
    Membre très actif
    Inscrit en
    Septembre 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 139
    Par défaut
    Citation Envoyé par Laurent Gomila
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const std::map<int, int>& C_Case::Get_DataDecors(...) const
    {
        return la_meme_chose_qu_avant;
    }
    De fois const ?? o_O

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

Discussions similaires

  1. stl map et valeur par défault
    Par azmodai dans le forum Langage
    Réponses: 2
    Dernier message: 06/09/2010, 16h10
  2. [C++/STL Map] Segfault en Release, rien en Debug
    Par Bluespear dans le forum SL & STL
    Réponses: 3
    Dernier message: 28/04/2010, 09h25
  3. Erreur STL MAP
    Par layneuks dans le forum C++
    Réponses: 6
    Dernier message: 11/01/2010, 19h07
  4. inserer dans stl::map
    Par ocean24 dans le forum SL & STL
    Réponses: 4
    Dernier message: 23/04/2007, 01h47
  5. STL map const et une erreur dans une condition...
    Par insomniak dans le forum SL & STL
    Réponses: 2
    Dernier message: 15/05/2006, 17h56

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