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 :

sortir du programme a partir d'une fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 96
    Par défaut sortir du programme a partir d'une fonction
    Bonjour

    Je fais un petit programme qui prend en parametre un fichier texte contenant les données a traiter.

    Pour la lecture des donnes, j'ouvre le fichier (open) lis les données et ferme le fichier (close), ceci par trois fonctions distinctes qui verifient qu'il n'y a pas d'erreur (ouverture, fermeture, etc) auquel cas je fais un EXIT_FAILURE.

    Mon probleme est le suivant, existe t'il un moyen pour que, par exemple dans le cas du erreur a l'ouverture, on quitte le programme et non simplement la fonction, a partir de la fonction ayant "trouve" cette erreur ?

    merci

  2. #2
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Citation Envoyé par Torx26 Voir le message
    je fais un EXIT_FAILURE
    Vous faites un "return EXIT_FAILURE" ?

    Essayez avec un "exit(EXIT_FAILURE)"

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 96
    Par défaut
    Bonjour

    Merci pour votre attention.
    En cas de succes je retourne EXIT_SUCCES et en cas d'echec EXIT_FAILURE. Le type de retour de ma fonction est int hors exit(EXIT_FAILURE) est vu de type void.
    msg du compilateur: void value not ignored as it ought to be.

  4. #4
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Il nous faudrait le code.
    Tu es sûr que tu n'as pas un prototype de la fonction qui est différent ?
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  5. #5
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Citation Envoyé par Torx26 Voir le message
    Le type de retour de ma fonction est int hors exit(EXIT_FAILURE) est vu de type void.
    msg du compilateur: void value not ignored as it ought to be.
    N'auriez vous pas écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return exit(EXIT_FAILURE)
    par hasard ?

    Il faut écrire tout court. Pas de return.

    Et concernant l'avis de souviron34, je ne suis pas aussi catégorique... A mon avis (ce n'est donc pas à prendre comme une généralité), ne pas utiliser exit est une peur qui pourrait venir du monde windows. Par exemple il me semble que quand on fait un exit sous windows, toutes les ressources ne sont pas bien "nettoyées". Encore récemment, j'ai vu une socket qui ne se fermait pas bien ce qui avait un impact sur le code qui tournait à l'autre bout...

    Sous Linux, les fichiers sont fermés, les ressources mémoire libérées... bref, je ne vois pas ce que l'on aurait besoin de faire de plus, manuellement...

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par valefor Voir le message
    Et concernant l'avis de souviron34, je ne suis pas aussi catégorique... A mon avis (ce n'est donc pas à prendre comme une généralité), ne pas utiliser exit est une peur qui pourrait venir du monde windows. Par exemple il me semble que quand on fait un exit sous windows, toutes les ressources ne sont pas bien "nettoyées". Encore récemment, j'ai vu une socket qui ne se fermait pas bien ce qui avait un impact sur le code qui tournait à l'autre bout...

    Sous Linux, les fichiers sont fermés, les ressources mémoire libérées... bref, je ne vois pas ce que l'on aurait besoin de faire de plus, manuellement...
    Je n'ai jamais (quasi) programmé sous Windows

    Ce n'est pas une peur du tout, c'est une bonne pratique, au même titre que proscrre, sauf cas très très particulier, le goto, car cela amène à du code "spagetti", où le (futur) lecteur ne peut pas suivre le flux du code sans s'arracher les cheveux...

    Lorsqu'un logiciel fait plusieurs milliers, voire dizaines ou centaines de milliers de lignes, ne pas avoir de "point central" de sortie est une abomination...

    Cela n'a rien à voir avec Windows ou pas.. C'est du développement logiciel..


    Citation Envoyé par valefor Voir le message
    je ne vois pas ce que l'on aurait besoin de faire de plus, manuellement...
    ça peut être fermer des ressources non systèmes (une base de données par exemple), enlever des locks, libérer ou détruire des fichiers temporaires, envoyer un message, stocker un drapeau dans une BD, fermer des sockets...

    Etant donné que tout développeur dont c'est le métier va finir un jour ou l'autre par travailler sur des sources complexes, et de plus de 100 lignes, acquérir les bons réflexes le plus tôt possible est le plus sain..

    Même une erreur d'allocation mémoire n'est pas fatale.. Un logiciel peut tès bien continuer, et retenter un peu plus tard.. Avec un exit() c'est foutu...

    D'autant plus que quand même beaucoup de logiciels doivent être 24/24, ne jamais s'arrêter...

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Je suis de ceux qui sont d'accord avec souviron34 sur le fait de remonter l'erreur . C'est à la fonction appelante de décider quoi faire en cas d'erreur, et non à la fonction où c'est produite l'erreur. Si la fonction appelante n'est pas main(), on remonte plus haut jusqu'à ce que quelqu'un traîte l'erreur. En dernier ressort, main() peut éventuellement quitter l'application. En général, je n'autorise pas d'autre fonction que main() à terminer l'exécution du programme.

    En renvoyant un code d'erreur à la fonction appelante plutôt qu'en quittant brusquement le programme, pour permettez à la fonction appelante de faire quelque chose d'intelligent avec cet erreur: réessayer plus tard, libérer des ressources après sauvegardes dans un fichier et réessayer, ou en désespoir de cause sauver ce qui peut l'être et remonter l'erreur jusqu'à main().

    On voit beaucoup de code pour débutant qui, p.ex., quitte le programme en cas d'échec de la fonction malloc(). Il y a pourtant souvent des alternatives qui pourront être mises en oeuvre par la fonction appelante.

    Avec mes meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Torx26 Voir le message
    existe t'il un moyen pour que, par exemple dans le cas du erreur a l'ouverture, on quitte le programme et non simplement la fonction, a partir de la fonction ayant "trouve" cette erreur ?
    Bonjour

    outre le fait que ce n'est pas une bonne pratique - la règle générale est de remonter l'erreur niveau par niveau jusqu'au premier - l'utilisation d'exit() un peu partout dans des fonctions est très fortement déconseillé.

    Une solution peut consister à utiliser la fonctionalité atexit pour enregistrer des fonctions à appeler lors de la sortie, et éventuellement dans ce cas faire à l'intérieur un exit(), ce qui concentre en un seul point le code..

    Enfin, ton erreur vient, comme on l'a signalé, d'une erreur dans la déclaration de main / ou d'oubli d'inclusion de stdlib.h

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main ( int argc, char **argv )
    [
    }

    ou

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main ( void )
    [
    }

Discussions similaires

  1. Comment arreter un programme a partir d'une fonction?
    Par xslert dans le forum Débuter
    Réponses: 15
    Dernier message: 26/05/2009, 20h14
  2. Réponses: 2
    Dernier message: 13/12/2006, 13h48
  3. [VB.NET]Sortir un tableau a partir d'une fonction
    Par mustang-f27 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 19/11/2006, 11h21
  4. Réponses: 5
    Dernier message: 15/07/2005, 11h25
  5. Réponses: 4
    Dernier message: 08/06/2004, 09h01

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