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

  FORUM HardWare.fr
  Programmation
  C++

  Fonction qui retourne un char*

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fonction qui retourne un char*

n°418887
polo021
Posté le 06-06-2003 à 09:21:51  profilanswer
 

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:

mood
Publicité
Posté le 06-06-2003 à 09:21:51  profilanswer
 

n°418889
skeye
Posté le 06-06-2003 à 09:23:09  profilanswer
 

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
n°418891
polo021
Posté le 06-06-2003 à 09:24:11  profilanswer
 

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
n°418893
chrisbk
-
Posté le 06-06-2003 à 09:25:00  profilanswer
 

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.

n°418895
chrisbk
-
Posté le 06-06-2003 à 09:25:59  profilanswer
 

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 * ?

n°418896
LetoII
Le dormeur doit se réveiller
Posté le 06-06-2003 à 09:26:01  profilanswer
 

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
n°418897
polo021
Posté le 06-06-2003 à 09:26:08  profilanswer
 

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?

n°418898
polo021
Posté le 06-06-2003 à 09:26:59  profilanswer
 

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]

n°418899
skeye
Posté le 06-06-2003 à 09:27:03  profilanswer
 

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]

n°418900
chrisbk
-
Posté le 06-06-2003 à 09:27:10  profilanswer
 

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)

mood
Publicité
Posté le 06-06-2003 à 09:27:10  profilanswer
 

n°418902
LetoII
Le dormeur doit se réveiller
Posté le 06-06-2003 à 09:27:12  profilanswer
 

Renvoie une String et te fais pas chier.


---------------
Le Tyran
n°418903
chrisbk
-
Posté le 06-06-2003 à 09:27:39  profilanswer
 

polo021 a écrit :


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


 
(pkoi ?)
et LockBuffer() ?

n°418904
skeye
Posté le 06-06-2003 à 09:27:46  profilanswer
 

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]

n°418907
polo021
Posté le 06-06-2003 à 09:28:42  profilanswer
 

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]

n°418910
skeye
Posté le 06-06-2003 à 09:29:45  profilanswer
 

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?

n°418913
chrisbk
-
Posté le 06-06-2003 à 09:30:32  profilanswer
 

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

n°418915
polo021
Posté le 06-06-2003 à 09:31:08  profilanswer
 

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

n°418916
LetoII
Le dormeur doit se réveiller
Posté le 06-06-2003 à 09:32:26  profilanswer
 

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
n°418919
skeye
Posté le 06-06-2003 à 09:33:09  profilanswer
 

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]

n°418920
polo021
Posté le 06-06-2003 à 09:33:44  profilanswer
 

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
n°418921
chrisbk
-
Posté le 06-06-2003 à 09:34:43  profilanswer
 

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

n°418922
LetoII
Le dormeur doit se réveiller
Posté le 06-06-2003 à 09:34:51  profilanswer
 

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
n°418935
polo021
Posté le 06-06-2003 à 09:39:12  profilanswer
 

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:

n°418940
skeye
Posté le 06-06-2003 à 09:41:14  profilanswer
 

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 *?

n°418944
polo021
Posté le 06-06-2003 à 09:43:51  profilanswer
 

skeye a écrit :


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


non ca faut meme pas y penser. Pourquoi?

n°418966
skeye
Posté le 06-06-2003 à 09:58:08  profilanswer
 

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... :??:

n°421089
Dag elg
Posté le 08-06-2003 à 20:40:04  profilanswer
 

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

n°421096
haazheel
Posté le 08-06-2003 à 21:14:18  profilanswer
 

skeye a écrit :


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


 
C'est pareil un delete null?


---------------
Another .Net Blog
n°421163
Konar
Posté le 08-06-2003 à 22:44:45  profilanswer
 

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.

n°421164
Konar
Posté le 08-06-2003 à 22:45:55  profilanswer
 

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

n°421168
Konar
Posté le 08-06-2003 à 22:50:15  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


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

  Fonction qui retourne un char*

 

Sujets relatifs
Fonction équivalent à fgetcsv() de PHP ?question de newbie sur les pointeur de fonction
problème de variables dans fonction PHP[PHP] fonction strstr . Quelqu'un peut m'éclairer ?
[C/C++] fonction sort() avec STL[JS]Pb sur fonction
[js] problème avec une fonction simple[PHP] Fonction qui retourne les dates de tous les samedis de l'année
scipt php, inserer un lien en fonction de la table 
Plus de sujets relatifs à : Fonction qui retourne un char*


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR