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

Visual C++ Discussion :

conversion string to char* et erreur ATL CString


Sujet :

Visual C++

  1. #1
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut conversion string to char* et erreur ATL CString
    Bonjour,

    J'ai un bout de code que je ne comprend pas trop
    car je dois convertir un string en char* et j'ai le message d'erreur suivant pourtant j'inclu bien mes header :


    #include<string>
    using std::string



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CString m_strvariable;
    char* charstr;
     
    charstr=m_strvariable.c_str();   // erreur
    J'ai l'erreur C2039 'c_str' : n'est pas membre de ATL::CStringT<Base Type,StringTraits>

    Donc apparement j'utilise du Win32. Par contre ATL et MFC c'est bien identique? Dois-je utiliser un autre header? ou bien simplement convertir mon CString en std::string?

    Autrement je peux convertir CString mais en const Char* uniquement avec ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    charstr= (LPCTSTR) m_strvariable;

    Merci

  2. #2
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Pour du pur Win32 tu as la classe string et non CString

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    string m_strvariable;     // pas de CString ici
    char* charstr;
     
    charstr=m_strvariable.c_str();  // à vérifier je crois que string::c_str() retourne un const char*
    Pour de l'ATL ou MFC tu as la classe CString

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CString str = "ma chaîne";
    LPSTR szBuffer = str.GetBuffer();
    // j'utilise mon szBuffer...
    str.ReleaseBuffer(); // je n'oublie pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CString str = "ma chaîne";
    LPSTR szBuffer = (LPSTR)(LPCSTR) str;  // tu as aussi ce choix
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CString str = ma chaîne;
    LPSTR szBuffer = str.GetString();  // tu as encore aussi ce choix

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Ton premier code ne devrait pas compiler, c_str() retourne un pointeur const.
    Il n'existe aucun moyen d'obtenir un pointeur non-const sur les caractères d'une std::string (excepté un const_cast, bien sûr).
    Ton 3e code est un hack et pire, il fait ça avec les opérateurs de cast C au lieu du const_cast.
    Ton 4e code ne compilera pas, le pointeur retourné par GetString() est const également.
    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.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Déconseillé, c'est un hack:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    string m_strvariable;
    char* charstr;
     
    //C'est un hack.
    charstr = const_cast< char * >(m_strvariable.c_str());
    Ce code-ci est OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CStringA str = "ma chaîne";
    LPSTR szBuffer = str.GetBuffer();
    // j'utilise mon szBuffer...
    str.ReleaseBuffer(); // je n'oublie pas
    C'est un hack:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CStringA str = "ma chaîne";
    LPCSTR sczStr = str;
    LPSTR szBuffer = const_cast< LPSTR >(sczStr);
    C'est encore un hack:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CStringA str = ma chaîne;
    LPSTR szBuffer = const_cast< LPSTR >(str.GetString());
    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.

  5. #5
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut
    Re,

    Desole pour ce retard, merci bcp, j'ai utilise la methode GetBuffer() et releaseBuffer() pour liberer mon CString.

    Comment est-ce que ce code peut etre un hack ?

    code: charstr = const_cast< char * >(m_strvariable.c_str());


    Merci

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Très simple, il nécessite un const_cast.
    Nul n'est supposé avoir un accès en écriture au buffer interne d'une std::string.
    Tout accès en écriture vers ce buffer est donc un hack.
    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.

Discussions similaires

  1. [Débutant] Conversion string vers char
    Par sachaaaz dans le forum C#
    Réponses: 6
    Dernier message: 12/03/2012, 11h42
  2. conversion string en char *
    Par nana38000 dans le forum Débuter
    Réponses: 7
    Dernier message: 02/04/2010, 14h49
  3. Conversion string to char *
    Par uriotcea dans le forum Débuter
    Réponses: 2
    Dernier message: 22/12/2009, 12h51
  4. conversion String to char*
    Par warning dans le forum C++Builder
    Réponses: 5
    Dernier message: 07/12/2007, 11h29
  5. Conversion String vers char
    Par benwit dans le forum Langage
    Réponses: 27
    Dernier message: 30/03/2007, 14h01

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