Conversion CString en char* ?

Conversion CString en char* ? - C++ - Programmation

Marsh Posté le 20-05-2004 à 18:48:52    

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
Reply

Marsh Posté le 20-05-2004 à 18:48:52   

Reply

Marsh Posté le 20-05-2004 à 19:04:05    

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
Reply

Marsh Posté le 20-05-2004 à 19:08:21    

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)
Reply

Marsh Posté le 20-05-2004 à 19:15:35    

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

Reply

Marsh Posté le 20-05-2004 à 19:20:40    

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)
Reply

Marsh Posté le 20-05-2004 à 19:25:37    

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".
 

Reply

Marsh Posté le 20-05-2004 à 19:28:34    

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)
Reply

Marsh Posté le 20-05-2004 à 19:36:38    

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

Reply

Marsh Posté le 20-05-2004 à 19:48:08    

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)
Reply

Marsh Posté le 20-05-2004 à 19:52:52    

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)
Reply

Marsh Posté le 20-05-2004 à 19:52:52   

Reply

Marsh Posté le 20-05-2004 à 19:57:15    

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 !

Reply

Marsh Posté le 20-05-2004 à 20:05:42    

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

Reply

Marsh Posté le 20-05-2004 à 20:08:12    

Taz a écrit :

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


 
 :??:

Reply

Marsh Posté le 20-05-2004 à 20:09:35    

Mais pourquoi passer par des char* au fait ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 20-05-2004 à 20:13:14    

antp a écrit :

Mais pourquoi passer par des char* au fait ?


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

Reply

Marsh Posté le 20-05-2004 à 20:13:44    

Reply

Marsh Posté le 20-05-2004 à 20:26:07    

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)
Reply

Marsh Posté le 20-05-2004 à 20:35:43    

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
Reply

Marsh Posté le 20-05-2004 à 20:43:06    

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)
Reply

Marsh Posté le 20-05-2004 à 20:44:43    

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
Reply

Marsh Posté le 20-05-2004 à 21:30:05    

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)
Reply

Marsh Posté le 20-05-2004 à 22:19:57    

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

Reply

Marsh Posté le 20-05-2004 à 22:41:12    

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


 
c'est quoi l'erreur la dedans ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 20-05-2004 à 22:57:00    

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 ?

Reply

Marsh Posté le 21-05-2004 à 01:14:38    

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

Reply

Marsh Posté le 21-05-2004 à 02:30:35    

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

Reply

Marsh Posté le 21-05-2004 à 10:22:12    

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

Reply

Marsh Posté le 21-05-2004 à 10:23:02    

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*

Reply

Marsh Posté le 21-05-2004 à 10:29:18    

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 !

Reply

Marsh Posté le 21-05-2004 à 10:37:01    

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à ...

Reply

Marsh Posté le 21-05-2004 à 11:56:09    

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

Reply

Marsh Posté le 21-05-2004 à 12:48:14    

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
Reply

Marsh Posté le 21-05-2004 à 14:41:59    

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 ?

Reply

Marsh Posté le 21-05-2004 à 14:44:58    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed