Fonction qui retourne un char

glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 - 21 août 2003 à 22:10
cs_anthraxx Messages postés 47 Date d'inscription mardi 19 mars 2002 Statut Membre Derniè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

[b]
...
char *Date;
Date = Mot(DateHeure, 1);
SetDlgItemTextA (hWnd,IDC_DATE, Date);
...

char *Mot(char chaine[200], int NMot)
{
char MonText[50];
...
return MonText;
}
[\b]

Glipper
A voir également:

7 réponses

cs_anthraxx Messages postés 47 Date d'inscription mardi 19 mars 2002 Statut Membre Derniè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);

j'espere m'etre expliq;
--anthraxx
0
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
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
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
21 août 2003 à 23:37
NON l'efficacite et la simplicite vont rarement ensemble, pour cela c'est vb ou java mais les performances ne seront plus au rdv.
BruNews, ciao...
0
cs_Kaid Messages postés 949 Date d'inscription mardi 2 octobre 2001 Statut Membre Dernière intervention 8 juillet 2006 1
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_anthraxx Messages postés 47 Date d'inscription mardi 19 mars 2002 Statut Membre Derniè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...)
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
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...
0
cs_anthraxx Messages postés 47 Date d'inscription mardi 19 mars 2002 Statut Membre Derniè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...)
0
Rejoignez-nous