1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2013
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2013
    Messages : 96
    Points : 77
    Points
    77

    Par défaut fonction qui retourne qui une valeur

    j'ai juste une petite question:

    En C , une fonction ne doit pas retourner une variable locale à une fonction, alors comment faire pour qu'on puisse retourner la valeur d'une variable sans passer celle ci en parametre de la fonction?
    Je ne veux pas allouer de memoire pour la vraible variable locale, ni passer la valeur a retourner comme parametre à la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    size_t taille_chaine( const char* chaine)
    {
     //retourner la taille de la chaine en parametre.
    }

    quelqu'un a une idée?

  2. #2
    Membre expert
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    février 2008
    Messages
    1 918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : février 2008
    Messages : 1 918
    Points : 3 625
    Points
    3 625
    Billets dans le blog
    3

    Par défaut

    Bonjour.

    Comme ca je suppose (si j'ai bien compris ta problématique) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    size_t taille_chaine( const char* chaine)
    {
      return strlen (chaine);
    }
    Utilisation de Glade avec Gtk+ - N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2013
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2013
    Messages : 96
    Points : 77
    Points
    77

    Par défaut

    on suppose que la fonction strlen n'existe pas, qu'on doit creer de toutes pièces.
    Supossons qu'on crée une fonction strlen à nous même.
    elle doit retourner le nombre de caractères de la chaine passée en paramètre.

  4. #4
    Membre expert
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    février 2008
    Messages
    1 918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : février 2008
    Messages : 1 918
    Points : 3 625
    Points
    3 625
    Billets dans le blog
    3

    Par défaut

    Peux-tu tout de même déclarer une variable locale à la fonction ? Cette variable étant déclarée dans la pile il n'y a donc pas d'allocation dynamique (dans le tas). Si c'est possible alors on peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    size_t taille_chaine( const char* chaine)
    {
      size_t size=0;
     
      while (chaine [size]!='\0')
        size++;
     
      return size;
    }
    Remarque :
    Ce code sous-entend que chaine est valide. C'est à dire qu'elle contient bien un terminateur '\0'. Dans le cas contraire ce code génère une boucle infinie !
    Utilisation de Glade avec Gtk+ - N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2013
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2013
    Messages : 96
    Points : 77
    Points
    77

    Par défaut

    Selon mes recherches, retourner une variable locale à une fonction a comportement indéfini, comme vous le faites avec size_t size=0;.
    En effet selon mes recherches, après l’exécution e la fonction, toutes les variables locales en son sein sont détruites, voici pourquoi je ne voulais pas declarer
    size_t size=0; et retourner return size;;

  6. #6
    Membre expert
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    février 2008
    Messages
    1 918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : février 2008
    Messages : 1 918
    Points : 3 625
    Points
    3 625
    Billets dans le blog
    3

    Par défaut

    En effet toutes les variables déclarées entre deux {} sont détruites dés que l'on sort des accolades. Ce qui sera le cas lors de l'exécution de l'instruction return;.

    Cependant, ce sera une copie de size qui sera retournée, la valeur renvoyée sera donc la bonne. Il n'y aura donc rien d'indéfini.
    Utilisation de Glade avec Gtk+ - N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2013
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2013
    Messages : 96
    Points : 77
    Points
    77

    Par défaut

    Citation Envoyé par gerald3d
    Cependant, ce sera une copie de size qui sera retournée, la valeur renvoyée sera donc la bonne. Il n'y aura donc rien d'indéfini.
    Mais prenons le cas général, comment déclarer la variable que je veux retourner de sorte qu'il sorte n'y a pas e comportement indéfini.
    Voici les cas que je connais:
    -passer la variable à retourner la valeur en paramètre de la fonction, soit son adresse;
    -allouer de la mémoire pour la variable locale à la fonction avec malloc ou calloc.
    comment faire autrement ??
    merci

  8. #8
    Membre expert
    Avatar de fred1599
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    2 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 2 140
    Points : 3 429
    Points
    3 429

    Par défaut

    Eh bien comme nous n'arrivons pas à cibler ce que tu souhaites, je te laisse lire un tutoriel sur la durée de vie des variables. Tu feras ensuite tes choix, bonne continuation...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 825
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 825
    Points : 15 680
    Points
    15 680

    Par défaut

    Le mot-clé return défini la valeur de l'expression constituée par l'appel de la fonction. C'est son rôle. Il n'y a pas de variable impliquée dans cette histoire.

    La valeur de l'appel de fonction est la valeur calculée de l'expression qui suit le mot-clé return, convertie dans le type de retour de la fonction.
    Si cette expression est le nom d'une variable, la valeur de cette variable est utilisée.

    La variable n'est détruite qu'à la sortie de la fonction, donc après l'exécution du return en lui-même.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2013
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2013
    Messages : 96
    Points : 77
    Points
    77

    Par défaut

    Merci pour l’éclairage

  11. #11
    Membre émérite
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 493
    Points : 2 493
    Points
    2 493

    Par défaut

    Citation Envoyé par free_01_binairy Voir le message
    En C , une fonction ne doit pas retourner une variable locale à une fonction
    En C, on peut tout fait retourner une expression quelconque qui peut aussi être la valeur d'une variable.
    Ce qui ne doit pas être fait c'est :
    * retourner l'adresse d'une variable locale (car on obtient un pointeur sur une variable qui n'existe plus.)
    * retourner une variable qui est du type tableau, car dans ce cas il y a conversion implicite en pointeur sur le tableau et on est ramené au cas précédent.
    Sinon tout ce qui n'est pas un tableau peut être retourné par une fonction, y compris une struct ou une union.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct Toto {
        int a;
        int b;
    } Toto;
    Toto fonction() {
       Toto x;
       x.a = 1;
       x.b = 2;
       return x;
    }
    int main() {
       Toto y = fonction(); // OK, on a reçu dans y une copie du Toto x
    }

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2013
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2013
    Messages : 96
    Points : 77
    Points
    77

    Par défaut

    C'est beaucoup plus clair maintenant
    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel de fonction par SYS qui retourne une erreur
    Par tibal dans le forum PL/SQL
    Réponses: 3
    Dernier message: 15/12/2008, 23h32
  2. Réponses: 5
    Dernier message: 27/05/2008, 08h02
  3. Réponses: 3
    Dernier message: 19/05/2008, 13h51
  4. Réponses: 2
    Dernier message: 23/12/2007, 10h29
  5. fonction qui vérifie si une valeur est numérique?
    Par ryadh.naouar dans le forum C
    Réponses: 16
    Dernier message: 05/07/2007, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo