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 :

passage de CMap a std::map


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 37
    Par défaut passage de CMap a std::map
    salut
    J'ai une application qui fonctionne sur mfc mais pas sur win32
    je dois la modifier pour que ça marche aussi sur win32
    mon appli n'utilise que Cstring et CMap de mfc j'ai traduis tout mes Cstring en std::wstring et ca fonctionne mais j'ai aussi traduis Cmap en std::map ca ne fonctionne pas . il me dit:
    c:\program files\microsoft visual studio 8\vc\include\map(28) : error C2825: '_Alloc': must be a class or namespace when followed by '::'
    Y a t'il une autre façon de traduire une CMap en map ?
    Faut il changer autre chose ?

  2. #2
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    vous avez sans doute oublié de faire #include <map>
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 37
    Par défaut
    J'ai fais l'include map ce n'est pas le probleme
    a mon avis c'est dans la declaration des arguments de map.
    Je suis en train de regarder la declaration des cmap et des map et elle est un peu différente ca veux dire que en plus de changer le nom je dois changer les argument mais je ne voit pas comment!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ///declaration de cmap
     CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ///declaration de map
    map<_Kty, _Ty, _Pr, _Alloc> _Myt
    les argument on l'air different et il ny a pas d'alloc dans les CMap alors qu,il y en a un dans les map et l'erreur vien aparament de là!
    je met ma ligne de code initiale en mfc qui fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CMap<CString ,const TCHAR *,CString ,const TCHAR * > m_aListInfos;
    et ma ligne finale désiré qui pour l'instant ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<std::wstring ,const TCHAR *,std::wstring ,const TCHAR * > m_aListInfos;

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    en fait ce que tu veux faire c'est :

    std::map< std::wstring, std::wstring >

    Les autres arguments sont optionels

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 37
    Par défaut
    il me reconnaît bien ma map grâce a ta réponse mais maintenant c'est les méthodes de la map qui ne marche pas.
    Il faut que je trouve l'équivalent des méthodes des CMap en map.
    methodes a probleme:
    Lookup
    GetStartPosition
    GetNextassoc
    RemoveAll
    SetAt
    GetCount
    Pouvez vous me dire ou trouver de la documentation sur les CMap et les map pour que je puisse trouver les méthodes équivalentes.

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 37
    Par défaut
    En regardant la documentation j'ai trouvé quelque solution mais des probléme persiste:
    Lookup prend en paramétre la clé recherché et la variable de retour ici une string . J'ai trouvé la methode find qui fait la meme chose mais elle renvoit un iterator.
    1ere question: Qu'est ce qu'un iterator?
    2eme question: Peux on convertir un iterator en string ?

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Pour ce qui est un iterator, je te conseille de lire la FAQ du site
    http://cpp.developpez.com/faq/cpp/in...L#STL_iterator

    Pour récupérer la valeur de ta donnée, il faut faire quelque chose comme cela:

    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
    19
    20
    21
    22
     
    // on fait un typedef pour se faciliter la vie en écrivant juste MyMap
    typedef std::map< std::wstring, std::wstring > MyMap;
     
    // on crée la map
    MyMap mymap;
     
    // ajoute des éléments
    ...
     
    // on recherche la clé "maclé"
    MyMap::iterator ite = mymap.find( "maclé" );
    if( ite != mymap.end() )
    {
        // si la clé existe : ite->first représente la clé, ite->second la valeur
        std::cout << "valeur: " << ite->second << std::endl;
    }
    else
    {
        // elle n'existe pas
        std::cout << "valeur non trouvée" << std::endl;
    }

  9. #9
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 37
    Par défaut
    Merci pour l'aide sur les iterators.
    J'ai resolu toutes mes methodes sauf celle du SetAt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void SetAt(
       ARG_KEY key,
       ARG_VALUE newValue 
    );
    //// Inserts an element into the map; 
    ///replaces an existing element if a matching key is found.

    L'équivalent serait la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    iterator insert(iterator pos,
                    const value_type& x)
    ///Inserts x into the map, using pos as a hint to where it will be inserted.
    mais dans ce cas là je ne sais pas comment l'utiliser. Comment passer la clé à iterator pos ?

  10. #10
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Non, l'équivalent serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::map<ARG_KEY, ARG_VALUE> m;
    ARG_KEY key;
    ARG_VALUE newvalue;
     
    // Inserts an element into the map; 
    //replaces an existing element if a matching key is found.
    m[key] = newvalue;
    Edit : car insert() échoue si la clé est déjà présente dans la map alors que l'operateur [] insère quand même et écrase l'élément existant.

  11. #11
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 37
    Par défaut
    Ya t'il un equivalent des cstring::format pour les wstring ?

  12. #12
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    ostringstream et/ou boost::format

  13. #13
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 37
    Par défaut
    ma Cstring initiale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine.Format (_T("%u,%u"), a,b);
    a et b sont deux unsigned long.

    ma chaine finale qui ne marche pas, probléme de convertion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::ostringstream oss117;
    		oss117 << std::dec;
    		oss117 <<a<<','<<b;
            chaine=oss117.str();
    Le resultat final désiré serait (si a=45555;b=52210); par exemple:

    chaine="45555,52210"

  14. #14
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::ostringstream oss117;
    		oss117 << std::dec;
    		oss117 <<a<<','<<b;
            chaine=oss117.str();
    Cela devrait marcher, a part que std::dec n'est pas utile (c'est le défaut) et que si tu veux une wstring il faut utiliser un wostringstream.

  15. #15
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 37
    Par défaut
    mon programme compile en entier mais il a un probleme lors de l'execution au niveau de mon iterator qui doit recupérer le resultat d'un find sur une map
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     std::wstring chaine;
    	std::map<std::wstring ,std::wstring  >::iterator ite;
        ite=ma_map.find("maclé");
    	chaine=ite->second;
    	return chaine;
    erreur : map/set iterator not dereferencable

  16. #16
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Bonsoir,

    avant de déréférencer il faudrait d'abord vérifier si la chose a été trouvée, c'est à dire si ite==ma_map.end() ou non
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  17. #17
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 37
    Par défaut
    Voici mon essai de formatage grâce au flux mais ca ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    std::wostringstream oss117;
    oss117.str(_T(""));
    oss117 <<_T("\\FileInfo\\");
    oss117<<lpTranslate[i].wLanguage<<lpTranslate[i].wCodePage;
    oss117<<_T("\\");
    oss117<<aszLib[n];
    chaine=oss117.str();
    oss117.str(_T(""));
    voici le code en mfc de base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    str.Format(_T("\\StringFileInfo\\%04x%04x\\%s"),
                        lpTranslate[i].wLanguage,
                        lpTranslate[i].wCodePage,
                        aszLib[n]);

  18. #18
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 37
    Par défaut
    j'ai reussi en utilisant les operateur de flux voici le code finale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    oss117.str(_T(""));//pour vider le flux
    oss117<<std::hex<<std::setfill(_T('0'));
    oss117 <<(_T("\\StringFileInfo\\"));
    oss117<<std::setw(4)<<lpTranslate[i].wLanguage<<std::setw(4)<<lpTranslate[i].wCodePage;
    oss117<<_T("\\");
    oss117<<aszLib[n];
    chaine=oss117.str();
    oss117.str(_T(""));

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/01/2009, 13h10
  2. Accession aux std::map triées ?
    Par Matthieu Brucher dans le forum SL & STL
    Réponses: 5
    Dernier message: 18/11/2005, 14h44
  3. std::map<int,CStringArray> ????
    Par philippe V dans le forum MFC
    Réponses: 1
    Dernier message: 12/10/2005, 06h48
  4. Libérer des pointeurs dans une std::map
    Par GaldorSP dans le forum SL & STL
    Réponses: 2
    Dernier message: 09/07/2005, 14h42
  5. Trier un std::map selon les valeurs plutot que les clés
    Par dj.motte dans le forum SL & STL
    Réponses: 2
    Dernier message: 13/11/2004, 21h54

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