Dlaczego moje oświadczenie IF nie widzi globalnego?


14

Jestem raczej nowy w programowaniu Arduino. Mam problem z kompilacją następującego fragmentu kodu:

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

Z jakiegoś powodu kompilator jest przekonany, że zmienna lastTime_Debounce1w drugiej instrukcji IF, w wierszu 54, nie została zadeklarowana w zakresie. Nie rozumiem, jak to jest możliwe, ponieważ zmienna, o której mowa, jest zdefiniowaną i zainicjowaną globalną.

Jeśli skomentuję pierwsze trio instrukcji IF (obsługa przycisku 1), drugie trio (obsługa przycisku 2) nie będzie miało problemu z kompilacją, nawet jeśli robi dokładnie to samo w dokładnie ten sam sposób.

Sprawdzałem wszystkich zwykłych podejrzanych: pisownię, nawiasy klamrowe, średniki, a nawet pojedynczo komentowałem bloki kodu, ale nie mogę znaleźć źródła problemu. Korzystam z Arduino 1.8.2 IDE.

Czy ktoś może wskazać błąd, którego mi brakuje?


1
Oznacziłem twoje pytanie tagiem C ++, aby zobaczyć, czy wyróżnienie składni sprawi, że problem stanie się bardziej oczywisty, ale niestety nie.
Nick Gammon

Odpowiedzi:


28

Problem stanowi odwrotny ukośnik w twoich komentarzach. Zgodnie z definicjami języka C ++, \na końcu linii jest interpretowana jako „kontynuacja linii”. W ten sposób twój komentarz jest kontynuowany w następnym wierszu, a twoja deklaracja zmiennej i inicjalizacja są komentowane.

Jest to widoczne podczas otwierania kodu za pomocą dobrego programu do wyróżniania składni, takiego jak Notepad ++.

wprowadź opis zdjęcia tutaj

Usunięcie wszystkich \\z końca wiersza komentarza rozwiązuje problem.

Uwaga dodatkowa: więcej informacji można znaleźć na stronie /programming//a/30290133/5296568 . Odwrotne ukośniki na końcu linii są w rzeczywistości przydatne, gdy są używane w wieloliniowych definicjach makr.


1
Dziwi mnie, że wyróżnienie kodu tutaj tego nie łapie.
WernerCD

2
@WernerCD Stos Znaczniki wymiany programu Exchange inteligentnie wykrywają język używany w bloku kodu, ale czasami to się nie udaje i wydaje się, że to nie jest to. możesz to naprawić, podając <! - language: insert-lang-here -> przed fragmentem.
Nzall

1
@Nzall patrz komentarz NickGammon powyżej; nawet wyróżnienie składni StackOverflow, gdy jest ustawione w trybie C / C ++ (przez dodanie znacznika C ++), nie podświetla go poprawnie.
Maximilian Gerhardt

Dlaczego to w ogóle działa? Czy pierwszy \ nie powinien zdemaskować drugiego, a tym samym nie powinien komentować nowego wiersza?
Nova

Nie jestem świadomy, że \ w komentarzu jest w stanie uciec od następnego znaku, tak jakby `\ 'został umieszczony w ciągu znaków.
Maximilian Gerhardt
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.