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 :

code retour d'une fonction return 0 ?


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Août 2014
    Messages : 13
    Par défaut code retour d'une fonction return 0 ?
    Bonjour à tous,

    je voudrais comprendre quelque chose:

    dans l'os ( linux ) , un code de retour d'un programme ( code retour 0 ) veut dire que le programme s'est bien exécuté.
    En langage C :

    dans le main, un return 0 veut dire que le programme s'est bien exécuté


    Là où je ne comprends pas :
    dans le booléen :
    0 => faux
    1 => vrai ( disons toutes valeurs différents de 0 )

    en fait souvent : if ( je_pense) qui est équivalent à if ( je_pense != 0 )

    et dans une fonction comment dire au main que ma fonction c'est mal déroulé ? en faisant un return 0 aussi ?


    voilà je fais forcement une confusion quelque part.

    Merci de votre aide pour éclairer ma lanterne .


    Cordialement

  2. #2
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Par défaut
    Bonjour,
    Pour les codes retour de fonction ça dépends surtout de la secte dans laquelle tu es enrôlé XD.

    En général le 0 est effectivement utilisé pour signaler que l’exécution de la fonction a eu lieu dans le cas nominal. Selon l'ensemble image de la fonction les programmeurs utilisent les nombres positifs ou négatifs pour préciser le type d'erreur.
    Pour les pointeurs c'est le contraire XD. Tu retournes le pointeur quand tout se passe bien et NULL (donc 0) quand il y a une erreur. Tout ça c'est quand tu veux pas te prendre la tête (quoi que..)

    Si tu veux être propre tu te doit de séparer le résultat de ta fonction de l'erreur qui est généré en utilisant deux variables ou la valeur de retour de ta fonction et une variable.
    Un environnement de gestion d'erreur est fournit par la bibliothèque ernno. Elle utilise notamment une variable globale pour stocker tes codes d'erreur.

    Personnellement je retourne très souvent un booléen avec true (1) pour tout c'est bien passé et false (0) pour j'ai tout cassé. Je trouve que cette méthode permet de rendre le code plus clair, concis et donne des facilités dans la programmation.
    Par exemple pour les boucle tant que while (maFonction()) me semble plus clair qu'un while (maFonction() != 0) où le 0 a bien souvent aucun rapport avec ce qui se passe dans la fonction. Si on doit utiliser une suite de fonction dépendante pouvant générer des erreurs, on peut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return fonction1() && fonction2() && fonction3();
    Le code arrête son exécution à la première erreur et sort sans faire planter la suite.
    Le comportement est aussi le même que tu utilises un booléen ou un pointeur NULL = false = problème ; ptr = true = ok

    Je pense que tu auras autant de techniques que de réponse. Nourris toi-en, utilises les astuces et point de vue des autres programmeurs et détermine la solution qui te parait la plus adapté.

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Août 2014
    Messages : 13
    Par défaut
    Merci beaucoup,

    j'y vois un peu plus clair.

    Cordialement

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 442
    Par défaut
    Bonjour,

    Ton approche est tout-à-fait correcte. L'utilisation d'un booléen par défaut est le paradigme le plus naturel d'un point de vue sémantique quand on utilise les noms de fonctions et bon nombre d'entre elles sont effectivement écrites pour suivre cette approche.

    Toutefois, le système de processus d'UNIX, et par extension celui du DOS sur PC ainsi que pas mal d'autres fonctions, considèrent que le code de retour d'un processus, donc lors d'un exit() ou de la sortie de la fonction main avec return est une indication renvoyée par le programme qui, en temps normal, doit se contenter de d'exécuter silencieusement. Le DOS récupère même cette valeur dans une variable appelée %ERRORLEVEL% (si je me souviens bien, les les fonctions du batch DOS avait une vision particulière de ce niveau d'erreur, dans le sens où un niveau donné impliquait forcément tous les niveaux inférieurs). Certains programmes utilisent même ce code bit à bit (seuls 8 sont utilisables) pour indiquer différentes erreurs éventuelles simultanées et indépendantes entre elles.

    De ce second point de vue, on comprend qu'un code nul s'interprète comme « erreurs: néant. » et que tout code non nul représente un code de diagnostic pour identifier l'erreur en question. Quand on lit la man page de wait(), on s'aperçoit que le code reçu est un entier dont les huit premiers bits correspondent au code de retour renvoyé par le programme, et les suivants sont des flags ajoutés par le système pour obtenir encore plus d'infos sur la fin du processus concerné, par exemple pour savoir s'il s'est terminé normalement où à la suite d'une segfault.

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Août 2014
    Messages : 13
    Par défaut
    wow.
    effectivement, rien que :

    le code reçu est un entier dont les huit premiers bits correspondent au code de retour renvoyé par le programme, et les suivants sont des flags ajoutés par le système pour obtenir encore plus d'infos sur la fin du processus concerné, par exemple pour savoir s'il s'est terminé normalement où à la suite d'une segfault.
    a répondu encore plus à mes attentes !

    Merci beaucoup !

    Cordialement

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 : 5 202
    Par défaut
    Il y avait un autre argument, qui est de considérer qu'il n'y a qu'un seul code de succès, alors qu'il y a plusieurs sortes d'erreur.
    Dans ce contexte, mieux vaut utiliser 0 pour "tout va bien" et tous les autres entiers pour les différentes sortes d'erreurs.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    (si je me souviens bien, les les fonctions du batch DOS avait une vision particulière de ce niveau d'erreur, dans le sens où un niveau donné impliquait forcément tous les niveaux inférieurs).
    Pour être précis, c'est la syntaxe du IF qui compte: IF ERRORLEVEL 3 correspond à IF %ERRORLEVEL% >= 3
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/09/2008, 15h48
  2. [POO] Retour de données par une fonction (return)
    Par webrider dans le forum Langage
    Réponses: 6
    Dernier message: 26/08/2006, 21h49
  3. recuperer en php le retour d'une fonction plsql
    Par gismoblue dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/03/2006, 16h39
  4. PL/SQL retour d'une fonction
    Par aaronw dans le forum PL/SQL
    Réponses: 2
    Dernier message: 13/12/2005, 13h25
  5. [Oracle 9.1] Types de retour d'une fonction PL/SQL
    Par ftrifiro dans le forum PL/SQL
    Réponses: 8
    Dernier message: 12/10/2005, 16h54

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