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 :

Interruption d'une boucle


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 2
    Par défaut Interruption d'une boucle
    Bonjour,

    Je suis nouveau dans le monde de la programmation.

    Je m'y suis mis pour programmer des robots (Type NXT ou autres).

    J'ai un petit soucis dans un de mes programmes.

    Dans une boucle While (True), j'ai plusieurs boucles While qui correspondent à des actions du robot.

    Mon Problème est le suivant :

    Si dans une boucle je demande à mon robot d'éxecuter une tâche avec des waitxxxx et qu'en paralèlle une autre boucle demandait à un capteur quelquonque de s'arreter si celui ci atteignait une valeur souhaité, mon programme continue sans s'artréter comme demander car il est entrain d'executer la boucle dans la quelle il est.

    Ma question est :

    Comment dans une boucle While ajouter des interruption toute les milliseceonde ou autre pour que celui-ci vérifie les autres boucles de mon programme au cas ou pendant l'execution d'une boucle si une autre condition d'une autre boucle arrive il passe à la boucle en question .

    Exemple d'application :

    Mon robot avance de gauche a droite avec des timers, une boucle tourne pour lui dire si une ligne noire est detecté, de faire demi-tour.
    Comme j'utilise des Waitxx pour les moteurs, si il est dans une boucle avec des wait, il passe la ligne noire sans la lire .


    voici le dit programme au cas ou :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    //*!!Sensor,    S1,          soundsensor, sensorSoundDB,      ,                  !!*//
    //*!!Sensor,    S3,          lightSensor, sensorLightActive,      ,              !!*//
    //*!!Sensor,    S4,          sonarSensor, sensorSONAR,      ,                    !!*//
    //*!!                                                                            !!*//
    //*!!Start automatically generated configuration code.                           !!*//
    const tSensors sonarSensor          = (tSensors) S4;   //sensorSONAR        //*!!!!*//
    const tSensors lightSensor          = (tSensors) S3;   //sensorLightActive  //*!!!!*//
     
    //*!!CLICK to edit 'wizard' created sensor & motor configuration.                !!*//
     
    //******************************************************************************//
    //                              Mika77                                          //
    //                              RobotC on NXT                                   //
    //                                                                              //
    //  This program allows your robot do a sumo robot and fight in a ring          //
    //  delimited by black border                                                   //
    //                                                                              //
    //                                                                              //
    //******************************************************************************//
    //				Motors & Sensors                                //
    //                                                                              //
    //  [I/O Port]     [Name]          [Type]               [Description]           //
    //  Port 3         lightsensor     Light Sensor         none                    //
    //  Port 4         sonarsensor     Sonar Sensor         port 1 sonarsensor      //
    //  Port A         none            Motor                Right Motor             //
    //  Port B         none            Motor                Left Motor              //
    //                                                                              //
    //******************************************************************************//
     
    task main()
    {
     
    	wait1Msec(500);                        //the program waits 500 milliseconds before running further code
     
     
     
      while (true)                            //a while loop infinite (true) is declared
      {
     
      	        if(SensorValue(sonarSensor) > 25)  //if the sonar sensor reads a value less than 38 the if code will be run
          {
             motor[motorA] = -50;            //motor A is runing at a 50 power level
             motor[motorB] = 0;            //motor B is runing at a 0 power level
            wait1Msec (300);                // wait 300 Msec
            motor[motorA] = 0;            //motor A is runing at a 0 power level
             motor[motorB] = -50;            //motor B is runing at a 50 power level
            wait1Msec (300);                 // wait 300 Msec
     
          }
     
           else
          {
             motor[motorA] = -100;              //motor A is running at 100 power level
             motor[motorB] = -100;              //motor B is running at 100 power level
     
          }
     
          int x,y;                          // int declare integer x and y
           x = SensorValue(lightSensor);    // x = light
           nxtDisplayTextLine(1, "Light Reading:%d", x); // display light sensor reading
           y = SensorValue(sonarSensor);  // y = sonar
           nxtDisplayTextLine(2, "Sonar Reading:%d", y);  // display sonar reading
     
           while(SensorValue(lightSensor) < 30)  //"while loop" while the lightsensor reads a value less than 50 the if code will be run
          {
             motor[motorA] = 0;
             motor[motorB] = 0;
             wait1Msec(200);
             motor[motorA] = 70;
             motor[motorB] = 70;
             wait1Msec (200);
             motor[motorA] = 70;
             motor[motorB] = 0;
             wait1Msec (900);
          }
     
        }
    }

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut
    C'est typique de l'utilisation des interruptions...

    Tu devrai peut être faire une interruption sur un timer qui déclence la gestion des capteurs, puis retourne dans ta boucle principale.

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 2
    Par défaut
    Mon problème est que je ne sais me servir d'interruption,

    Il me faudrait des exemples :-)

  4. #4
    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
    je pense qu'avant tout c'est un problème de conception....

    Avant d'avoir 250 boucles en parallèle, tu ferais mieux d'avoir UNE boucle , qui par exemple gère des évènements, ou fait appel à une série de fonctions, chacune faisant un pas, par exemple..

    Ensuite tu as des signaux, timers, etc, qui vont mettre certaines variables à jour ("déplacement terminé" etc).

    Et en fonction de ces valeurs, dans LA boucle ou telle ou telle fonction, tu sautes, tu retournes, tu sors....

    Maintenant, pour sortir de la boucle, il suffit d'y tester une valeur qui sera mise à jour par les timers ou signaux...

Discussions similaires

  1. Interruption d'une boucle - variable non définie
    Par Sérendipité dans le forum Programmation multimédia/Jeux
    Réponses: 14
    Dernier message: 16/04/2011, 22h53
  2. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  3. [LabView 8.5] Problème d'interruption d'une boucle
    Par yoann23 dans le forum LabVIEW
    Réponses: 4
    Dernier message: 26/03/2008, 11h27
  4. Interruption d'une boucle
    Par jéjéjé dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 02/04/2007, 20h13
  5. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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