Fonction qui retourne un char*

Fonction qui retourne un char* - C++ - Programmation

Marsh Posté le 06-06-2003 à 09:21:51    

je voudrais bien faire une fonction de conversion d'un CString en char*.
Je sais que je pourrais utiliser GetBuffer(...); mais dans mon cas ca ne m'arrange pas.
J'ai donc fait cette fonction

Code :
  1. char* GatewayComm::CStringToChar(CString source)
  2. {
  3. int i=0;
  4. char dest[source.GetLength()+1];
  5. while (i<source.GetLength())
  6. {
  7.  dest[i] = (char)source.GetAt(i);
  8.  ++i;
  9. }
  10. dest[i] = '\0';
  11. return (dest);
  12. }


mais a la compilation, il n'accepter pas la taille du tableau car elle n'est pas fixe.
Donc je pourrais le faire avec un malloc mais ma valeur de retour serait detruite je pense.  
Quelqu'un aurait'il une idee qui me permettrai de faire fonctionner cette fonction?
 
 :jap:

Reply

Marsh Posté le 06-06-2003 à 09:21:51   

Reply

Marsh Posté le 06-06-2003 à 09:23:09    

polo021 a écrit :

je voudrais bien faire une fonction de conversion d'un CString en char*.
Je sais que je pourrais utiliser GetBuffer(...); mais dans mon cas ca ne m'arrange pas.
J'ai donc fait cette fonction

Code :
  1. char* GatewayComm::CStringToChar(CString source)
  2. {
  3. int i=0;
  4. char dest[source.GetLength()+1];
  5. while (i<source.GetLength())
  6. {
  7.  dest[i] = (char)source.GetAt(i);
  8.  ++i;
  9. }
  10. dest[i] = '\0';
  11. return (dest);
  12. }


mais a la compilation, il n'accepter pas la taille du tableau car elle n'est pas fixe.
Donc je pourrais le faire avec un malloc mais ma valeur de retour serait detruite je pense.  
Quelqu'un aurait'il une idee qui me permettrai de faire fonctionner cette fonction?
 
 :jap:  


Malloc ou new si c'est C++...


Message édité par skeye le 06-06-2003 à 09:23:50
Reply

Marsh Posté le 06-06-2003 à 09:24:11    

skeye a écrit :


Malloc ou new si c'est C++...


et je le fais ou le free du malloc ou le delete du new?  :o


Message édité par polo021 le 06-06-2003 à 09:25:08
Reply

Marsh Posté le 06-06-2003 à 09:25:00    

new si t en C++. le seul pb c que ton truc sera pas effacé de lui meme, faudra te le faire a la main.

Reply

Marsh Posté le 06-06-2003 à 09:25:59    

polo021 a écrit :


et je le fais ou le free du malloc ou le delete du new?  :o


 
tu cprends pourquoi les char * c merdique pour les strings ? :D Parce que les strings on a souvent un peu partout et avec les char * on sait jamais si on peut free() ou pas.....
 
Pkoi t'as besoin de passer en char * ?

Reply

Marsh Posté le 06-06-2003 à 09:26:01    

polo021 a écrit :

je voudrais bien faire une fonction de conversion d'un CString en char*.
Je sais que je pourrais utiliser GetBuffer(...); mais dans mon cas ca ne m'arrange pas.
J'ai donc fait cette fonction

Code :
  1. char* GatewayComm::CStringToChar(CString source)
  2. {
  3. int i=0;
  4. char dest[source.GetLength()+1];
  5. while (i<source.GetLength())
  6. {
  7.  dest[i] = (char)source.GetAt(i);
  8.  ++i;
  9. }
  10. dest[i] = '\0';
  11. return (dest);
  12. }


mais a la compilation, il n'accepter pas la taille du tableau car elle n'est pas fixe.
Donc je pourrais le faire avec un malloc mais ma valeur de retour serait detruite je pense.  
Quelqu'un aurait'il une idee qui me permettrai de faire fonctionner cette fonction?
 
 :jap:  


 
 [:ddr555] Mais non! On ne peut pas retourner l'adresse d'une variable statique, tu es obligé d'allouer un espace mémoire et de renvoyer son adresse (new ou malloc comme ça a déjà été dit).


---------------
Le Tyran
Reply

Marsh Posté le 06-06-2003 à 09:26:08    

chrisbk a écrit :

new si t en C++. le seul pb c que ton truc sera pas effacé de lui meme, faudra te le faire a la main.
 


ca fait pas trop degueux si je mets le free dans le destructeur de la classe alors que j'ai alloue la variable dans une fonction?

Reply

Marsh Posté le 06-06-2003 à 09:26:59    

chrisbk a écrit :


 
tu cprends pourquoi les char * c merdique pour les strings ? :D Parce que les strings on a souvent un peu partout et avec les char * on sait jamais si on peut free() ou pas.....
 
Pkoi t'as besoin de passer en char * ?


socket [:spamafote]
 
ne me parle pas de getbuffer stp [:ruisseau de larmes]

Reply

Marsh Posté le 06-06-2003 à 09:27:03    

polo021 a écrit :


et je le fais ou le free du malloc ou le delete du new?  :o


là ou t'as plus besoin de ton char * ... [:ddr555]

Reply

Marsh Posté le 06-06-2003 à 09:27:10    

polo021 a écrit :


ca fait pas trop degueux si je mets le free dans le destructeur de la classe alors que j'ai alloue la variable dans une fonction?


 
ca peut l'etre, si ton pointeur vers ton char * se promene dans la nature de facon incontrolé (je veux dire, si une fonction memebre alloue ce char * et tu sais que ce char * ne sort pas de ta classe, non, sinon oui)

Reply

Marsh Posté le 06-06-2003 à 09:27:10   

Reply

Marsh Posté le 06-06-2003 à 09:27:12    

Renvoie une String et te fais pas chier.


---------------
Le Tyran
Reply

Marsh Posté le 06-06-2003 à 09:27:39    

polo021 a écrit :


socket [:spamafote]
 
ne me parle pas de getbuffer stp [:ruisseau de larmes]


 
(pkoi ?)
et LockBuffer() ?

Reply

Marsh Posté le 06-06-2003 à 09:27:46    

polo021 a écrit :


ca fait pas trop degueux si je mets le free dans le destructeur de la classe alors que j'ai alloue la variable dans une fonction?


Pas trop...free(null) ne fait rien normalement... [:spamafote]

Reply

Marsh Posté le 06-06-2003 à 09:28:42    

chrisbk a écrit :


 
ca peut l'etre, si ton pointeur vers ton char * se promene dans la nature de facon incontrolé (je veux dire, si une fonction memebre alloue ce char * et tu sais que ce char * ne sort pas de ta classe, non, sinon oui)


mon char sort de la classe [:ddr555]

Reply

Marsh Posté le 06-06-2003 à 09:29:45    

polo021 a écrit :


mon char sort de la classe [:ddr555]


bah là il va falloir lui foutre une valeur dans le constructeur, histoire de pouvoir tester sa validité à l'utilisation, non?

Reply

Marsh Posté le 06-06-2003 à 09:30:32    

skeye a écrit :


bah là il va falloir lui foutre une valeur dans le constructeur, histoire de pouvoir tester sa validité à l'utilisation, non?


 
C pas ca le pb :O
 
le pb c que si ta classe meurt, elle va faire un delete sur le char *, et si jamais ton ptr se promenait alors il est possible qu'un acces sur le tableau pointé par ce char * soit effectué => crash :O

Reply

Marsh Posté le 06-06-2003 à 09:31:08    

skeye a écrit :


bah là il va falloir lui foutre une valeur dans le constructeur, histoire de pouvoir tester sa validité à l'utilisation, non?


pas forcement je pense

Reply

Marsh Posté le 06-06-2003 à 09:32:26    

Utilise des smartpointer, je dois avoir une classe template de smartpointer qui traine si tu veux.


Message édité par LetoII le 06-06-2003 à 09:32:55

---------------
Le Tyran
Reply

Marsh Posté le 06-06-2003 à 09:33:09    

chrisbk a écrit :


 
C pas ca le pb :O
 
le pb c que si ta classe meurt, elle va faire un delete sur le char *, et si jamais ton ptr se promenait alors il est possible qu'un acces sur le tableau pointé par ce char * soit effectué => crash :O


Ah oui...:/
Un accesseur qui prend un paramètre un autre char * et qui recopie l'original dedans, alors? C'est de plus en plus moche là... [:alph-one]

Reply

Marsh Posté le 06-06-2003 à 09:33:44    

chrisbk a écrit :


 
C pas ca le pb :O
 
le pb c que si ta classe meurt, elle va faire un delete sur le char *, et si jamais ton ptr se promenait alors il est possible qu'un acces sur le tableau pointé par ce char * soit effectué => crash :O


logiquement non, ma classe n'est pas censee etre detruite entre temps. Car je n'utilise qu'un seul  objet de cette classe et pendant toute la duree du programme.
 
EDIT : mais le malloc , ca me fait un peu peur quand meme, on ne sait jamais :/


Message édité par polo021 le 06-06-2003 à 09:35:11
Reply

Marsh Posté le 06-06-2003 à 09:34:43    

Mais pkoi tu utilises pas ce boudiou de LockBuffer ???
 
http://msdn.microsoft.com/library/ [...] buffer.asp
 

Reply

Marsh Posté le 06-06-2003 à 09:34:51    

polo021 a écrit :


logiquement non, ma classe n'est pas censee etre detruite entre temps. Car je n'utilise qu'un seul  objet de cette classe et pendant toute la duree du programme.
 
 


 
Ouai, mais ça reste relativement moche...


---------------
Le Tyran
Reply

Marsh Posté le 06-06-2003 à 09:39:12    

chrisbk a écrit :

Mais pkoi tu utilises pas ce boudiou de LockBuffer ???
 
http://msdn.microsoft.com/library/ [...] buffer.asp
 
 


ben non ca va pas :/

Code :
  1. ret = ptr_gw->sends((char*)MessageToSend.LockBuffer())


dans sends j'affiche la valeur du parametre et je n'ai que la premiere lettre. [:spamafote]
Exactement comme avec GetBuffer d'ailleurs  
 :pfff:

Reply

Marsh Posté le 06-06-2003 à 09:41:14    

polo021 a écrit :


ben non ca va pas :/

Code :
  1. ret = ptr_gw->sends((char*)MessageToSend.LockBuffer())


dans sends j'affiche la valeur du parametre et je n'ai que la premiere lettre. [:spamafote]
Exactement comme avec GetBuffer d'ailleurs  
 :pfff:  


 

Citation :


Return Value
 
A pointer to a CString object or a NULL-terminated string.


C'est censé marcher un cast de CString en char *?

Reply

Marsh Posté le 06-06-2003 à 09:43:51    

skeye a écrit :


C'est censé marcher un cast de CString en char *?


non ca faut meme pas y penser. Pourquoi?

Reply

Marsh Posté le 06-06-2003 à 09:58:08    

polo021 a écrit :


non ca faut meme pas y penser. Pourquoi?


Ben je trouve le "return value" de la fonction étrange...si tu récupères un pointeur sur une CString, c'est p-e normal que ton cast se vautre, non?
D'un autre coté je dis probablement des conneries, vu que j'ai encore un peu de mal avec les types de visual, mais bon... :??:

Reply

Marsh Posté le 08-06-2003 à 20:40:04    

et un cast (LPSTR)(LPCTSTR)source
ca marche pas?

Reply

Marsh Posté le 08-06-2003 à 21:14:18    

skeye a écrit :


Pas trop...free(null) ne fait rien normalement... [:spamafote]  


 
C'est pareil un delete null?


---------------
Another .Net Blog
Reply

Marsh Posté le 08-06-2003 à 22:44:45    

polo021 a écrit :

je voudrais bien faire une fonction de conversion d'un CString en char*.
Je sais que je pourrais utiliser GetBuffer(...); mais dans mon cas ca ne m'arrange pas.
J'ai donc fait cette fonction

Code :
  1. char* GatewayComm::CStringToChar(CString source)
  2. {
  3. int i=0;
  4. char dest[source.GetLength()+1];
  5. while (i<source.GetLength())
  6. {
  7.  dest[i] = (char)source.GetAt(i);
  8.  ++i;
  9. }
  10. dest[i] = '\0';
  11. return (dest);
  12. }


mais a la compilation, il n'accepter pas la taille du tableau car elle n'est pas fixe.
Donc je pourrais le faire avec un malloc mais ma valeur de retour serait detruite je pense.  
Quelqu'un aurait'il une idee qui me permettrai de faire fonctionner cette fonction?
 
 :jap:  


 
tiens je l'avais raté ce post, dommage...
 
déja, désolé mais ce code marche nickel chez moi, ds une appli MFC a la con (ca affiche bien ce qu'il faut) :

Code :
  1. CString truc = "test a la con, point";
  2. MessageBox(0, truc.GetBuffer(), (LPCTSTR)truc, 0);


 
alors si ca pose problème chez toi, bah ca veut dire que ca vient surement d'un pb chez toi. (phrase copyrightée)
a moins d'un bug dans les CString, mais ca se saurait...
 
si la ligne :

Code :
  1. char dest[source.GetLength()+1];


ne compile pas, c'est pasque t'as pas le droit aux variable length array avec ton compilo, et a moins de compiler avec gcc 3 ca marchera pas.
 
donc passer par un new, mais c'est chiant pasqu'il faut que tu appelles delete qd ta variable ne sert plus.
 
tu peux aussi essayer 'static char dest[MAX];' avec MAX le nb que tu penses tes strings ne dépasseront jms, mais c encore plus crade.

Reply

Marsh Posté le 08-06-2003 à 22:45:55    

polo021 a écrit :


ca fait pas trop degueux si je mets le free dans le destructeur de la classe alors que j'ai alloue la variable dans une fonction?


 
bah si c'est dégueu, et ca l'est encore plus si ta fonction est appelée plein de fois, ca libérera juste la dernière instance créée...

Reply

Marsh Posté le 08-06-2003 à 22:50:15    

tiens, essaye ce joli code :
 

Code :
  1. CString truc = "test a la con, point";
  2. basic_string<TCHAR> str = truc;
  3. MessageBox(0, str.c_str(), "", 0);


 
si ca marche pas y aura plus grand chose a faire, a part new project.


Message édité par Konar le 08-06-2003 à 22:50:39
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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