Warum wird in meiner IF-Anweisung kein globaler Wert angezeigt?

14

Ich bin ziemlich neu in der Arduino-Programmierung. Ich habe ein Problem beim Kompilieren des folgenden Codebits:

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;
    }
  }

Aus irgendeinem Grund ist der Compiler davon überzeugt, dass die Variable lastTime_Debounce1in der zweiten IF-Anweisung in Zeile 54 nicht als in-scope deklariert wurde. Ich verstehe nicht, wie dies möglich ist, da die betreffende Variable eine definierte und initialisierte globale Variable ist.

Wenn ich das erste Trio von IF-Anweisungen auskommentiere (Handling Button 1), hat das zweite Trio (Handling Button 2) keine Probleme beim Kompilieren, obwohl es genau dasselbe auf genau die gleiche Weise tut.

Ich habe alle üblichen Verdächtigen überprüft: Rechtschreibung, geschweifte Klammern, Semikolons, sogar auskommentierte Codeblöcke nacheinander, aber ich kann die Ursache des Problems nicht finden. Ich verwende die Arduino 1.8.2 IDE.

Kann jemand bitte auf den Fehler hinweisen, den ich vermisse?

MikeB
quelle
1
Ich habe Ihre Frage mit dem C ++ - Tag versehen, um festzustellen, ob die Hervorhebung der Syntax das Problem offensichtlicher macht, aber leider nicht.
Nick Gammon

Antworten:

28

Der Backslash in Ihren Kommentaren ist das Problem. Gemäß den C ++ - Sprachdefinitionen wird ein \am Ende der Zeile als "Zeilenfortsetzung" interpretiert. Somit wird Ihr Kommentar in der nächsten Zeile fortgesetzt und Ihre Variablendeklaration und -initialisierung wird auskommentiert.

Dies ist offensichtlich, wenn Sie Ihren Code mit einem guten Syntaxhervorhebungsprogramm wie Notepad ++ öffnen.

Bildbeschreibung hier eingeben

Entfernen Sie alle \\aus dem Ende der Kommentarzeile, um Ihr Problem zu beheben.

Randnotiz: Weitere Informationen finden Sie unter /programming//a/30290133/5296568 . Backslashes am Ende einer Zeile sind nützlich, wenn sie in mehrzeiligen Makrodefinitionen verwendet werden.

Maximilian Gerhardt
quelle
1
Ich bin überrascht, dass der Code-Textmarker hier das nicht versteht.
WernerCD
2
@WernerCD Stack Exchange-Code-Markup versucht auf intelligente Weise zu erkennen, welche Sprache im Codeblock verwendet wird. Manchmal schlägt dies jedoch fehl und es wird davon ausgegangen, dass dies nicht der Fall ist. Sie können das Problem beheben, indem Sie <! - language: insert-lang-here -> vor dem Snippet angeben.
Nzall
1
@ Nzall siehe NickGammon Kommentar oben; Selbst der Textmarker für die StackOverflow-Syntax wird im C / C ++ - Modus (durch Hinzufügen eines C ++ - Tags) nicht korrekt hervorgehoben.
Maximilian Gerhardt
Warum funktioniert das überhaupt? Sollte das erste nicht das zweite demaskieren und damit die neue Zeile nicht auskommentieren?
Nova
Mir ist nicht bekannt, dass ein \ in einem Kommentar in der Lage ist, das nächste Zeichen so zu maskieren, als ob es in eine Zeichenfolge eingefügt worden wäre.
Maximilian Gerhardt