Pourquoi ma déclaration IF ne peut-elle pas voir un global?

14

Je suis plutôt nouveau dans la programmation Arduino. J'ai un problème lors de la compilation du morceau de code suivant:

const int relay1 = 10;  //Power Relay 1
const int relay2 = 11;  //Power Relay 2
const int relay3 = 12;  //Toggle Relay
const int button1 = 3;  
const int button2 = 4;
const int button3 = 5;

//---Button States---\\
int button1State;   //Current state of Button 1
int button2State;   //Current state of Button 2
int button3State;   //Current state of Button 3
int button1State_prev = LOW;  //Previous state of Button 1
int button2State_prev = LOW;  //Previous state of Button 2
int button3State_prev = LOW;  //Previous state of Button 3

//---General Variables---\\
int userSelection = 0;
int interlockState = 0;
int platformState = 0;

//---Interval-Tracking Variables---\\
unsigned long lastTime_Debounce1 = 0;   //Button 1 debounce time
unsigned long lastTime_Debounce2 = 0;   //Button 2 debounce time

//---Activity Delays---\\
const unsigned int relayDelay = 10;           //Delay between relay actions (ms)
const unsigned int debounceDelay = 60;        //Delay for button de-bouncing (ms)

void setup() {
  //Configure Pins
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);

  digitalWrite(relay1, LOW);
  digitalWrite(relay2, LOW);
  digitalWrite(relay3, LOW);
}

void loop() {
  //Read value of each input pin
  int button1Reading = digitalRead(button1);  //Current reading of Button 1
  int button2Reading = digitalRead(button2);  //Current reading of Button 2
  int button3Reading = digitalRead(button3);  //Current reading of Button 3

  //Debounce Button1
  if (button1Reading != button1State_prev) {
    lastTime_Debounce1 = millis();
  }
  button1State_prev = button1Reading;
  if ((millis() - lastTime_Debounce1) > debounceDelay) {
    if (button1Reading != button1State) {
      button1State = button1Reading;
    }
  }

  //Debounce Button2
  if (button2Reading != button2State_prev) {
    lastTime_Debounce2 = millis();
  }
  button2State_prev = button2Reading;
  if ((millis() - lastTime_Debounce2) > debounceDelay) {
    if (button2Reading != button2State) {
      button2State = button2Reading;
    }
  }

Pour une raison quelconque, le compilateur est convaincu que la variable lastTime_Debounce1dans la deuxième instruction IF, sur la ligne 54, n'a pas été déclarée dans la portée. Je ne comprends pas comment cela est possible, car la variable en question est un global défini et initialisé.

Si je commente le premier trio d'instructions IF (gestion du bouton 1), le deuxième trio (gestion du bouton 2) n'a aucun problème à compiler, même s'il fait exactement la même chose exactement de la même manière.

J'ai vérifié tous les suspects habituels: orthographe, accolades, points-virgules, même des blocs de code commentés un par un, mais je ne trouve pas la source du problème. J'utilise l'IDE Arduino 1.8.2.

Quelqu'un peut-il signaler l'erreur qui me manque?

MikeB
la source
1
J'ai marqué votre question avec la balise C ++ pour voir si la mise en évidence de la syntaxe rendrait le problème plus évident, mais malheureusement pas.
Nick Gammon

Réponses:

28

La barre oblique inverse dans vos commentaires est le problème. Selon les définitions du langage C ++, un \à la fin de la ligne est interprété comme une "continuation de ligne". Ainsi, votre commentaire se poursuit à la ligne suivante et votre déclaration et initialisation de variable est mise en commentaire.

Cela apparaît lors de l'ouverture de votre code avec un bon programme de mise en évidence de la syntaxe, comme Notepad ++.

entrez la description de l'image ici

Tout supprimer \\à la fin de la ligne de commentaire résout votre problème.

Note latérale: Pour plus d'informations, consultez /programming//a/30290133/5296568 . Les barres obliques inverses à la fin d'une ligne sont réellement utiles lorsqu'elles sont utilisées dans des définitions de macro sur plusieurs lignes.

Maximilian Gerhardt
la source
1
Je suis surpris que le surligneur de code ne comprenne pas cela.
WernerCD
2
Le balisage de code @WernerCD Stack Exchange essaie de détecter intelligemment la langue utilisée dans le bloc de code, mais parfois il ne le fait pas et pense que c'est quelque chose qu'il n'est pas. vous pouvez le corriger en spécifiant <! - language: insert-lang-here -> avant l'extrait.
Nzall
1
@Nzall voir le commentaire de NickGammon ci-dessus; même le surligneur de syntaxe StackOverflow, lorsqu'il est mis en mode C / C ++ (en ajoutant une balise C ++), ne le met pas correctement en surbrillance.
Maximilian Gerhardt
Pourquoi ça marche même? Le premier \ ne doit-il pas démasquer le second et donc ne pas commenter la nouvelle ligne?
Nova
Je ne suis pas au courant qu'un \ dans un commentaire puisse échapper au caractère suivant comme si le `\ 'était placé dans une chaîne de caractères.
Maximilian Gerhardt