Partage
  • Partager sur Facebook
  • Partager sur Twitter

Paramètre optionnel Fonction Arduino : Problème

    21 mai 2021 à 20:46:35

    Bonsoir à tous, 

    Je m'excuse par avance pour le dérangement peut-être impertinent de ce sujet..
    Je m'explique, je souhaite faire une fonction sur Arduino : dans mon exemple celle-ci s'appelle "CC", avec comme paramètre un int "CCVal", je souhaiterai que quand j'appelle la fonction avec CCVal=1, celle-ci fonctionne avec ce 1, et si on l'appelle sans préciser CCVal, celle-ci fonctionne avec une valeur par défaut (par exemple CCVal=0). J'ai fait mes petites recherches et je suis tombé sur un post sur ce forum. La syntaxe serait :
    -Si on rentre sans valeur par défaut, donc appel avec une valeur obligatoire :

    void CC(int CCVal){}

    -Si on rentre avec valeur par défaut, donc appel sans une valeur obligatoire :

    void CC(int CCVal = 0){}

    (https://openclassrooms.com/forum/sujet/fonction-en-arduino-a-parametre-optionel)

    J'ai essayé dans l'IDE arduino, sans valeur par défaut tout fonctionne nickel, dès que je programme sans valeur par défaut j'ai une erreur me disant que la fonction n'est pas déclarée dans le "scope" :
    "

    D:\Fichiers\Documents\Arduino\TestConsAD\TestConsAD.ino: In function 'void loop()':

    TestConsAD:6:3: error: 'CC' was not declared in this scope

       CC(1);

       ^~

    exit status 1

    'CC' was not declared in this scope

    "
    Avec le code suivant :
    void setup() {
      Serial.begin(115200);
    }
    
    void loop() {
      CC(1);
      delay(1000);
    }
    void CC(int CCVal = 0){
      Serial.println(CCVal);
    }
    Si quelqu'un connait la raison à cela, je suis preneur (peut-être une erreur de ma part, une erreur de syntaxe ou que sais-je).
    Bonne soirée,
    Jules
    • Partager sur Facebook
    • Partager sur Twitter
      21 mai 2021 à 20:49:25

      Définis la fonction CC AVANT de l'appeler.

      Ou alors déclare-la avec son prototype.

      -
      Edité par zoup 21 mai 2021 à 20:50:45

      • Partager sur Facebook
      • Partager sur Twitter
        21 mai 2021 à 21:04:13

        Je n'avais pas pensé à ça...

        Je suis un peu curieux, connais-tu la raison de ce problème (pourquoi quand on initialise la valeur sans rien on peut le mettre après sinon on doit le mettre avant ?

        • Partager sur Facebook
        • Partager sur Twitter
          21 mai 2021 à 22:20:41

          JulesDubois3 a écrit:

          pourquoi quand on initialise la valeur sans rien on peut le mettre après sinon on doit le mettre avant ?

          Tu dois te tromper. Je pense que en mettant ou pas le "= 0", si tu déclares ta fonction après son appel, ça ne doit rien changer à l'erreur de compilation.

          -
          Edité par zoup 21 mai 2021 à 22:37:12

          • Partager sur Facebook
          • Partager sur Twitter
            21 mai 2021 à 23:51:42

            En fait, il y a un préprocesseur spécifique à l'IDE arduino pour transformer le fichier .ino en fichier .cpp utilisable par le compilateur. Il va rechercher toutes les fonctions définies dans le fichier .ino, et ajouter une déclaration ou prototype en début de fichier.

            Donc ton fichier .ino:

            void setup() {
              Serial.begin(115200);
            }
             
            void loop() {
              CC(1);
              delay(1000);
            }
            void CC(int CCVal){
              Serial.println(CCVal);
            }

            Va être transformé en ce fichier .cpp (avec des lignes "#line" en plus omises pour plus de clarté):

            #include <Arduino.h>
            
            void setup();
            void loop();
            void CC(int CCVal);
            
            void setup() {
              Serial.begin(115200);
            }
             
            void loop() {
              CC(1);
              delay(1000);
            }
            void CC(int CCVal){
              Serial.println(CCVal);
            }
            

            Sauf qu'apparemment, ce preprocesseur ne sait pas analyser les fonctions qui ont des paramètres par défaut, et elles n'ont pas le droit à leur déclaration en début de fichier .cpp, donc si elles sont définies après l'endroit où elles sont appelées, tu obtiens ces erreurs "undeclared".

            • Partager sur Facebook
            • Partager sur Twitter
              22 mai 2021 à 0:43:46

              Ahhhhh d'accord !!

              Je te remercie, c'est plus clair dans ma tête ! Je ne suis pas quelqu'un qui fait ça parce qu'on lui a demandé de faire ça, en m'expliquant je comprend mieux et je ne refait plus l'erreur !

              Un grand merci à vous 2, et un très grand merci pour l'explication, j'ai enfin pu finir mon programme (pas celui de mon exemple bien sûr).

              Une bonne soirée,

              Jules

              Edit :

              Bonjour à vous,

              J'ai une seconde petite question : dans mon programme j'utilise un switch...case dans une fonction avec comme paramètre la valeur de la case demandée (c'est pour cela que j'avais besoin d'une valeur optionnelle, pour une seule case qui demandais une valeur en plus..). Après compilation et test, cela ne fonctionnait pas correctement, à chaque fois je tombais sur la dernière case du switch alors que je demandais la première.. J'ai investigué un peu pour essayer de trouver le problème, j'ai donc intégrer une communication série pour voir ce qu'il se passait, à chaque case j'ai insérer un serial print pour voir quelle case était "ouverte", quand j'ai appelé la case 1, elle s'est bien exécutée, avec les 7 autres derrières, alors que je n'avais appelé que la première !!

              Je me demande ce qu'il se passe, et j'essaye de comprendre, mais je n'y parvient pas..

              Je vous joint la fonction avec le switch...case, ainsi que l'appel :

              void Ecran(int Affichage, int ValAtt = 0){
                Serial.print("Modification Affichage ");
                switch (Affichage){
                  case 1:
                    Serial.println("1");
                    if (EtatEcran == 7){lcd.setCursor(0, 2); lcd.print("Etat : Fermee       ");}
                    else {lcd.setCursor(7, 2); lcd.print("Fermee    ");}
                    if (EtatEcran == 8){lcd.setCursor(17,2); lcd.print("   ");}
                  case 2:
                    Serial.println("2");
                    if (EtatEcran == 7){lcd.setCursor(0, 2); lcd.print("Etat : Ouverte      ");}
                    else {lcd.setCursor(7, 2); lcd.print("Ouverte   ");}
                    if (EtatEcran == 8){lcd.setCursor(17,2); lcd.print("   ");}
                  case 3:
                    Serial.println("3");
                    if (EtatEcran == 7){lcd.setCursor(0, 2); lcd.print("Etat : AttenteH     ");}
                    else {lcd.setCursor(7, 2); lcd.print("AttenteH  ");}
                    if (EtatEcran == 8){lcd.setCursor(17,2); lcd.print("   ");}
                  case 4:
                    Serial.println("4");
                    if (EtatEcran == 7){lcd.setCursor(0, 2); lcd.print("Etat : AttenteF     ");}
                    else {lcd.setCursor(7, 2); lcd.print("AttenteF  ");}
                    if (EtatEcran == 8){lcd.setCursor(17,2); lcd.print("   ");}
                  case 5:
                    Serial.println("5");
                    if (EtatEcran == 7){lcd.setCursor(0, 2); lcd.print("Etat : AttenteV     ");}
                    else {lcd.setCursor(7, 2); lcd.print("AttenteV  ");}
                    if (EtatEcran == 8){lcd.setCursor(17,2); lcd.print("   ");}
                  case 6:
                    Serial.println("6");
                    if (EtatEcran == 7){lcd.setCursor(0, 2); lcd.print("Etat : Attente      ");}
                    else {lcd.setCursor(7, 2); lcd.print("Attente   ");}
                    if (EtatEcran == 8){lcd.setCursor(17,2); lcd.print("   ");}
                  case 7:
                    Serial.println("7");
                    lcd.setCursor(0, 2); lcd.print("Ouverture : 0/5: ");
                    if (PosO > 0){itoa(PosO, PosChar, 10); lcd.setCursor(12, 2); lcd.print(PosChar);}
                    if (EtatEcran == 8){lcd.setCursor(17,2); lcd.print("   ");}
                  case 8:
                    Serial.println("8");
                    itoa(ValAtt/10, BuffTempsAttente, 10); lcd.setCursor(17, 2); lcd.print(BuffTempsAttente);        
                }
                EtatEcran = Affichage;
              }
              Ecran(2);

              J'espère avoir donné assez de détails, et que vous pouvez m'aider..

              Jules

              -
              Edité par JulesDubois3 22 mai 2021 à 13:48:22

              • Partager sur Facebook
              • Partager sur Twitter
                22 mai 2021 à 14:49:30

                Par défaut, dans un switch case, les "cases" d'en dessous sont exécutés les uns après les autres à partir de celui qui à la valeur indiquée dans le switch.

                Pour n'exécuter que le "case" d'une valeur donnée, il faut terminer par un break:

                switch(x) {
                case 1: 
                   machin(); // exécuté pour x=1 uniquement
                case 3:
                   truc(); // exécuté pour x=1 parce qu'il n'y pas de 
                           // break dans le bloc précédent et x=3
                   break;  // quitte le switch
                case 4: 
                   chose(); // exécuté pour x=4 uniquement
                   break;   // quitte le switch
                }
                • Partager sur Facebook
                • Partager sur Twitter
                  22 mai 2021 à 16:27:25

                  Ahh, une erreur si bête...

                  Merci infiniment pour votre aide !

                  Jules

                  -
                  Edité par JulesDubois3 22 mai 2021 à 16:29:18

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Paramètre optionnel Fonction Arduino : Problème

                  × 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