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 :

if logique exit


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 48
    Points : 32
    Points
    32
    Par défaut if logique exit
    Bonjour,

    si j'ajoute le morceau de code ci-dessous dans mon code tout marche bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     if (!fonction(A,B))
       {
          exit( EXIT_FAILURE );
        }
    j'ai ajoute un std::cout pour voir si le programme rentre bien a l'interieur du block de if, apparement non (le message de cout ne s'acffiche). Donc je me suis dit que ce morceau de code ne sert a rien et je l'ai enleve, sauf que quand je l'enleve rien ne marche, comme etant debutant en C++, je trouve ceci bizare !!
    J'aimerais bien me debarasser de ce morceau de code, etant donnee que ce morceau de code genere aussi un message (inutile) qui vient d'une librairie .... Donc j'aimerais bien enleve ce morceau de code mais en meme temps faire marche le code sans modifier le contenu de la librairie. Merci de m'eclairer ...?

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

    Informations professionnelles :
    Activité : aucun

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

    A quel endroit as tu mis ton affichage, dans cette logique

    Car, si tu as écrit un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (!fonction(A,B))
    {
        exit( EXIT_FAILURE );
        std::cout<<"error exiting"<<std::endl;
    }
    il est plus que compréhensible que l'affichage n'ait jamais lieu: l'instruction exit faisant en sorte que l'on ne passera jamais sur la ligne suivante de code

    En utilisant les bonnes options lors de la compilation (par exemple l'option -Wunreachable-code sous gcc), le compilateur t'aurais sans doute prévenu que le code correspondant à cout n'est jamais exécuté
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Salut
    j'ai fait le cout dans le code comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     std::cout<<"avant EXIT"<<std::endl;
     
    if (!fonction(A,B))
    {
       std::cout<<"error exiting"<<std::endl;
        exit( EXIT_FAILURE );
     }
     
     std::cout<<"apres EXIT"<<std::endl;

    les messages "avant ..." et "apres ..." s'affichent, par contre le message a l'interieur du block if non. Devrais je conclure que rien que le fait de tester la condition fait marcher le programme !! Trouvez vous ceci normal

    Merci

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Si avant et après s'affichent, c'est sans doute parce que fonction(A,B) ne renevoit pas false

    deux possibilités sont à envisager:
    1. Tu t'es simplement planté quand tu as déterminé quand il fallait quitter l'application (tu as estimé que c'était dans le cas où fonction renvoyait false, alors que c'est quand elle renvoie true
    2. Tu t'es planté dans l'implémentation de fonction, qui renvoie true alors qu'elle devrait renvoyer false et/ ou inversement
    Quoi qu'il en soit, tu es simplement face à un problème de logique, mais, il nous sera difficile d'en dire d'avantage si l'on n'en sait pas un peu plus
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Si avant et après s'affichent, c'est sans doute parce que fonction(A,B) ne renevoit pas false

    deux possibilités sont à envisager:
    1. Tu t'es simplement planté quand tu as déterminé quand il fallait quitter l'application (tu as estimé que c'était dans le cas où fonction renvoyait false, alors que c'est quand elle renvoie true
    2. Tu t'es planté dans l'implémentation de fonction, qui renvoie true alors qu'elle devrait renvoyer false et/ ou inversement
    Quoi qu'il en soit, tu es simplement face à un problème de logique, mais, il nous sera difficile d'en dire d'avantage si l'on n'en sait pas un peu plus
    Donc meme si le programme n'exit pas, la condition
    change l'etat du programme et affiche quelque chose

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Tout dépend de ce que fait fonction...

    Mais, quoi qu'elle fasse, tu semble t'attendre à devoir quitter le programme si la fonction renvoie false

    Si on n'exécute pas ce qui se trouve dans if(! fonction), c'est de toute évidence que fonction ne renvoie pas false, car, autrement, nous entrerions bel et bien dans le bloc d'instructions, et le le programme se fermerait correctement

    En effet, if(! fonction) est exactement similaire à if( fonction == false) ou à if (fonction != true): ce sont trois écritures qui auront strictement le même résultat

    Maintenant, la première question à se poser est
    S'attend-on effectivement à devoir quitter le programme si fonction ne renvoie pas true
    Pour pouvoir répondre à cette question, il faudrait au moins déjà connaitre le nom réel de fonction, qui, s'il a été correctement choisi, devrait déjà nous donner une idée de ce qu'elle est sensée faire.

    Si le nom de la fonction est proche de isSomethingBadHappened, on peut décemment estimer que c'est dans le cas où elle renvoie vrai qu'il faut quitter le programme

    Par contre, si le nom de la fonction est proche de everithingIsCorrect, il semble effectivement "logique" de quitter le programme si la réponse est fausse

    Une fois que l'on a la certitude (pour autant que l'on puisse l'avoir) du résultat qui devrait nous faire quitter le programme, il faut aller voir "à l'intérieur" de cette fonction si elle renvoie effectivement un résultat cohérent avec le résultat attendu.

    Mais comme ma boule de crystal est malheureusement en panne pour l'instant, je ne peux absolument pas répondre à cette dernière question dans l'état actuel des choses

    Si tu avais la gentillesse de nous donner le code de la fonction, nous pourrions regarder ensemble si elle fait effectivement ce qu'elle est sensée faire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Voici un peu plus de code,



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
     
    #include <metaCommand.h>
    .....
     
    void function2 (int argc, char **argv, struct arguments & args)
    {
    MetaCommand command;
     command.SetOption("Name","k",true,"...");
     command.AddOptionField("Name","boolval",MetaCommand::BOOL,true,"1");
     
     std::cout << "before EXIT " << std::endl;  
    if (!command.Parse(argc,argv)) // Parse est fonction de metaCommand
       {
       std::cout << "Inside EXIT " << std::endl; 
       exit( EXIT_FAILURE );
       }
     std::cout << "after EXIT " << std::endl; 
     args.name = command.GetValueAsBool("Name","boolval");
    }
     
    int main( int argc, char *argv[] )
    {
     
      struct arguments args;
      function2 (argc, argv, args);
     
    .....
     return EXIT_SUCCESS;
    }
    le lien vers les librairies metaCommand est
    https://www.kitware.com/svn/KWPublic...tall-1-3/Code/

    voir les fichiers metaCommand.h et metaCommand.cxx


    Le probleme: si je garde le exit tout se passe bien mais un message d'information qui vient de la librairie metaCommand s'affiche (et j'aimerais bien supprimer ce message), si je l'eleve le programme ne marche, n'effectue pas les instructures qui vient apres, mais affiche les messages cout (avant et apres) !

    Le code marche aussi avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (command.Parse(argc,argv)) // Parse est fonction de metaCommand
      {
       std::cout << "Inside EXIT " << std::endl; 
      // exit( EXIT_FAILURE );
       }
    Mais cette fois-ci, il affiche le message "Inside EXIT"

    N'hesitez pas si vous avez besoin de plus d'information.
    Merci

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Sauf que là, le code que tu donnes ne correspond pas au code que tu présentais en début de discussion...

    Ici, on a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (command.Parse(argc,argv)) // Parse est fonction de metaCommand
       {
       std::cout << "Inside EXIT " << std::endl; 
       exit( EXIT_FAILURE );
       }
     std::cout << "after EXIT " << std::endl; 
     args.name = command.GetValueAsBool("Name","boolval");
    }
    qui revient exactement à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (command.Parse(argc,argv) == true) // Parse est fonction de metaCommand
       {
       std::cout << "Inside EXIT " << std::endl; 
       exit( EXIT_FAILURE );
       }
     std::cout << "after EXIT " << std::endl; 
     args.name = command.GetValueAsBool("Name","boolval");
    }
    ce qui fait que tu essaye de sortir si... le parsing de la commande réussi

    Heuu... y a pas un problème "KEKPART"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Sauf que là, le code que tu donnes ne correspond pas au code que tu présentais en début de discussion...

    Ici, on a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (command.Parse(argc,argv)) // Parse est fonction de metaCommand
       {
       std::cout << "Inside EXIT " << std::endl; 
       exit( EXIT_FAILURE );
       }
     std::cout << "after EXIT " << std::endl; 
     args.name = command.GetValueAsBool("Name","boolval");
    }
    qui revient exactement à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (command.Parse(argc,argv) == true) // Parse est fonction de metaCommand
       {
       std::cout << "Inside EXIT " << std::endl; 
       exit( EXIT_FAILURE );
       }
     std::cout << "after EXIT " << std::endl; 
     args.name = command.GetValueAsBool("Name","boolval");
    }
    ce qui fait que tu essaye de sortir si... le parsing de la commande réussi

    Heuu... y a pas un problème "KEKPART"
    Je viens de faire des modifs dans mon dernier post.

    En fait, il faut juste que je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (command.Parse(argc,argv))
    {
    instructions ;
    }
    si dans les instructions il n'y a pas un exist tout se passe bien

    mais si je mets un exit dans les instructions dans ce cas je dois faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (!command.Parse(argc,argv))
    {
    instructions ;
    }
    pour que le code marche. Mais il y a tjs le message qui vient de la librairie.

    Vraiment c

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Mais c'est normal:

    La commande exit a pour résultat de mettre fin à l'exécution du programme (on annule littéralement tout, et le programme est quitté).

    La fonction parse renvoie true si le parsing s'est correctement déroulé et false si ce n'est pas le cas.

    Ton test doit donc bien ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(!command.parse((argc,argv)) // if parsing fails
    {
        std::cout << "Inside EXIT " << std::endl; 
        exit( EXIT_FAILURE );
    }
    Mais tu n'entrera dans ce bloc d'instructions que si... le parsing échoue, et c'est tout à fait normal

    Si le parsing réussi, il n'y a strictement aucune raison de rentrer dans ce bloc d'instructions, et donc, aucune raison d'avoir un quelconque affichage qui ne devrait survenir que si le parsing échoue
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Mais c'est normal:

    La commande exit a pour résultat de mettre fin à l'exécution du programme (on annule littéralement tout, et le programme est quitté).

    La fonction parse renvoie true si le parsing s'est correctement déroulé et false si ce n'est pas le cas.

    Ton test doit donc bien ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(!command.parse((argc,argv)) // if parsing fails
    {
        std::cout << "Inside EXIT " << std::endl; 
        exit( EXIT_FAILURE );
    }
    Mais tu n'entrera dans ce bloc d'instructions que si... le parsing échoue, et c'est tout à fait normal

    Si le parsing réussi, il n'y a strictement aucune raison de rentrer dans ce bloc d'instructions, et donc, aucune raison d'avoir un quelconque affichage qui ne devrait survenir que si le parsing échoue
    Je suis d'accord, c'est ce que je veux, mais le message s'affiche et vient de la fonction sparse le voici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Usage : ./runProgram
     System tags: 
       [ -v ] or [ -h ]
          = List options in short format
       [ -V ] or [ -H ]
          = List options in long format
       [ -vxml ] or [ -hxml ] or [ -exportXML ]
          = List options in xml format for BatchMake
       [ --xml ]
          = List options in xml format for Slicer
       [ -vgad ] or [ -hgad ] or [ -exportGAD ]
          = List options in Grid Application Description format
       [ -version ]
          = return the version number
       [ -date ]
          = return the cvs checkout date
     ......
    les affichage de debougage "before .. after" sont bien affiches avant et apres l'affichage de sparse. Sinon le programme marche bien. Est ce que ceci est normale ?

Discussions similaires

  1. [VB6] comment renvoyer un exit code en VB6 ?
    Par VVE dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 13/05/2004, 13h30
  2. Script SQL avec des EXIT SQL.SQLCODE
    Par fidififouille dans le forum Oracle
    Réponses: 14
    Dernier message: 23/04/2004, 16h45
  3. return ();exit() ;
    Par Zazeglu dans le forum C
    Réponses: 12
    Dernier message: 10/10/2003, 20h56
  4. Un lecteur logique caché!!!
    Par Cyberman dans le forum Composants
    Réponses: 3
    Dernier message: 05/10/2003, 23h16
  5. [langage] exit
    Par aw dans le forum Langage
    Réponses: 2
    Dernier message: 12/06/2003, 11h10

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