IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Question de débutant


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 51
    Points : 29
    Points
    29
    Par défaut Question de débutant
    Salut à tous.

    Je suis un débutant total en C++.

    A quoi sert la valeur de retour d'une fonction puisque toutes les autres variables utilisées dans une fonction sont récupérables à la suite du programme ? On renvoie une valeur mais quand et pourquoi sert-elle ? Ne serait-ce pas plus simple d'utiliser des void partout ?

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par kennyflorian Voir le message
    Salut à tous.

    Je suis un débutant total en C++.

    A quoi sert la valeur de retour d'une fonction puisque toutes les autres variables utilisées dans une fonction sont récupérables à la suite du programme ? On renvoie une valeur mais quand et pourquoi sert-elle ? Ne serait-ce pas plus simple d'utiliser des void partout ?
    Penses à la valeur de retour comme à la valeur que retourne une fonction mathématique. Est-elle inutile ?

    C'est faux que toutes les valeurs des variables sont récupérables. Ça dépend. Et en général s'arranger pour faire ça, c'est ouvrir la porte aux erreurs.

  3. #3
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Si t'as une fonction sinus qui dit calculer le sinus d'un nombre par exemple, sinus(PI / 2) doit être égal à 1. 1 est la valeur de retour de la fonction sinus.

    Si tu veux faire une fonction qui qui supprime un fichier, suppr_fichier("machin.chose") doit supprimer le fichier machin.chose. Mais comment peux-tu savoir que le fichier a vraiment été supprimé ? Peut-être au moment de l'appel le fichier a été ouvert par une application et ne pouvait donc par exemple pas être supprimé. void suppr_fichier(...) ne permet donc pas de savoir si la fonction a réussi ou non. On a résolu ce problème avec les valeurs de retour des fonctions. Tu retournes par exemple :

    - 0 en cas de succès
    - 1 si le fichier spécifié n'existe pas (donc aucune action n'a été faite)
    - 2 si le fichier existe mais n'a pas pu être supprimé

    En C++, on peut quand même mettre void partout grâce à son support des "Exceptions". Je pense que t'es assez grand pour choisir .

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    La valeur en retour te permet aussi de faire la composition, ce qui serait moins naturel avec un paramètre contenant ce retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // sans valeur retour : 
    sin(angle, resultat1)
    cos(angle, resultat2)
    tangente = resultat1/resultat2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // avec valeur retour : 
    tangente = sin(angle)/cos(angle);

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Pire encore, elle permet d'initialiser. Comment sinon écrire le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int const reponseALaQuestionDeLUnivers = demanderALOrdinateur();

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Faut il te rappeler que tu peux (et qu'il est d'ailleurs conseillé de le faire) ne déclarer tes différentes variables que lorsque tu en a besoin

    Cela implique qu'il n'est pas du tout exclu que, lorsque tu invoque une fonction, tu doive assigner une valeur calculée par cette fonction à une variable... que tu crée au moment même.

    Dans de telles conditions, il devient (c'est logique ) impossible de passer cette nouvelle variable directement à la fonction

    S'il est effectivement possible de passer des paramètres en s'assurant que les modifications apportée au sein de la fonction appelée seront répercutées dans la fonction appelante, il faut néanmoins rester conscient de la responsabilité de chaque chose:

    Le but premier des paramètres / arguments d'une fonction est... d'apporter des informations dont cette fonction ne dispose pas "d'elle-même", et le but de la valeur de retour est... de permettre à la fonction appelante de récupérer le résultat de la fonction appelée.

    Si tu reste tout à fait libre de la manière dont tu décide d'interpréter ce retour ( résultat du calcul comme pour sin(x), erreur d'exécution, récupération d'une ressource allouée par la fonction ou possédée par une structure de données), il reste malgré tout impossible de s'en passer tout à fait

    Lorsque tu veut effectuer un calcul, par exemple, il est logique et cohérent d'assigner la valeur de retour de la fonction à une variable (val = sin(x))

    Si tu veux tester la réussite d'une fonction afin de décider de ce qu'il faut faire (if( foo()==true)), tu n'a pas le choix non plus
    Si tu veux accéder à une valeur possédée par une structure de donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class MaClass
    {
        public:
            std::string const& name() const
            {
                return mname;
            }
        private:
            std::string mname;
    };
     
    std::cout<<obj.name()<<std::endl;
    tu ne dispose que du retour de fonction

    Et il est enfin bien plus facile de travailler sur un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Type* ptr=doAllocation();
    que sous la forme d'un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Type* ptr;
    doAllocation(&ptr);
    ne serait-ce que parce que la deuxième version implique (dans la fonction doAllocation) la présence d'une indirection supplémentaire (et ce, même si tu peux envisager de passer une référence sur un pointeur)

    Au final, on se rend compte qu'il y a des cas dans lesquels tu peux effectivement te passer de la valeur de retour, mais que, dans une grande majorité des cas, il te faudra utiliser la valeur de retour de fonction dans la fonction qui l'appelle

  7. #7
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    La valeur en retour te permet aussi de faire la composition, ce qui serait moins naturel avec un paramètre contenant ce retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // sans valeur retour : 
    sin(angle, resultat1)
    cos(angle, resultat2)
    tangente = resultat1/resultat2
    Et ne pas oublier les variables temporaires lors des imbrications d'appel, du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    actor.moveLeft(sin(object.getAngle()));

Discussions similaires

  1. Réponses: 13
    Dernier message: 23/06/2005, 10h56
  2. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  3. [MFC] Quelques questions de débutant...
    Par Sephi dans le forum MFC
    Réponses: 4
    Dernier message: 20/02/2004, 17h25
  4. Questions de débutant
    Par J-P-B dans le forum XMLRAD
    Réponses: 12
    Dernier message: 24/07/2003, 15h19
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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