Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3342 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Conversion CString en char* ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Conversion CString en char* ?

n°732896
bozocarzu
Posté le 20-05-2004 à 18:48:52  profilanswer
 

Bonjour,  
 
Je souhaite convertir une chaine CString en char* mais je n'y arrive pas  :fou:  
 

Code :
  1. CString texte = "abc";
  2. char *chaine = (LPCSTR) texte;


 
=> cannot convert from 'const char *' to 'char *'
 
Merci pour votre aide


Message édité par bozocarzu le 20-05-2004 à 18:49:33
mood
Publicité
Posté le 20-05-2004 à 18:48:52  profilanswer
 

n°732907
antp
Super Administrateur
Champion des excuses bidons
Posté le 20-05-2004 à 19:04:05  profilanswer
 

C'est bien avec LPCSTR, mais dans ce cas-ci pourquoi ne pas déclarer ta variable comme const char* plutôt que simple char* ? Je ne vois pas vraiment dans quel cas elle pourrait ne pas être const (enfin, si, mais je pense que ça serait une belle erreur).


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°732909
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-05-2004 à 19:08:21  profilanswer
 

Ca dépend ce que tu veux convertir !
Si ton char* est un pointeur constant, alors la conversion n'est pas automatique sinon ta chaine serait corrompue. Tu dois faire un truc du genre :

Code :
  1. CString texte = "abc";
  2. const char *szConstPtr = texte;


Si ton char* n'est pas un pointeur constant, alors tu peux utiliser les méthodes GetBuffer() et ReleaseBuffer() de CString :

Code :
  1. char *szPtr;
  2. CString texte = "abc";
  3. szPtr = texte.GetBuffer();
  4. texte.ReleaseBuffer();


---------------
J'ai un string dans l'array (Paris Hilton)
n°732913
bozocarzu
Posté le 20-05-2004 à 19:15:35  profilanswer
 

Mon char* n'est pas un pointeur constant :
 
La methode GetBuffer veut un paramètre pour etre compiler.
 
Lorque je lui met une valeur, il compile mais me fais un erreur d'execution

n°732919
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-05-2004 à 19:20:40  profilanswer
 

bozocarzu a écrit :

Mon char* n'est pas un pointeur constant :
 
La methode GetBuffer veut un paramètre pour etre compiler.


Oui, c'est la taille minimum en octets du buffer, ça n'était pas présent dans les anciennes versions de MFC.
Faudrait voir à lire la MSDN de temps en temps hein ! Tel que je te lis, j'ai l'impression que tu fous des valeurs quelconques sans avoir la moindre idée de la signification du paramètre !
 

bozocarzu a écrit :


Lorque je lui met une valeur, il compile mais me fais un erreur d'execution


C'est quoi le message ?
 
edit: pourquoi j'ai l'impression que tu indiques une taille de buffer inférieure à la taille de ta chaine ? :sarcastic:


Message édité par Harkonnen le 20-05-2004 à 19:25:17

---------------
J'ai un string dans l'array (Paris Hilton)
n°732922
bozocarzu
Posté le 20-05-2004 à 19:25:37  profilanswer
 

J'avoue que je n'est pas lu la MSDN  :sarcastic:
 
Le message : L'instruction à @ emploie l'adresse mémoire @. La mémoire ne peut pas être "read".
 

n°732926
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-05-2004 à 19:28:34  profilanswer
 

bozocarzu a écrit :


 
Le message : L'instruction à @ emploie l'adresse mémoire @. La mémoire ne peut pas être "read".


Gagné ! Tu dois donner une taille de buffer inférieure à la taille de ta chaine !
Je t'explique : ta chaine fait 3 caractères + le caractère de fin, ce qui donne 4 octets.
Si tu donnes une taille de buffer de 2 octets, ça veut dire que tu vas aller écrire/lire les 2 octets correspondants au dernier caractère de ta chaine et au caractère de fin dans une zone de mémoire qui ne t'appartient pas => boum !


Message édité par Harkonnen le 20-05-2004 à 19:29:03

---------------
J'ai un string dans l'array (Paris Hilton)
n°732934
bozocarzu
Posté le 20-05-2004 à 19:36:38  profilanswer
 

Bas j'ai aussi penser que c'etais ça, donc j'ai mis une taille de 100, et meme resultat.
 
J'explique un peut plus : J'ai un formulaire et je recupère donc mes variables en CString, mais mon projet m'impose de les converitir en char* et c'est la que je galère

n°732943
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-05-2004 à 19:48:08  profilanswer
 

Pourquoi tu peux pas employer des pointeurs constants ? A priori, si ce sont des variables de formulaire, t'as pas à les modifier !


---------------
J'ai un string dans l'array (Paris Hilton)
n°732945
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-05-2004 à 19:52:52  profilanswer
 

Pour info, j'ai compilé le code suivant :

Code :
  1. void CstringDlg::OnBnClickedOk()
  2. {
  3. // TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
  4. CString texte = "coucou";
  5. char *ptr = texte.GetBuffer(100);
  6. texte.ReleaseBuffer();
  7. MessageBox(ptr);
  8. OnOK();
  9. }


Ca marche sans problème...


---------------
J'ai un string dans l'array (Paris Hilton)
mood
Publicité
Posté le 20-05-2004 à 19:52:52  profilanswer
 

n°732948
bozocarzu
Posté le 20-05-2004 à 19:57:15  profilanswer
 

en faite si je dois les modifier, en faite je dois recupérer la variable du formulaire, puis l'agrandir jusqu'a une taille definie
 
Exemple ; Le mec il me abc dans le champs, et mois je veux que la chaine ai 10 caracteres, je lui ajouter donc 7 espaces !
 

Code :
  1. char* verif(CString text, int longueur){
  2. char* chaine ="";
  3. sprintf(chaine, "%s", (LPCTSTR)text);
  4. while(strlen(chaine) << longueur){
  5.  strcat(chaine, " " );
  6. }
  7. return chaine;
  8. }
  9. char* tcl_add1 = verif(cl_add1, 30)


 
Tu va me dire que je peut d'abord ajouter mes espaces puis la convertir en char* et je te repondrais qu'un prof c'est borner !

n°732952
Taz
bisounours-codeur
Posté le 20-05-2004 à 20:05:42  profilanswer
 

« szConstPtr »
 
 
[:rofl] y a tellement de notation hongroise que la variable n'a plus de nom

n°732953
bozocarzu
Posté le 20-05-2004 à 20:08:12  profilanswer
 

Taz a écrit :

« szConstPtr »
 
 
[:rofl] y a tellement de notation hongroise que la variable n'a plus de nom


 
 :??:

n°732955
antp
Super Administrateur
Champion des excuses bidons
Posté le 20-05-2004 à 20:09:35  profilanswer
 

Mais pourquoi passer par des char* au fait ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°732957
bozocarzu
Posté le 20-05-2004 à 20:13:14  profilanswer
 

antp a écrit :

Mais pourquoi passer par des char* au fait ?


 
Parceque le prof ne veut pas d'objet sauf pour le graphique  :cry:

n°732960
antp
Super Administrateur
Champion des excuses bidons
Posté le 20-05-2004 à 20:13:44  profilanswer
 
n°732964
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-05-2004 à 20:26:07  profilanswer
 

bozocarzu a écrit :


Code :
  1. while(strlen(chaine) << longueur)




t'as pas l'impression de t'être gouré d'opérateur ? [:heink]
 

bozocarzu a écrit :


Code :
  1. char* verif(CString text, int longueur){
  2.    char* chaine ="";
  3.    (...)
  4.    return chaine; 
  5. }




pointeur créé localement dans une fonction, puis retourné par cette fonction => boum !
 
ton code, c'est n'importe quoi !


Message édité par Harkonnen le 20-05-2004 à 20:34:03

---------------
J'ai un string dans l'array (Paris Hilton)
n°732972
bozocarzu
Posté le 20-05-2004 à 20:35:43  profilanswer
 

Pour l'opérateur, lorsque je met < il me sort un warning
 
Je ne savais que l'on ne pouvais pas renvoyer un pointeur créé localement, surtout que ça n'a pas l air d'etre ce pb, mais je vais repenser ma fonction
 

Harkonnen a écrit :


ton code, c'est n'importe quoi !


 
Je suis totalement d'accord


Message édité par bozocarzu le 20-05-2004 à 20:38:56
n°732976
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-05-2004 à 20:43:06  profilanswer
 

bozocarzu a écrit :

Pour l'opérateur, lorsque je met < il me sort un warning


et donc tu te dis qu'avec "<<", ça marcherait mieux...
 

bozocarzu a écrit :


Je ne savais que l'on ne pouvais pas renvoyer un pointeur créé localement,  


Un pointeur est une variable. Si cette variable est créee à l'intérieur d'une fonction, elle "meurt" à la fin de la fonction. Donc ton pointeur n'existe plus à la fin de ta fonction et pointe sur n'importe quoi !
 

bozocarzu a écrit :


surtout que ça n'a pas l air d'etre ce pb, mais je vais repenser ma fonction


y'a plein de problèmes dans ton truc :

Code :
  1. char* verif(CString text, int longueur)
  2. {
  3.    char* chaine =""; // tu alloues un octet pour la chaine
  4.    sprintf(chaine, "%s", (LPCTSTR)text); // tu copies x octets dans une chaine de 1 octet => boum ! et je te passe le cast bourrin
  5.    while(strlen(chaine) << longueur){
  6.      strcat(chaine, " " );
  7.    }
  8.    return chaine; // pointeur local retourné => boum de toute façon, même si ça peut marcher si t'as du bol
  9. }


Message édité par Harkonnen le 20-05-2004 à 20:44:03

---------------
J'ai un string dans l'array (Paris Hilton)
n°732979
antp
Super Administrateur
Champion des excuses bidons
Posté le 20-05-2004 à 20:44:43  profilanswer
 

Harkonnen a écrit :

et donc tu te dis qu'avec "<<", ça marcherait mieux...
 


 
 [:sygus] excellent ça
 
Quelle sera la réaction de Taz [:figti]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°733005
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-05-2004 à 21:30:05  profilanswer
 

D'ailleurs, pourquoi se faire chier avec des strcat et tout, alors que CString est une classe qui peut grandir dynamiquement ?

Code :
  1. CString text("hello" );
  2. if (text.GetLength() < 10)
  3. {
  4.    while (text.GetLength() < 10)
  5.       text += ' ';
  6. }


et on n'en parle plus !
 
edit: je viens de lire qu'il n'a pas le droit à l'objet... hallucinant !
dans ce cas, un petit realloc et c'est terminé !


Message édité par Harkonnen le 20-05-2004 à 21:46:10

---------------
J'ai un string dans l'array (Paris Hilton)
n°733025
bozocarzu
Posté le 20-05-2004 à 22:19:57  profilanswer
 

Au final j'ai tous fais en objet, je négocirais avec mon prof

n°733033
blackgodde​ss
vive le troll !
Posté le 20-05-2004 à 22:41:12  profilanswer
 

Code :
  1. char* verif(CString text, int longueur){
  2.        char* chaine ="";
  3.        (...)
  4.        return chaine; 
  5.   }


 
c'est quoi l'erreur la dedans ?


---------------
-( BlackGoddess )-
n°733038
Taz
bisounours-codeur
Posté le 20-05-2004 à 22:57:00  profilanswer
 

t'as pas l'impression qu'il manque une allocation mémoire et que ton jolie pointeur pointe sur un truc sans doute en lecture seule ?

n°733083
Joel F
Real men use unique_ptr
Posté le 21-05-2004 à 01:14:38  profilanswer
 

mouais .. deja apprendre les string avec CString ...
 
pends ton prof et change d'école.

n°733100
Taz
bisounours-codeur
Posté le 21-05-2004 à 02:30:35  profilanswer
 

surtout quand le mec t'apprends les CString pour mieux les convertir en char*

n°733206
bozocarzu
Posté le 21-05-2004 à 10:22:12  profilanswer
 

Joel F a écrit :

mouais .. deja apprendre les string avec CString ...
 
pends ton prof et change d'école.


 
Nan, mais en faite, on dois faire notre projet en C, mais il accepte quand l'objet pour le graphique. Mais je les quand meme fais avec CString, et si il est pas content, sa seras la meme chose

n°733207
bozocarzu
Posté le 21-05-2004 à 10:23:02  profilanswer
 

Taz a écrit :

surtout quand le mec t'apprends les CString pour mieux les convertir en char*


 
On est pas censer utiliser les CString, mais seulement les char*

n°733214
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 21-05-2004 à 10:29:18  profilanswer
 

Le problème des CString, c'est que c'est une technologie propriétaire (MFC), donc ça ne fonctionnera pas sous Linux !
Quitte à faire de l'objet, t'aurais du utiliser la STL !

n°733230
Taz
bisounours-codeur
Posté le 21-05-2004 à 10:37:01  profilanswer
 

quitte à faire de l'objet, autant faire du C++, quitte à pas faire d'objet autant faire du C ... encore une classe qui est dans l'incompréhension totale ...
 
quand on voit que les base de C sont même pas là ...

n°733400
bozocarzu
Posté le 21-05-2004 à 11:56:09  profilanswer
 

J'aurais du tous faire en C en théorie, mais je voulais une interface graphique, et je ne voulais pas me prendre la tete avec le graphique

n°733478
antp
Super Administrateur
Champion des excuses bidons
Posté le 21-05-2004 à 12:48:14  profilanswer
 

Je ne suis pas sûr que le mélange de C, C++ et MFC soit une bonne solution si tu ne veux pas te prendre la tête :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°733631
bozocarzu
Posté le 21-05-2004 à 14:41:59  profilanswer
 

antp a écrit :

Je ne suis pas sûr que le mélange de C, C++ et MFC soit une bonne solution si tu ne veux pas te prendre la tête :D


 
Bas tu me propose quoi ?

n°733637
antp
Super Administrateur
Champion des excuses bidons
Posté le 21-05-2004 à 14:44:58  profilanswer
 

De ne pas tout mélanger et d'apprendre les bases (les pointeurs, char*, etc.) si tu veux du C :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Conversion CString en char* ?

 

Sujets relatifs
Conversion dun projet VBA -> VB.Net ou VBproblem conversion char* -> string sous visual .net
[asm] conversion chaine numerique flottante en base 10[VB] Conversion de date en VB...
séparation de données et conversion hexadécimaleExtraction et conversion d'un fichier xml en fichier image
ANSI C++ Conversion int to stringConversion simple de String
[résolu ] Conversion UTF-8 => OEM[C++] conversion double en int ?
Plus de sujets relatifs à : Conversion CString en char* ?


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)