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

Langage C++ Discussion :

Stopper une boucle


Sujet :

Langage C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 11
    Par défaut Stopper une boucle
    Bonjour à tous,

    J'utilise C++ builder pour un projet.

    Mon problème, comment faire pour stopper une boucle grâce à un bouton STOP.

    J'ai essayer de faire comme ceci :


    Unit1.cpp
    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
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            //...
     
    	L = algorithmeGenetique(...);
     
            //...
    }
    //---------------------------------------------------------------------------
     
     
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    	CONTINUER = FALSE;
    }
    //---------------------------------------------------------------------------
    algorithmeGenetique.cpp

    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
    int * algorithmeGenetique(...)
    {
            //...
     
            CONTINUER = TRUE;
     
            while (compteur++ < nbrItterations && CONTINUER)
            {
                    //...
     
                    Application->ProcessMessages();
            }
     
            //...
    }
    stuctures.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define                     FALSE             0
    #define                      TRUE             1
     
    int CONTINUER; // variable globale


    Merci.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Tu as essayé...et? Si tu as besoin d'aide c'est que ça échoue...comment?
    Nous avons besoin pour te répondre d'informations sur ton problème...les informaticiens lisent le code, l'hexa, le binaire,et généralement l'anglais, mais jamais les esprits...

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Une petite observation, cependant: puisque CONTINUER est un booléen, et que tu fais du c++, pourquoi ne pas en faire un booléen? bool, en utilisant les valeurs true et false?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 11
    Par défaut
    C'est du code en C à la base.


    Se que j'ai fait ne fonctionne pas ... Pourquoi ? Aucune idée.

    J'ai mis un CheckBox à la place du Button et sa fonctionne mais c'est moins jolie.

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    En théorie, ton bouton va se trouver "quelque part", dans un formulaire, une boite de dialogue ou une fenêtre...

    Il t'est donc particulièrement aisé de garder, au niveau de ce "quelque part", une information concernant l'état actuel de ton bouton (un simple booléen "on/off" par exemple )

    Si tu as bien découpé ton projet, tu devrais aussi avoir un controleur qui va s'occuper de faire en sorte que ta boucle s'effectue, et, il y a de fortes chances pour que le "quelque part" dans lequel se trouve ton bouton dispose, justement, de l'instance du contrôleur en question.

    Tout ce qu'il te faut donc faire, c'est t'assurer que ton bouton réagisse à l'événement du clique en:
    1. signalant au controleur qu'il doit changer d'état (passer de "on à off et inversement)
    2. veillant à garder le nouvel état (on ou off) pour savoir quel état transmettre au controleur lors du prochain clique
    3. (la "touch of class" serait, bien sur, de modifier le texte du bouton pour indiquer l'état actuel )


    Tu pourrais donc avoir un controleur qui ressemblerait à quelque chose comme
    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
    class MyControler
    {
        public:
            void run()
            {
                 while(again)
                 {
                     /* ...*/
                 }
            }
            void changeState()
            {
                 again = !again;
                 if(again)
                     run();
            }
        private:
            bool again;
    };
    et, au niveau du quelque part (je prend l'exemple d'une boite de dialogue ) quelque chose comme
    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
    class MyDialog
    {
        public:
            onLaunchButtonClick()
            {
                controler.changeState();
                running = !running;
                if(running)
                    launchButton->setText("Stop");
                else
                    launchButton->setText("Run");
            }
        private:
            TButton * lauchButton;
            bool running;
    };
    Le tout, bien sur, à adaper pour permettre la modification du "again" alors que la boucle s'effectue encore, et à la VCL (si c'est elle que tu utilise )
    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

  6. #6
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Bonjour,

    ta déclaration de variable int CONTINUER; est dans un header, qui je suppose doit être inclus dans Unit1.cpp et algorithmeGenetique.cpp.
    Un #include entraine une recopie textuelle du fichier spécifié dans l'unité où il est inclus. Il y a donc une variable CONTINUER dans Unit1.cpp et une autre dans algorithmeGenetique.cpp (possédant le même nom mais étant tout de même différente).

    Ce n'est donc pas la même variable qui est lue et écrite.

    Pour faire une variable globale il faut : la définir dans une seul unité (*.cpp) bool CONTINUER;et la déclarer externe dans le .h extern bool CONTINUER;.
    Il est aussi possible d'utiliser un membre static c++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // .h
    class TAlgorithmeGenetique
    {
    public:
       static bool CONTINUER; 
    };
    // .cpp
    bool  TAlgorithmeGenetique::CONTINUER = false;
    voire de ne pas utiliser un booléen global du tout (dans le même genre d'idées que propose koala01)
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    // algorithmeGenetique
    class TAlgorithmeGenetique
    {
    private:
       bool FContinuer; 
    public:
       TAlgorithmeGenetique()
         : FContinuer(false)
       {}
     
        void Stop()
        { FContinuer = false; }
     
        int Run()
        {
            FContinuer = true;
            while(FContinuer) 
            {
                // [...]
            }      
        } 
    };
    // Unit1
    class TForm1
    {
    // [...]
    private:
        TAlgorithmeGenetique FAlgorithmeGenetique;
    };
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            //...
    	L = FAlgorithmeGenetique.Run();
            //...
    }
     
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    	FAlgorithmeGenetique.Stop();
    }

Discussions similaires

  1. Stopper une boucle while
    Par Emotion dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 11/01/2010, 09h57
  2. Stopper une boucle
    Par jocqfd dans le forum MATLAB
    Réponses: 5
    Dernier message: 07/01/2008, 11h34
  3. Stopper une boucle
    Par Spani dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/08/2007, 12h11
  4. N'arrive pas a stopper une boucle
    Par Mac Twist dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 16/07/2007, 12h25
  5. stopper une boucle en attendant un evenement
    Par Psykorel dans le forum Langage
    Réponses: 4
    Dernier message: 08/01/2006, 23h08

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