Prog c : chaine en valeur de retour d'une fonction

[Résolu]
Signaler
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007
-
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007
-
Bonjour
je souhaiterais faire une fonction dans laquelle j'ai une chaine de caractères que je voudrais renvoyée dans le menu principal. Comment puis-je faire? Quelqu'un pourrait me donner un exemple

Merci






 Laetitia

10 réponses

Messages postés
233
Date d'inscription
jeudi 4 juillet 2002
Statut
Membre
Dernière intervention
5 juillet 2008

pas tout à fait vrai, l'exemple suivant devrait marcher (pas testé)

char *Function()
{
    char *szNewString

   szNewString = new char[256];
   strcpy(szNewString,"toto");

    return szNewString;
}

int main (void)
{
   char *sPtr;
   sPtr = Function();

   fprintf (stderr,"%s\n",sPtr);
   delete []sPtr;

   return 0;
}

++
24K
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Pour exprimer les problèmes qu'on peut avoir en retournant un tableau local:

#include

using namespace std;

char* f()
{
char local[] = "toto";
return local;
}

char* g()
{
char local[] = "titi";
return local;
}

int main()
{
char c[12];
char* p = f();
g();
strcpy(c, p);
cout << c << endl;
}
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Impossible de renvoyer un pointeur d'un variable local. Il faut que la variable soit déclaré avant la fonction et utilisé dans ses paramètres.

void exemple (int *Valeur)
{
    Valeur[0] = 10;
    Valeur[1] = 25;
    ...
}

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Et il faut évidament que la mémoire qu'elle utilise soit déclaré aussi avant dépendant de ce que tu veut faire:
Par exemple encore:

void Exemple (char *valeur, int taille)
{
    int pos = 0;

    while(taille < pos)
    {
       valeur[pos] = 'a';
       pos++;
    }
}

char Test[256];

Exemple (Test, sizeof(Test));

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Aussi mais je trouve pas ça très appréciable dans un code d'avoir des delete partout sans savoir exactement où se trouve le new.

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
233
Date d'inscription
jeudi 4 juillet 2002
Statut
Membre
Dernière intervention
5 juillet 2008

c'était simplement pour corriger

"Impossible de renvoyer un pointeur d'un variable local."
;-)
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Je comprend mais c'est que normalement, ce genre de fonction d'habitude, traite les chaines de caractère, il ne les créé pas. Tu vois ce que je veux dire?

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
233
Date d'inscription
jeudi 4 juillet 2002
Statut
Membre
Dernière intervention
5 juillet 2008

bien sûr, mais imaginons que plus tard elle veuille faire des structures, ... c'est pas plus mal d'avoir une fonction d'alloc comme celle ci et ensuite une fonction de free.
m'enfin c'est pas grave hein, c'est juste pour montrer toutes les possibilités, ensuite elle fera son choix

++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
24Karas ta fonction renvoie une valeur, mais la mémoire allouée n'est pas locale, donc c'est pas un bon contre exemple
Il est aussi possible de renvoyer un tableau local, le problème c'est qu'on doit l'utiliser directement ensuite, sinon il va être écrasé
exemple:
char* f()
{
char local[] = "toto";
return local;
}

char c[12];
strcpy(c, f());

Bien sur, ça n'a aucun intérêt, c'est pour ca que j'en parle

Pour les structures c'est pareil: en général on passe un pointeur en paramètre
Je pense qu'une fonction qui alloue de la mémoire sans la désallouer, c'est nul

La bonne solution est donc: passer un buffer en paramètre et le remplir dans la fonction
Messages postés
61
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
19 janvier 2007

Merci beaucoup pour vos réponses et votre débat fort intéressant. C'est exactement ce que je cherchais.
Bonne journée à tous

 Laetitia