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 :

Problème de conversion de CString en char *


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 159
    Points : 71
    Points
    71
    Par défaut Problème de conversion de CString en char *
    Salut,

    J'ai un problème de conversion d' un CString en char *. J'ai fait des recherche sur le net et voilà le code que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //convertir une CString en un char *
    char * CStringToChar(CString chaineAConvertir)
    {		AfxMessageBox(chaineAConvertir);
          char * szPtr = NULL;
          szPtr = chaineAConvertir.GetBuffer(2);
    	  AfxMessageBox(szPtr);
          chaineAConvertir.ReleaseBuffer();
    	  return  szPtr;
    }
    Avec les message box je vérifie que j'ai la bonne chaine, notamment szPtr. Mais quand je récupere la valeur retournée par cette fonction en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char * NomFichier = "tagada";
    	NomFichier = CStringToChar ("youppiii");
    	AfxMessageBox(NomFichier);
    L'ordre de l'affichage est le suivant "youppiii", "youppiii" (correspondant au AfxMessageBox à l'interieur de CStringToChar) et puis le 3ème AfxMessageBox affiche une suite de caractères bizaaaaares

    qualqu'un a une idée?

    Merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Tu retournes un pointeur vers un buffer que tu viens de releaser ET de détruire...

    Si tu tiens à convertir une CString en char*, utilise l'allocation dynamique (malloc(strlen())+strcpy(), ou _strdup()).

    PS: Pourquoi chercher à faire une telle conversion? Es-tu sûr que tu ne veux pas simplement un const char * ?
    La conversion d'une CString en LPCTSTR est implicite, mais pose les mêmes problèmes de portée (le pointeur n'est garanti valide que tant que la CString n'est absolument pas modifiée).

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 159
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Tu retournes un pointeur vers un buffer que tu viens de releaser ET de détruire...
    Donc je fais autrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char * CStringToChar(CString chaineAConvertir)
    {		AfxMessageBox(chaineAConvertir);
          char * szPtr = NULL;
          szPtr = chaineAConvertir.GetBuffer(2);
          AfxMessageBox(szPtr);
           //je ne détruis pas le buffer
          //chaineAConvertir.ReleaseBuffer();
          return  szPtr;
    }

    et puis je fais l'appel suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            char * NomFichier = "tagada";
            CString maChaine;
            maChaine.Format( "youppiii");
    	NomFichier = CStringToChar (maChaine);        
    	AfxMessageBox(NomFichier);
            maChaine.ReleaseBuffer();
    Mais ça marche toujours pas, pourtant je fais l'affichage avant qu je release le buffer, je comprends pas

    Citation Envoyé par Médinoc Voir le message
    PS: Pourquoi chercher à faire une telle conversion? Es-tu sûr que tu ne veux pas simplement un const char * ?
    La conversion d'une CString en LPCTSTR est implicite, mais pose les mêmes problèmes de portée (le pointeur n'est garanti valide que tant que la CString n'est absolument pas modifiée).
    justement y a des traitements sur la CString, sonc elle est modifiée!

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Ta fonction bosse sur une copie de la chaîne, et cette copie est détruite lors du return...
    justement y a des traitements sur la CString, sonc elle est modifiée!
    • AfxMessageBox() ne modifie pas la chaîne et peut se contenter d'un simple LPCTSTR.
    • Si tu récupères un char* pour modifier la chaîne, alors inutile de passer par une fonction intermédiaire: Utilise directement GetBuffer()...

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 159
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ta fonction bosse sur une copie de la chaîne, et cette copie est détruite lors du return...
    oué mais je récupère sa valeur dans la variable nomFichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char * NomFichier = "tagada";
            CString maChaine;
            maChaine.Format( "youppiii");
    	NomFichier = CStringToChar (maChaine);        
    	AfxMessageBox(NomFichier);
            maChaine.ReleaseBuffer();
    Citation Envoyé par Médinoc Voir le message
    [*]AfxMessageBox() ne modifie pas la chaîne et peut se contenter d'un simple LPCTSTR.
    c'est pas ça le traitement, c'était juste pour m'assurer de la valeur de la variable, c'est tout!
    Citation Envoyé par Médinoc Voir le message
    Si tu récupères un char* pour modifier la chaîne, alors inutile de passer par une fonction intermédiaire: Utilise directement GetBuffer()...
    Meme ce qui suit ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
             CString maChaine ;
            char * NomFichier = maChaine.GetBuffer(0);       
    	AfxMessageBox(NomFichier);
    ne marche pas!

  6. #6
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Je ne connais pas précisément l'utilisation de la classe CString, mais le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char * CStringToChar(CString chaineAConvertir)
    {		AfxMessageBox(chaineAConvertir);
          char * szPtr = NULL;
          szPtr = chaineAConvertir.GetBuffer(2);
          AfxMessageBox(szPtr);
           //je ne détruis pas le buffer
          //chaineAConvertir.ReleaseBuffer();
          return  szPtr;
    }
    m'interpelle.

    Tu passe l'argument chaineAConvertir par valeur au lieu d'un passage par adresse ou référence. Du coup la valeur szPtr renvoyée peut ne plus exister lorsque la fonction se termine. Essaye plutôt ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char * CStringToChar(CString &chaineAConvertir)
    {		AfxMessageBox(chaineAConvertir);
          char * szPtr = NULL;
          szPtr = chaineAConvertir.GetBuffer(2);
          AfxMessageBox(szPtr);
           //je ne détruis pas le buffer
          //chaineAConvertir.ReleaseBuffer();
          return  szPtr;
    }

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CString maChaine = "foo" ;
    char * monCharEtoile = maChaine.GetBuffer(0);       
    AfxMessageBox(monCharEtoile);
    Ceci devrait marcher.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/05/2007, 14h35
  2. Probléme de conversion char vers datetime
    Par locs dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 28/02/2007, 16h29
  3. (Problème avec...) conversion de std::string en char
    Par crossbowman dans le forum SL & STL
    Réponses: 7
    Dernier message: 05/03/2006, 20h54
  4. [MFC] Problème de conversion CString vers Char *
    Par Darkenshin dans le forum MFC
    Réponses: 10
    Dernier message: 02/12/2005, 15h42
  5. [CString -> int] Problème de conversion
    Par Manson dans le forum MFC
    Réponses: 2
    Dernier message: 20/06/2005, 15h25

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