Fonction retournant un char[20] [Résolu]

Signaler
Messages postés
96
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
1 février 2010
-
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010
-
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

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
void TaFonction(char a[20])
{
    ...
}
Messages postés
96
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
1 février 2010

Le seul moyen c'est de le retourner par réference ?
C'est pas possible de passer par le return ?
Messages postés
25
Date d'inscription
lundi 20 mars 2006
Statut
Membre
Dernière intervention
27 septembre 2008

retourner un pointeur sur char

par exemple :

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

return a;
}
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Non bonjour__ c'est faux, car tu retournes l'adresse du variable locale.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Moi je ferais plutôt


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

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

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

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...
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

mon code ne compile pas :

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

Matt...
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

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...
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
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++ (@++)<!--
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

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...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

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...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Non, il suffit de demander de la mémoire en paramètre

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

peux tu être plus explicite ...

Matt...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
void lireFichier(STRUCTURE* tableau)
{
  ...
}

STRUCTURE s[20];
lireFichier(s);

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

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...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

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)