Fonction qui retourne un char

Signaler
Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
-
Messages postés
47
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
9 juin 2004
-
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

7 réponses

Messages postés
47
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
9 juin 2004

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
Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
1
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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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...
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

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
Messages postés
47
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
9 juin 2004

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...)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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...
Messages postés
47
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
9 juin 2004

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