glipper
Messages postés246Date d'inscriptiondimanche 2 juin 2002StatutMembreDernière intervention11 septembre 2016
-
21 août 2003 à 22:10
cs_anthraxx
Messages postés47Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention 9 juin 2004
-
22 août 2003 à 22:09
Bonjour,
Voila, j'ai un probleme avec une fonction qui doit retourner une chaine de caractere ! J'ai compris qu'elle ne pouvait pas renvoyer la chaine, mais qu'il fallait lui faire renvoyer un pointeur... alors c'est ce que j'ai fait :) mais ca marche pas :(
Il me renvoi n'importe quoi : "ÖÕw"
Quelqu'un saurait ce qui ne va pas ?
Et si je pouvais aussi avoir une explication ce serait bien :)
Merci
cs_anthraxx
Messages postés47Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention 9 juin 2004 21 août 2003 à 22:23
C simple: quand tu declare un tableau de caracteres dans une fonction, il ne subsite que dans les limites de la fonction.
Explication:
char *Mot(char chaine[200], int NMot)
{
char MonText[50]; // ceci declare 50 octets plus un pointeur vers ces 50 octets
...
return MonText; // tu renvoies le pointeur
} // mais ici, les 50 octets sont effacés! le pointeur ne pointe plus vers kwak ce soit
tu devrais plutot faire une fonction avec la chaine a retourner en argument:
c'est a dire:
void Mot(const char chaine[200],int NMot,char *resultat);
et l'appeler comme suit:
char date[50];
Mot(DateHeure, 1,date);
SetDlgItemTextA (hWnd,IDC_DATE, date);
glipper
Messages postés246Date d'inscriptiondimanche 2 juin 2002StatutMembreDernière intervention11 septembre 20161 21 août 2003 à 22:35
Ok, ca marche ! Merci bcp
Mais je suis quand meme un peu décu qu'il n'y ai pas eu une solution plus simple... Il resterait quelques améliorations a faire au C/C++ loool
GLipper
cs_Kaid
Messages postés949Date d'inscriptionmardi 2 octobre 2001StatutMembreDernière intervention 8 juillet 20061 22 août 2003 à 00:04
Passer un tableau de caractères en paramètre pour qu'une fonction y stocke un résultat est la meilleure méthode qui soit. Dans les autres cas, la fonction aurait été obligée d'allouer de la mémoire dynamiquement ce qui peut être une source de fuite mémoire.
Par contre si tu travailles en C++ avec des objets, ca aurait été plus simple, le C++ n'est donc pas à amélorier. Ni le c d'ailleurs :).
Kaid
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_anthraxx
Messages postés47Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention 9 juin 2004 22 août 2003 à 19:28
Oui, mais il existe des solutions plus simples et rapides meme en c++: la classe CString de MFC par exemple (pour ceux qui cont VC++).
Mais pour ceux qui comme moi abhorrent la MFC, et pour ceux qui ont un autre compilateur, il reste plus qu'a coder une telle classe soi-meme (c'est sque j'ai fait: instructif...)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 22 août 2003 à 19:39
Une classe CString qu'elle soit de MFC ou de nimporte qui, c'est l'utilite que je ne vois pas mais ses nuisances je les vois a coup sur. Allocations et desalloc memoire sans arret tout cela pour pouvoir ecrire str += autreStr, comme si strcpy et strcat n'allaient pas aussi bien.
BruNews, ciao...
cs_anthraxx
Messages postés47Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention 9 juin 2004 22 août 2003 à 22:09
Absolument d'accord que strcpy et strcat sa marche ok (et j'utilise QUE ça)
Mais pour un debutant, il y a quand meme moins de risques de se tromper, de laisser des failles a la buffer overflow, et de perdre du temps inutile. Il y a 3 ans, j'etais ravi qu'il existat la classe CString.
Et cela, sutout quand la rapidité n'est pas l'objectif principal du programme, donc les alloc/desalloc, c'est pas grave. C'est pas elles qui vont le ralentir considerablement, mais plutot les gros loops ou access a internet/au disque dur...
et il arrive d'avoir a faire des operations plus complexes que "str += autreStr".
cela dit, je suis d'accord qu'un developper professionel(serieux) devrait s'en tenir aux fonctions les plus efficaces
(d'ailleurs le resultat: des buffer overflow dans presque tous les programmes qui sortent...)