Bonjour je desire tranformer ma variable static char data[] eb CString
je ne trouve pas la solution
Merci
Bonjour je desire tranformer ma variable static char data[] eb CString
je ne trouve pas la solution
Merci
Quelle version de MFC?
Un petit morceau de code indiquant exactement ce qui doit se passer avant et après conversion?
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.
Voila j'ai tout simplement une variable
static char data[]="692956627063762010156900597370906";
Hors, la valeur est en dure, et je veux lui donner celle que je recois en parametre (CString).
Je travaille avec EvC++.
Donc, tu cherches à convertir une CString en char[] (tu dis l'inverse dans ton premier post).
- Doit-on obtenir un tableau modifiable ou non?
- La chaîne obtenue doit-elle être static ou non?
- Ta version de MFC supporte-t-elle le template CStringT ?
- Sais-tu ce qu'est un TCHAR et comment on s'en sert?
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.
Pardon pour m'etre melange les pinceaux
* Doit-on obtenir un tableau modifiable ou non?
non
* La chaîne obtenue doit-elle être static ou non?
oui
* Ta version de MFC supporte-t-elle le template CStringT ?
je ne crois pas
* Sais-tu ce qu'est un TCHAR et comment on s'en sert?
JE suis novice en C++ et MFC.
Finalement, ma question "modifiable ou non" n'avait pas de sens car la CString est passée en paramètre : On ne peut pas directement piquer dans la CString, car elle a une durée de vie inférieure à la variable statique.
Alors déjà, tu peux tenter ceci:
Si tu as une erreur de conversion TCHAR * --> char * (ou du même tonneau), ça va être un peu plus dur : Ça veut dire que tu compiles en unicode (où les caractères sont des wchar_t ou des WCHAR) et ça ne rentre pas dans un char*.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 //Avec un buffer statique, si on connait la taille maximale void fonction(CString cs) { static char data[TAILLE_BUFFER]; LPCTSTR chn = cs; strncpy(data, cs, TAILLE_BUFFER); data[TAILLE_BUFFER-1] = '\0'; } //Ou avec strdup() (allocation dynamique) void fonction(CString cs) { static char *data = NULL; LPCTSTR chn = cs; data = strdup(chn); }
À partir de là, deux solutions:
- Bosser en TCHAR tout du long (static TCHAR data[], etc) dans tout le programme. Recommandé pour les nouveaux projets.
Par contre, attention si tu fais des malloc() ou des trucs du genre: sizeof(TCHAR) peut valoir 1 ou 2 selon le mode, donc il ne faut jamais oublier de le spécifier...- Convertir la chaîne en WCHAR* en char* . C'est très facile à faire quand tu as une version récente de MFC (car le template CStringT sert à ça), plus dur et moins élégant sinon.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 //Voir la doc de WideCharToMultiByte() pour plus d'info. void fonction(CString cs) { static char data[TAILLE_BUFFER]; LPCTSTR chn = cs; #ifdef UNICODE WideCharToMultiByte(CP_ACP, 0, chn, -1, data, TAILLE_BUFFER, NULL, NULL); #else strncpy(data, cs, TAILLE_BUFFER); #endif data[TAILLE_BUFFER-1] = '\0'; }
Note: Je n'ai rien compilé du tout, donc il y a de forts risques d'échec. Mais c'est l'idée générale.
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.
Merci beaucoup,
je vais regarder tout ca
Je n'y arrive toujours pas la chaine que je convertis n'a pas la meme valeur (j'ai des caracteres en plus (peut etre car ce n'est pas dynamique)).
voici ce que je fais
Comment dois je proceder?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 TCHAR wMsgToSend[33]; swprintf(wMsgToSend, TEXT("%s"), (LPCTSTR) monCString); int Size = WideCharToMultiByte(CP_ACP, 0, wMsgToSend, -1, NULL, 0, NULL, NULL); LPSTR data = new char[Size]; WideCharToMultiByte(CP_ACP, 0, wMsgToSend, -1, data, Size, NULL, NULL);
- Déjà, es-tu certain que monCString fait au plus 33 caractères, caractère nul compris?
- Ensuite, n'utilise pas swprintf(). Si tu tiens à faire une copie de monCString avant de la convertir (ce qui me parait inutile), utilise plutôt _tcsncpy() déclarée dans <tchar.h> (et assure-toi du zéro terminal en ajoutant derrière wMsgToSend[33-1] = TEXT('\0');).
Mais ces détails mis à part, ton double-appel de WideCharToMultiByte() devrait marcher...
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.
Partager