Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment arrêter une fonction et continuer le reste ?

C++

Sujet résolu
    4 mars 2008 à 22:23:04

    Bonsoir,
    Alors j'ai un tout petit souçi. Mon programme vérifie si un certain fichier éxiste, si c'est le cas, il retourne "Cannot continue" ou un truc du genre, et dans le cas invérse, il continue la fonction.

    Je vous passe la source :
    1. if(std::ifstream("Fichier.ext")) { // Vérifie l'acces au fichier
    2.     (*ProgressText) << _("ERROR: Cannot continue !\n"); // Si le fichier éxiste la fonction doit s'arrêter. C'est ici que je voudrais que le programme quitte la fonction pour ne pas faire le reste.
    3.     }
    4.     else //Si le fichier n'éxiste pas, continuer la fonction.
    5.     (*ProgressText) << _("STATUS: Checking files... Done !\n");
    6.     (*ProgressText) << _("STATUS: Retrieving file information...\n");
    7.     //Reste du code
    8. }


    Voilà, j'éspère que vous avez compris :)
    • Partager sur Facebook
    • Partager sur Twitter
      4 mars 2008 à 22:28:05

      Essaye la commande :
      1. exit(0);

      Edit : oups je repond pas a ta question xD
      • Partager sur Facebook
      • Partager sur Twitter
        4 mars 2008 à 22:33:15

        Oh merci, c'était super rapide. :D En effet, cela arrête la fonction, mais en même temps tout le programme. :-°

        Je pense que je pourrais me débrouiller avec ça, mais c'est toujours plus classe de ne pas devoir forcer à arrêter tout le logiciel. Donc si vous avez encore une idée, je suis à l'écoute ^^
        • Partager sur Facebook
        • Partager sur Twitter
          4 mars 2008 à 22:35:53

          Bonsoir.

          Je propose "break;" !

          Au vue du post-it sur les mots-clefs, particuliérement ici :
          Liste de tous les mots clefs du C et C++.

          Je me disais bien avoir vue quelque chose dans ce style... Après, reste a voir si cela correspond a tes besoins.
          J'en ai l'impression vu que tu parle d'une structure conditionnelle, "break;" te permettra de sortir d'une paire d'accolade.

          Maintenant, si tu te trouve dans une fonction et que tu souhaite en sortir, un "return 0" ou "1", ou une variable du type de retour de ta fonction me parait plus indiqué.

          J'avoue qu'avec ton morceau de code je reste dans le doute sur le choix.

          Bonne chance :)
          • Partager sur Facebook
          • Partager sur Twitter
            4 mars 2008 à 22:39:03

            Malheureusement, break ne marche pas :(

            "break statement not within loop or switch "

            Donc en gros, break ne peut être qu'utilisé dans une boucle ou dans un switch :(
            • Partager sur Facebook
            • Partager sur Twitter
              4 mars 2008 à 22:39:50

              "break;" ca c'est pas pour les switch o.O ?

              Si tu veux une solution a ton probleme, je te conseille plutot de faire un Switch avec :
              1. bool rs = std::ifstream("Fichier.ext");
              2. switch(rs)
              3. {
              4. case true :
              5. break;
              6. case false:
              7. // Ton code...
              8. break;
              9. }


              Edit : voila c'est bien ce que je pensais :)
              • Partager sur Facebook
              • Partager sur Twitter
                4 mars 2008 à 22:42:39

                Et bien "return" ?

                J'avoue que pour t'aider j'aimerai voir un peu plus ton code. Du moins, les structures conditionnelles, itératifs, et/ou le début de la "fonction". Car si c'est une fonction, return devrait faire l'affaire.

                Citation : Dr.Tenma

                "break;" ca c'est pas pour les switch o.O ?
                Edit : voila c'est bien ce que je pensais :)



                En C je crois que ca l'est uniquement pour les switch. Mais l'exemple du post-it que j'ai donnée semble indiquer qu'en C++ ca ne l'est pas seulement :

                Citation : hiura

                break (casser en français)
                Description : Instruction de branchement permettant de sortir d'une boucle for, while ou do...while. Break est aussi utilisé à la fin de chaque bloc d'instructions d'un switch, il permet de ne pas exécuter les cas se trouvant en-dessous après avoir terminé le bloc correspondant.
                Langage : C/C++
                Exemple et/ou commentaire :

                1. while( x < 100 ) {  //Tant que x est plus petit que 100
                2.      if( x < 0 )   //Si x est négatif
                3.            break;      //On sort de la boucle while
                4.      cout << x << endl;
                5.      x++;
                6.    }


                Remarques :
                1) Si plusieurs boucles sont imbriquées, le break ne permet de sortir que d'une seule boucle.
                2) Break n'est pas obligatoire à la fin d'un 'case' ; s'il est omis, tous les 'case' avant le prochain break ou la fin du switch seront exécutés.



                (Le lien, toujours ici :Mot clefs du langage C++)
                • Partager sur Facebook
                • Partager sur Twitter
                  4 mars 2008 à 22:48:18

                  Voci le code source de la fonction, 'fin j'éspère que c'est une fonction, histoire de ne pas me faire humilier devant le people :-°

                  1. void RPCFrm::DecryptButtonClick(wxCommandEvent& event)
                  2. {
                  3.         DecryptButton->Enable(false);SecureButton->Enable(true);
                  4.         // Retrieve file information (Name, Size and stuff). Completely useless.
                  5.         // Code inutile...
                  6.     (*ProgressText) << _("STATUS: Checking files...\n");
                  7.     if(std::ifstream("Fichier.ext")) {
                  8.     (*ProgressText) << _("ERROR: Cannot continue ! Project secured !\n");
                  9.     (*ProgressText) << _("STATUS: Exiting... \n");
                  10.     Sleep(1000);
                  11.     ProgressGauge->SetValue(ProgressGauge->GetValue() + 25);
                  12.     Sleep(1000);
                  13.     ProgressGauge->SetValue(ProgressGauge->GetValue() + 50);
                  14.     Sleep(1000);
                  15.     ProgressGauge->SetValue(ProgressGauge->GetValue() + 75);
                  16.     Sleep(1000);
                  17.     ProgressGauge->SetValue(ProgressGauge->GetValue() + 100);
                  18.     exit(0);
                  19.     }
                  20.     else
                  21.     (*ProgressText) << _("STATUS: Checking files... Done !\n");
                  22.         (*ProgressText) << _("STATUS: Patching files...\n");
                  23.     //Main engine
                  24.     //Reste de l'engin
                  25.         ProgressGauge->SetValue(ProgressGauge->GetValue() + 100);
                  26. }


                  C'est ce que j'ai réussi à faire avec exit(0) :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 mars 2008 à 22:50:27

                    o.O, rien pigé mdr, mais franchement si tu veux une bonne solution pour ton probleme un switch ferait l'affaire, faudrait voir aussi ce que retourne ifstream et ainsi faire un case pour chaque valeur(enfin pas toute, mais celle qui t'interessent)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 mars 2008 à 22:52:39

                      Bah pourtant c'est pas très dur à comprendre. C'est ce qui se passe après avoir appuye sur un bouton. :p

                      Si vous voulez vraiment savoir de quoi il s'agit,
                      http://www.rmxp.org/forums/index.php?topic=42039.msg396550#msg396550

                      :-°
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 mars 2008 à 22:58:17

                        Je suis persuadé qu'un "return ;", peut être même sans valeur (vue que tu utilsie void) pourrait faire l'affaire, mais bon ce ne sont que de vieux souvenirs de mes cours de... L'année dernière !

                        Quoi qu'il en soit, si je comprend bien ton if-else :

                        1. Si (ifstream("Fichier.ext"))
                        2.    Quitter
                        3. Sinon
                        4.    Continuer le programme


                        Je ne vois pas en quoi il y a un problème : Ouverture une paire d'accolade après otn else jusqu'a la fin de ta fonction qui contiendra tout le code devant s'executer.
                        Et si tu préfère tu peut faire l'inverse facilement :

                        1. Si (<couleur nom="rouge">!</couleur>ifstream("Fichier.ext"))
                        2.    Continuer le programme
                        3. Sinon
                        4.    Quitter


                        Ton morceau de code quittant le programme se trouvera à la fin, ce qui paraitra peut etre plus "clair".
                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 mars 2008 à 23:04:32

                          MAIS OUI ! Quel idiot je suis ! :-°

                          Regardez-bien ce code:
                          1. else
                          2.     (*ProgressText) << _("STATUS: Checking files... Done !\n");
                          3.         (*ProgressText) << _("STATUS: Patching files...\n");
                          4.     //Main engine
                          5.     //Reste de l'engin
                          6.         ProgressGauge->SetValue(ProgressGauge->GetValue() + 100);


                          Je n'ai jamais ouvert ni fermé les acollades du else ! Donc il suppose qu'else n'est que la première ligne ! Wouhou ! Merci les gars :lol:

                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 mars 2008 à 23:06:59

                            Lol, je t'avoue que je pensais que c'était fait "exprès".

                            Pour faire un "if else-if else" plus tard, dont le dernier morceau devrait s'executer dans les deux derniers cas, mais pas le premier...

                            Quoi qu'il en soit, bonne continuation (je m'aventure sur ton lien si tu le permet ^^)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              4 mars 2008 à 23:42:07

                              je confirme la supposition de Xan un "return;" à la place du "exit(0);" aurais quitter la fonction sans quitter le programme.

                              maintenant je ne comprend pas bien l'utiliter de faire poireauter l'utilisateur devant une barre de progression surtout après lui avoir dit qu'on à trouver l'erreure :D Enfin comme quand j'était jeune "ca à plus la classe quand les barres de progressions vont lentement" ?

                              du moins ravi que t'es trouvé ton bonheur avec le else :)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                5 mars 2008 à 0:21:59

                                Ton test me parait des plus ... inversé => if (! ...)

                                Sinon, exit est à bannir des codes C++. Les exceptions, ou même les retours anticipés, sont plus appropriés.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

                                Comment arrêter une fonction et continuer le reste ?

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown