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

Arduino Discussion :

Des boucles if récalcitrantes


Sujet :

Arduino

  1. #1
    Membre régulier
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 220
    Points : 74
    Points
    74
    Par défaut Des boucles if récalcitrantes
    Bonjour,

    J'ai quasiment terminé mon projet qui fonctionne, mais il me reste juste un petit point à régler sur deux boucles if qui semblent fonctionner à l'envers: oui je sais je me plante forcément quelque part !

    Voici le code complet dans lequel j'ai mis beaucoup de point de débuggage pour suivre à la trace sur le Moniteur série, mais je ne comprends pas pourquoi le booléen "status_f3_engaged" passe de faux (0) à vrai (1) entre l'entrée dans la fonction (void f3), où il passe bien dans la partie "false", mais à l'intérieur de cette partie "false" il semble changer de signe avant que je le lui dise:
    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
     
    void f3()
    	{	//les 5 lignes ci-dessous permettent de connaitre les valeurs des booléens permettant ou pas,
    		// d'enclancher les actions de f3
    		Serial.print(F("void f3: valeur de status_rew_engaged= "));
    		Serial.println(status_rew_engaged);
    		Serial.print(F("et"));
    		Serial.print(F("void f3: valeur de status_function_pause= "));
    		Serial.println(status_function_pause);
    		Serial.print(F("void f3: valeur de status_f3_engaged= "));
    		Serial.println(status_f3_engaged);
     
    		if(status_rew_engaged && status_function_pause) // car F3 ne doit pouvoir s'activer que si l'on est déjà en CUEING ARRIERE
    		{
    			if(status_f3_engaged = false)   // c'est-àdire si F3 n'est pas déjà engagée
    											// donc si on n'est pas déjà en REW_CUEING_1/6
    			{
    				Serial.println(F("void f3 partie false: Réception du code du Bouton F3:"));
    				Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
     
    				Serial.print(F("void f3 partie false: valeur de status_f3_engaged= "));
    				Serial.println(status_f3_engaged); // pourquoi vaut-il 1 alors qu'il valait 0 en rentrant ???		
     
    				digitalWrite(relai_REW,HIGH);	// on maintient le bouton REW enfoncé pour réduire à 1/6ème
    				Serial.println(F("void f3 partie false: relai_REW passé à HIGH et on le laisse à HIGH"));
    				Serial.println(F("et donc l'appareil baisse sa vitesse à 1/6ème"));
     
    				// ne PAS désactiver le relais Rewind puisque qu'il faut simuler le bouton Rewind enfoncé
    				Serial.println(F("void f3 partie false: relai_REW toujours à HIGH"));
     
    				status_f3_engaged = !status_f3_engaged; // inverse le status de la fonction F3 à true puisqu'on vient de l'appeler
    											// est indispensable pour gérer correctement l'affichage LCD au niveau de la boucle PAUSE
    				Serial.print(F("void f3 partie false: le status_f3_engaged a été passé à "));
    				Serial.println(status_f3_engaged);
    				Serial.println();
     
    				strcpy(active_input, "REW_CUEING_1/6th"); // on affecte donc la valeur "REW_CUEING_1/6th" à la fonction en cours
     
    				lcd.clear(); // clear display
    				lcd.setCursor(0,1); // left second line (1 from 1-16, Ligne 1 from 0-1)
    				lcd.print(" < CUEING 1/6th"); // affiche que l'on est en CUEING ARRIERE 1/6ème
    			}
    			if(status_f3_engaged = true) // càd si on est déjà en CUEING ARRIERE 1/6ème
    			{
    				Serial.println(F("void f3 partie true: Réception du code du Bouton F3:"));
    				Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
     
    				Serial.print(F(" partie true: valeur de status_f3_engaged= "));
    				Serial.println(status_f3_engaged); // affiche true ou false selon la valeur de ce booléen
    				Serial.println(F("void f3 partie true: devrait etre vrai, donc Relai_REW devrait etre actif"));
     
    				status_f3_engaged = !status_f3_engaged; // inverse le status de la fonction F3 à true puisqu'on vient de l'appeler
    											// est indispensable pour gérer correctement l'affichage LCD au niveau de la boucle PAUSE
    				digitalWrite(relai_REW,LOW);	// on maintient le bouton REW enfoncé pour réduire à 1/6ème
    				Serial.println(F("void f3 partie true: relai_REW passé à LOW"));
    				Serial.println(F("void f3 partie true: et donc l'appareil devrait re-accélerer à 1/3rd tout en restant en CUEING ARRIERE"));
     
    				strcpy(active_input, "REW_CUEING_1/3rd"); // on affecte donc la valeur "REW_CUEING_1/3rd" à la fonction en cours
     
    				lcd.clear(); // clear display
    				lcd.setCursor(0,1); // left second line (1 from 1-16, Ligne 1 from 0-1)
    				lcd.print(" < CUEING 1/3rd"); // affiche que l'on est en CUEING ARRIERE 1/3rd
    			}
    		} // et si on n'est pas déjà en CUEING ARRIERE, alors ne rien faire
    	}
    et voici ce que j'observe sur le Moniteur Série:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    3EE
    void f3: valeur de status_rew_engaged= 1
    etvoid f3: valeur de status_function_pause= 1
    void f3: valeur de status_f3_engaged= 0
    void f3 partie true: Réception du code du Bouton F3:
    3EE
     partie true: valeur de status_f3_engaged= 1
    void f3 partie true: devrait etre vrai, donc Relai_REW devrait etre actif
    void f3 partie true: relai_REW passé à LOW
    void f3 partie true: et donc l'appareil devrait re-accélerer à 1/3rd tout en restant en CUEING ARRIERE
    boucle IF f3: La fonction F3 a été appelée
    0
    0
    Si on regarde le moniteur Série, la valeur de "status_f3_engaged" est 0 à l'appel de la fonction f3, mais le programme passe par la boucle partie "true" comme s'il était à 1 ???

    Comme je ne crois pas à la magie noire, il y a forcément une erreur de ma part, mais où ? à force de regarder je finis par ne plus rien voir !

  2. #2
    Membre régulier
    Homme Profil pro
    Coach
    Inscrit en
    Novembre 2019
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Coach

    Informations forums :
    Inscription : Novembre 2019
    Messages : 220
    Points : 74
    Points
    74
    Par défaut
    c'est bon j'ai trouvé, enfin je crois, donc je vais tester mais ne perdez pas de temps dessus:

    au lieu d'une structure "if... then... else" classique, je me suis mélangé les pinceaux avec 2 if...

    Edit: et quand on fait un test dans un if, on utilise "==" et pas "="...., en plus de 15 ans j'en ai pourtant écrit des conditions... honte à moi

    je ne sais pas comment supprimer mon message, sinon je l'aurais supprimé...

  3. #3
    Membre habitué
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 293
    Points : 145
    Points
    145
    Par défaut
    bonsoir
    Juste pour te signaler que lorsqu'on teste un booleen dans un if on n'est pas obligé de mettre == true ou == false il suffit d'écrire : si on teste true ou si on teste false.

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 685
    Points : 5 328
    Points
    5 328
    Par défaut
    le = au lieu du == est un grand classique ! (le compilateur peut le signaler)

    c'est pour cela que vous verrez que les vieux programmeurs avertis mettent la constante en premier, au lieu d'écrire par exemple
    vous verrez écrit
    c'est la même chose mais si vous oubliez un égal, la seconde version
    n'est pas correcte en C ou C++ (on ne peut pas affecter la valeur d'une variable à une constante littérale) et donc le compilateur va s'arrêter et vous verrez le souci.

    Notez aussi que vous pouvez utiliser le else au lieu de tester à nouveau la condition inverse

    là vous faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (status_f3_engaged = false)  // c'est-àdire si F3 n'est pas déjà engagée
      // donc si on n'est pas déjà en REW_CUEING_1/6
    {
      ...
    }
     
    if (status_f3_engaged = true) // càd si on est déjà en CUEING ARRIERE 1/6ème
    {
      ...
    }
    vous auriez pu écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (false == status_f3_engaged)  // c'est-àdire si F3 n'est pas déjà engagée
    {
      // donc si on n'est pas déjà en REW_CUEING_1/6
      ...
    }
    else
    {
      // càd si on est déjà en CUEING ARRIERE 1/6ème
      ...
    }
    ou effectivement (car on n'est pas obligé avec un booléen de préciser)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (! status_f3_engaged)  // c'est-àdire si F3 n'est pas déjà engagée
    {
      // donc si on n'est pas déjà en REW_CUEING_1/6
      ...
    }
    else
    {
      // càd si on est déjà en CUEING ARRIERE 1/6ème
      ...
    }
    ça évite d'évaluer les 2 conditions à chaque fois lors de l'exécution du code

  5. #5
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    Les boucles sont avec les mots clef for(), while(){} et do{} while()


    Les conditions sont avec les mots clef if ; else (pas de then en C++)

    Après, tu peux faire des boucles contenant des conditions et des conditions contenant des boucles

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 685
    Points : 5 328
    Points
    5 328
    Par défaut
    oui, ça pique un peu de lire "boucles if"


    Citation Envoyé par Auteur Voir le message
    Les conditions sont avec les mots clef if ; else (pas de then en C++)
    switch() faut aussi partie des conditions (en pratique des "Selection statements"). les "boucles" sont des "Iteration statements"

    pour tout savoir et utiliser les bons mots: https://en.cppreference.com/w/cpp/language/statements

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. réalise des boucles uml 1.4
    Par cyrilforever dans le forum UML
    Réponses: 6
    Dernier message: 07/12/2006, 23h27
  2. [MS SQL Server] comment faire des boucles en SQL ?
    Par Yorel dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/11/2006, 10h41
  3. problème de syntaxe dans des boucles imbriquées
    Par deglingo37 dans le forum Access
    Réponses: 2
    Dernier message: 01/09/2006, 15h46
  4. Je n'arrive pas à faire des boucles dans un répertoire
    Par padodanle51 dans le forum Linux
    Réponses: 4
    Dernier message: 04/05/2006, 19h04
  5. simplement des boucles
    Par devdébuto dans le forum C
    Réponses: 3
    Dernier message: 07/11/2005, 09h50

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