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 lors d'une conversion CString -> char*


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Par d�faut Probl�me lors d'une conversion CString -> char*
    Bonjour,

    j'ai une m�thode, qui prend en param�tre une variable path, de type CString.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    int maClasse::maMethode(CString path)
    {...}
    L'une des premi�res instructions est de convertir ce CString en char*.

    J'ai donc, pour cela, utilis�
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    char* filePath = (char*)path.GetBuffer(path.GetLength());
    path.ReleaseBuffer();
    Si je ne mets pas le (char*) devant path.getBuffer, j'ai une erreur de compil du genre
    error C2440: 'initializing' : cannot convert from 'wchar_t *' to 'char *'
    Et le probl�me est que filePath, lechar* ainsi r�cup�r� ne contient QUE le premier caract�re de path. Par exemple, si path="C:\blabla\blabla\toto.xml" alors filePath="C".

    Des id�es sur la raison de ce bug et sur la fa�on de le r�soudre ?

    Merci.

  2. #2
    Membre �prouv�
    Inscrit en
    Mai 2007
    Messages
    157
    D�tails du profil
    Informations personnelles :
    �ge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par d�faut
    Je pense qu'on t'en a deja parl� mais pr�f�re les string et ses methodes pour faire les conversions...

    Par exemple string -> const char * mastring.c_str();

    apres pourquoi ta m�thode ne r�cup�re que le premier char....? Peut �tre tu pourrais mettre le code de ta m�thode.

    Quand tu arrives dans ta m�thode, tu r�cup�res la chaine compl�te? Fais tu la bonne allocation m�moire dans ton corps de m�thode?

  3. #3
    screetch
    Invit�(e)
    Par d�faut
    le probleme vient de la conversion wchar_t->char. Un wchar_t est code sur deux octets mais C n.en a besoin que d'un, donc l'autre octet vaut 0.

    Si tu forces la conversion wchar_t* => char alors tu interpretes des paquetes de deux octets comme des octets, il voit un 0 (la deuxieme moitie du premier caractere) et c'est la fin de ta chaine.


    Debarasse toi des wchar_t en allant dans les proprietes du projet, onglet General, change le character set de Unicode a MultiByte, et garde les char*. Quand il y a une erreur de cast, ne force pas le cast, ca va donner un resultat moyen.

    Si tu peux evite les CString, utilise std::string.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Par d�faut
    Ben justement, je ne sais pas pourquoi ma m�thode ne r�cup�re que le premier caract�re, j'aimerais bien qu'elle les prenne tous !

    Les lignes de code que j'ai mises ont �t� prises sur une FAQ donc je ne pense pas qu'elles soient fausses. Les m�thodes GetBuffer et GetLength sont propres � la classe CString, donc elles doivent marcher aussi normalement

    Alors apr�s j'ai toujours la solution de faire CString -> string -> char*, mais bon �a fait beaucoup quand m�me...

  5. #5
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par magicpm7 Voir le message
    Ben justement, je ne sais pas pourquoi ma m�thode ne r�cup�re que le premier caract�re, j'aimerais bien qu'elle les prenne tous
    Parce que, quand tu travailles sur un char* comme �tant une cha�ne de caract�re, la cha�ne est sens�e s'arr�ter... au premier caract�re '\0'...

    Et que, si tu converti wchar_t en char, il appara�t... lors de conversion du premier caract�re

    CQFD

    Si tu dois utiliser, d'une mani�re ou d'un autre, une cha�ne de caract�re qui utilise des wchar_t (std::wstring ou d�riv�es telles que CString), il faut te limiter � un wchar_t et utiliser les sp�cialisations utilisant wchar_t pour ce qui est de la gestion des flux
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    42
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Par d�faut
    Dacodac.

    Et � tout hasard, est-ce que quelqu'un sait comment convertir un wchar_t en int ?

  7. #7
    Membre chevronn� Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par d�faut
    Aller normalement il faudrai te dire voir la FAQ, ou meme google
    mais je suis gentil:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    std::stringstream ss; //Pour wide char utiliser wstringstream
    ss << str;
    int i;
    ss >> i;
    si ton pb est r�solut pense a le marquer r�solut

  8. #8
    Membre chevronn� Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par d�faut
    Tu compile en caract�re unicode, ce qui est bien. Donc utilise les wchar_t � la place des char (Attention tous les fonctions de manipulation de chaine vont �tre modifi�s).
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    wchar_t* filePath = path.GetBuffer();
    std::wcout << filePath;

Discussions similaires

  1. R�ponses: 3
    Dernier message: 17/02/2014, 16h25
  2. R�ponses: 6
    Dernier message: 02/05/2010, 13h04
  3. R�ponses: 4
    Dernier message: 29/06/2009, 18h02
  4. [MFC] Probl�me de conversion CString vers Char *
    Par Darkenshin dans le forum MFC
    R�ponses: 10
    Dernier message: 02/12/2005, 14h42
  5. R�ponses: 2
    Dernier message: 21/06/2004, 15h55

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