Fonction retournant un char[20]

Résolu
seb2086 Messages postés 96 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 1 février 2010 - 8 mars 2007 à 11:39
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 - 11 mars 2007 à 17:30
Bonjour,

J'ai une variable char a[20] que je voudrais retourner dans une fonction mais je ne sais pas comment faire.
Merci pour votre aide.

25 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
8 mars 2007 à 12:04
void TaFonction(char a[20])
{
    ...
}
3
seb2086 Messages postés 96 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 1 février 2010
8 mars 2007 à 13:49
Le seul moyen c'est de le retourner par réference ?
C'est pas possible de passer par le return ?
0
bonjour__ Messages postés 25 Date d'inscription lundi 20 mars 2006 Statut Membre Dernière intervention 27 septembre 2008
8 mars 2007 à 13:50
retourner un pointeur sur char

par exemple :

char * fonction()
{
     char a[10];

return a;
}
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
8 mars 2007 à 15:22
Non bonjour__ c'est faux, car tu retournes l'adresse du variable locale.
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
8 mars 2007 à 15:58
Moi je ferais plutôt


void TaFonction(char *a)
{
    ...
}

Ya pas de limite stricte de la zone memoire pointé comme ça.

C++ (@++)<!--
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
8 mars 2007 à 20:52
Sakingdom: Mais si on a besoin seulement d'un tableau fixe de 20 octets, ca sert a rien.
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
8 mars 2007 à 22:17
Bonsoir,

peut-être ceci :

#include <stdio.h>
#include <stdlib.h>

char * fonction()
{
    char *pChaine = NULL;
    pChaine = (char*)calloc(12, sizeof(char));
    strcpy(pChaine, "Hello world");
    return pChaine;
}

int main()
{
    char *pRetour = fonction();
    if(pRetour == NULL)
       return EXIT_FAILURE;

    puts(pRetour);
    free(pRetour);

    return EXIT_SUCESS;
}

Matt...
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
8 mars 2007 à 22:20
mon code ne compile pas :

il faut un #include <string.h> en plus et c'est return EXIT_SUCCESS; avec deux C

Matt...
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
8 mars 2007 à 22:35
luhtor >> On sait jamais.

Matt67 >> Personnellement, je ne recommandrais pas d'allouer la mémoire dans la fonction même. On peut oublier de libérer comme ça. Aussi, rien n'est garanti qu'on n'utilise pas la zone mémoire avant d'utiliser la fonction. Deplus, c'est une allocation dynamique donc plus couteuse en temps processeur que de faire une "allocation statique" (un tableau).

C++ (@++)<!--
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
9 mars 2007 à 21:43
Bonsoir,

SAKingdom : [../..] On peut oublier de libérer. [../..]
Matt : Il faut savoir ce qu'on fait.

SAKingdom : [../..] Aussi, rien n'est garanti qu'on n'utilise pas la zone mémoire avant d'utiliser la fonction [../..]
Matt : J'ai pas compris ?

SAKingdom : [../..] Deplus, c'est une allocation dynamique donc plus couteuse en temps processeur que de faire une "allocation  statique" [../..]
Matt : oui mais c'est dynamique !!!

Matt...
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
10 mars 2007 à 23:34
SAKingdom : [../..] Deplus, c'est une allocation dynamique donc plus
couteuse en temps processeur que de faire une "allocation  statique"
[../..]
Matt : oui mais c'est dynamique !!!

Errrm. J'espère que tu n'espère pas me convincre avec ça ? ;)
Pour si peux (20 octets), mieu vaut un tableau.

SAKingdom : [../..] Aussi, rien n'est garanti qu'on n'utilise pas la zone mémoire avant d'utiliser la fonction [../..]
Matt : J'ai pas compris ?

On ne sais pas si il souhaite ou non utiliser cette zone mémoire avant d'utiliser la fonction. Si c'est le cas, la mémoire devra être allouée avant la fonction.

C++ (@++)<!--
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
11 mars 2007 à 08:09
bonjour,



SAKingdom : [../..]Pour si peux (20 octets), mieux vaut un tableau[../..]
Aujourd'hui, il veut 20 octets mais demain ?

Ok pour l'allocation mais c'etait pour l'exemple. Je me doute bien qu'il ne va pas allouer de la memoire pour ecrire "hello world".

Bonne journée,

Matt...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 mars 2007 à 10:41
Je rejoints SAKingdom sur tous les points discutés plus haut:

Une allocation dynamique ne sert à rien quand on connait la taille de la zone à réserver (dans les deux cas, pour changer la taille il faut recompiler, donc l'argument de modification de taille ne tient pas).

Je pense aussi que c'est dangereux d'allouer dans une fonction et de laisser l'appelant libérer la mémoire. Les seules fonctions retournant de la mémoire à libérer sont justement les fonctions d'allocation de mémoire.
Aussi, imaginons qu'on veuille appeler beaucoup de fois la fonction. Avec l'allocation locale, on aura autant d'allocations que d'appels, alors que si c'est l'appelant qui gère ca, il peut choisir d'utiliser la même mémoire pour tous les appels.

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
11 mars 2007 à 12:47
Bonjour,

Ok, allouer de la memoire dynamiquement pour une chaine de caractere dont on connait la taille c'est inutile...
Mais dans une fonction ou tu recuperes le texte d'un fichier texte (par exemple) ou tu recuperes des donnees dans un tableau de structures, tu es bien obligé d'allouer de la memoire dans ta fonction et de la liberer en dehors...

Matt...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 mars 2007 à 13:05
Non, il suffit de demander de la mémoire en paramètre

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
11 mars 2007 à 13:42
peux tu être plus explicite ...

Matt...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 mars 2007 à 13:54
void lireFichier(STRUCTURE* tableau)
{
  ...
}

STRUCTURE s[20];
lireFichier(s);

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
11 mars 2007 à 14:05
ok, mais avant d'appeller ta fonction, si tu ne sais pas combien tu vas recuperer de structure (peut être 20, mais peut être plus)

Matt...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 mars 2007 à 14:16
Si tu veux aller par la, la fonction qui lit dans le fichier ne sait pas non plus au début combien allouer. Si elle le sait, elle peut le dire à l'appelant, comme ceci par exemple:

int lireFichier(STRUCTURE* tableau)
{
  if(!tableau) return tailleSouhaitée;
  ...
}

int taille = lireFichier(0);
STRUCTURE* s = malloc(taille * sizeof STRUCTURE);
lireFichier(s);
...
free(s);

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
11 mars 2007 à 14:49
Si tu veux, mais voila un cas (very light) dans lequel j'utilise ce que je "defends"

/* aucun control d'erreur */
int getData(MYSQL pMysql, struct data *pMydata, int *nbElement)
{
    char *requete = "SELECT * FROM table";
    MYSQL_RES *pRes = NULL;
    MYSQL_ROW row;
    unsigned long nbRecord = 0;
    int i = 0;

    *nbElement = 0;
    mysql_query(pMysql, requete);

    pRes = mysql_store_result(pMysql);
    nbRecord = pRes->row_count;
    *nbElement = nbRecord;

    if(nbRecord == 0)
    {
       mysql_free_result(pRes);
       pRes = NULL;
       return 0;
    }
   
    pMyData = (struct data*)malloc(nbRecord * sizeof(struct data));
   
    while(row = mysql_fetch_row(pRes))
    {
       pMyData[i].id = row[0];
       /* etc */
       i++;
    }

    mysql_free_result(pRes);

    pRes = NULL;

    return 0;
}

int main()
{
    struct data *pMyData = NULL,
    int nbElement = 0;
    MYSQL *pMysql = NULL;

    /* connexion a la bdd */

    if(getData(pMysql, pMyData, &nbElement) != 0)
    {
       /* erreur */
    }

    /* todo */

    free(pMyData);
}

et je ne sais pas faire autrement plus simplement...

Matt...

(tapé directement dans l'editeur, donc sous reserve de fautes de frappe)
0
Rejoignez-nous