Copie de CString vers LPSTR... - C++ - Programmation
Marsh Posté le 18-04-2003 à 10:44:50
t'as une macro pour transformer ta CString en char*.
un truc comme:
CString genre
char* str=LPCSTR(genre)
Marsh Posté le 18-04-2003 à 10:49:14
En fait, je pense que quand je fait strcpy (char *, CString), la CString est automatiquement casté en char *. du coup,
strcpy(tvInsert.item.pszText , LPCSTR(genre));
Me fait exactement la même erreur....
Good try man
Au fait, l'erreur c'est une erreur de type memory can't be written...
Marsh Posté le 18-04-2003 à 10:54:02
si Genre est une CString, alors utilise genre.GetBuffer() pour récupére le buffer contenant la chaine. tu obtiens l'équivalent d'un char *
une fois que tu n'en a plus besoin, tu fais un genre.ReleaseBuffer()
Marsh Posté le 18-04-2003 à 10:58:22
J'ai fait :
strcpy(tvInsert.item.pszText , genre.GetBuffer(genre.GetLength()));
genre.ReleaseBuffer();
et ca me fait toujours la même chose....
Faut-y que je vérifie l'init de genre (j'arrive à l'afficher cette string...) ?
Marsh Posté le 18-04-2003 à 11:02:24
Gooopil a écrit : J'ai fait : |
Inutile de mettre des paramètres pour GetBuffer()
Marsh Posté le 18-04-2003 à 11:03:04
Harkonnen a écrit : si Genre est une CString, alors utilise genre.GetBuffer() pour récupére le buffer contenant la chaine. tu obtiens l'équivalent d'un char * |
Pas besoin : strcpy prend un const char * comme 2e paramètre : une CString est castée implicitement en LPCTSTR (pointeur constant sur chaine ~= const char *)
Et si tu faus un bête:
Code :
|
ça marche ?
Marsh Posté le 18-04-2003 à 11:04:35
Harkonnen a écrit : |
Et GetBuffer, ça rend un tableau de quelle taille ?
'faut bien fixer une taille, pour ne pas risquer un débordement tableau (pas la taille de "genre", évidement, mais plutot la taille de la chaine que genre va acueillir)
Marsh Posté le 18-04-2003 à 11:04:46
Harkonnen a écrit : |
ha ben la je ne suis pas d'accord
Code :
|
PS : il faut bien noter la presence du S a 0 parameters
Marsh Posté le 18-04-2003 à 11:08:50
VC++ il connait pas msmet....
Et il faut absolument un param à GetBuffer en effet.
J'a essayé
Code :
|
Et ben c'est toujours pareil
Edit :
Au fait, dans genre j'ai jamais une chaine bien longue, c'est le genre qui est lu dans un tag mp3, la en l'occurence je teste sur un fichier genre=blues du coup ca doit bien rentrer dans szTest[1024]
Marsh Posté le 18-04-2003 à 11:09:35
El_gringo a écrit :
|
humhum ... sizeof(char[1024]) ou sizeof sztest .... merci ...
Marsh Posté le 18-04-2003 à 11:11:31
polo021 a écrit :
|
j'ai pas souvenir d'en avoir mis pourtant, j'utilisais les MFC de Visual Studio 5.0, ça a peut etre changé depuis
Marsh Posté le 18-04-2003 à 11:11:53
Gooopil a écrit : VC++ il connait pas msmet....
|
par contre, quand on se sert d'un clavier avec les doigts, on peut taper memset qui marche tout de suite mieux ...
Ton choix d'utiliser strcpy est assez discutable ... Tu connais strncpy ?
Edit ... Je suis fatigué, moi ...
Marsh Posté le 18-04-2003 à 11:13:52
Harkonnen a écrit : |
ben ca doit etre ca. Alors j'ai contourne le probleme (je ne savais pas combien mettre comme parametre)
i=0;
while (i<string.getlenght())
{
char[i]= string.getat(i
i++;
}
char[i]='\0';
Marsh Posté le 18-04-2003 à 11:14:27
Code :
|
Fait pareil...
Marsh Posté le 18-04-2003 à 11:17:10
Gooopil a écrit :
|
(en soi, c'était logique : memset ne fait que mettre la mem à 0 ...)
Marsh Posté le 18-04-2003 à 11:18:03
polo021 a écrit : |
Ben j'avais pas pensé à ca....Mais je sais pas si c'est très propre...Si j'arrive à faire marcher ca et que c'est suffisemment propre, c'est nickel....
Je connais pas strncpy ShockWave, c'est quoi l'avantage ?
Marsh Posté le 18-04-2003 à 11:19:59
ReplyMarsh Posté le 18-04-2003 à 11:20:29
ReplyMarsh Posté le 18-04-2003 à 11:21:27
Gooopil a écrit :
|
Et tu passes ton truc au débugger ?
C'est quelle ligne qui merde ?
Marsh Posté le 18-04-2003 à 11:21:49
El_gringo a écrit : |
sizeof( /* insère ici un TYPE */);
ou
sizeof /* insère ici une VARIABLE */;
C'est mieux ...
Marsh Posté le 18-04-2003 à 11:22:13
El_gringo a écrit : |
Pas grave Je suis un peu responsable aussi...Suffisait de remettre dans le bon ordre
Marsh Posté le 18-04-2003 à 11:24:23
El_gringo a écrit : |
C'est la dernière....c'est chelou ca non ? Pourtant si j'y met du text ds tvInsert.item.pszText ca marche....
Marsh Posté le 18-04-2003 à 11:28:34
|
|
Donc
Code :
|
ca suffit amplement.
Marsh Posté le 18-04-2003 à 11:32:00
VisualC++ a écrit :
|
error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class CString' (or there is no acceptable conversion)
Donc pas besoin de poster toute la msdn
Marsh Posté le 18-04-2003 à 11:33:28
Euh jsais pas comme tu compiles car je viens de faire le teste et ca marche moi
Marsh Posté le 18-04-2003 à 11:34:26
OUPSssssssssssssss desole oublie un truc
Code :
|
faut le GetBuffer(0) pour te done un char*
Marsh Posté le 18-04-2003 à 11:35:04
Gooopil a écrit : |
Ben faudrait la lire quand mm avant de poster
Marsh Posté le 18-04-2003 à 11:35:48
VisualC++ a écrit : Euh jsais pas comme tu compiles car je viens de faire le teste et ca marche moi |
J'ai revérifié, et effectivement ca ne compile pas du tout...
Je suis sous VC++ 6.0. Sinon je compile normalement j'imagine...
Marsh Posté le 18-04-2003 à 11:37:09
VisualC++ a écrit : OUPSssssssssssssss desole oublie un truc
|
Attends ca m'interesse la
avec string.GetBuffer(0) tout le contenu de la string est copie dans un tableau de char?
Marsh Posté le 18-04-2003 à 11:39:37
VisualC++ a écrit : |
Hehe j'essaye mais c'est pas toujours facile
Sinon ton tvInsert.item.pszText = genre.GetBuffer(0);,
c'est de la bombe ca marche !
Visual C++ mon héro
Merci pour l'aide tout le monde
Marsh Posté le 18-04-2003 à 11:40:26
polo021 a écrit : Attends ca m'interesse la |
Vi ca marche
Marsh Posté le 18-04-2003 à 11:40:30
Qui a parle d une copie, item.pszText c l adresse d une chaine de car nul terminated, et via GetBuffer(0) tu recupe l adresse de la CString donc c tout.
Marsh Posté le 18-04-2003 à 11:47:04
VisualC++ a écrit : Qui a parle d une copie, item.pszText c l adresse d une chaine de car nul terminated, et via GetBuffer(0) tu recupe l adresse de la CString donc c tout. |
ha ok , c'est bien ce que je pensais , donc le getbuffer ne sert en rien a retourner le contenu de la CString
char tmp[128];
CString str = "toto";
tmp = str.GetBuffer(0);
tmp ne vaudra pas "toto" , c'est bien ca?
Marsh Posté le 18-04-2003 à 11:51:21
polo021 a écrit : tmp ne vaudra pas "toto" , c'est bien ca? |
non ! GetBuffer te retourne un pointeur sur la string ! un char* quoi !
Marsh Posté le 18-04-2003 à 11:54:25
ReplyMarsh Posté le 18-04-2003 à 14:06:57
VisualC++ a écrit : OUPSssssssssssssss desole oublie un truc
|
C'est un peu n'importe quoi de faire un GetBuffer(0) sans faire de ReleaseBuffer() :
http://msdn.microsoft.com/library/ [...] buffer.asp
surtout quand un simple
Code :
|
suffit.
Marsh Posté le 18-04-2003 à 14:09:52
Oui faut le release, mais bon comem d hab qqun au dessus l a dit (me semble Harko) vais pas ecrire non plus le soft a sa place.
aussi le LPCTSTR ca marche, mais j ai jamais dit TIENT VOILA L'UNIQUE SOLUTION
Marsh Posté le 18-04-2003 à 10:07:16
Hello
Voila le bout de code que j'arrive pas à faire marcher :
Ca crash sur le strcpy
genre est une CString valable puisque je peux l'afficher dans une messagebox par exemple....
Si je remplace genre par du texte :
Ca marche sans aucun problème....
Voila, merci d'avance