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

Résolu
laetitiavincent Messages postés 61 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 19 janvier 2007 - 26 mai 2006 à 21:52
laetitiavincent Messages postés 61 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 19 janvier 2007 - 27 mai 2006 à 15:26
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

24Karas Messages postés 233 Date d'inscription jeudi 4 juillet 2002 Statut Membre Dernière intervention 5 juillet 2008
26 mai 2006 à 22:54
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
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 mai 2006 à 00:14
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;
}
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 mai 2006 à 22:36
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
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 mai 2006 à 22:50
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
0

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

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 mai 2006 à 22:58
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
0
24Karas Messages postés 233 Date d'inscription jeudi 4 juillet 2002 Statut Membre Dernière intervention 5 juillet 2008
26 mai 2006 à 23:06
c'était simplement pour corriger

"Impossible de renvoyer un pointeur d'un variable local."
;-)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 mai 2006 à 23:11
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
0
24Karas Messages postés 233 Date d'inscription jeudi 4 juillet 2002 Statut Membre Dernière intervention 5 juillet 2008
26 mai 2006 à 23:21
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

++
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
27 mai 2006 à 00:12
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
0
laetitiavincent Messages postés 61 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 19 janvier 2007
27 mai 2006 à 15:26
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
0
Rejoignez-nous