Perché la mia dichiarazione IF non può vedere un globale?


14

Sono piuttosto nuovo nella programmazione di Arduino. Ho un problema a compilare il seguente bit di codice:

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

Per qualche motivo, il compilatore è convinto che la variabile lastTime_Debounce1nella seconda istruzione IF, nella riga 54, non sia stata dichiarata nell'ambito. Non capisco come sia possibile, poiché la variabile in questione è un globale definito e inizializzato.

Se commento il primo trio di istruzioni IF (gestione del pulsante 1), il secondo trio (gestione del pulsante 2) non ha problemi di compilazione, anche se fa esattamente la stessa cosa esattamente allo stesso modo.

Ho controllato tutti i soliti sospetti: ortografia, parentesi graffe, punti e virgola, persino blocchi di codice commentati uno alla volta, ma non riesco a trovare l'origine del problema. Sto usando l'IDE di Arduino 1.8.2.

Qualcuno può far notare l'errore che mi manca?


1
Ho taggato la tua domanda con il tag C ++ per vedere se l'evidenziazione della sintassi renderebbe il problema più ovvio, ma sfortunatamente no.
Nick Gammon

Risposte:


28

La barra rovesciata nei commenti è il problema. Secondo le definizioni del linguaggio C ++, \a alla fine della riga viene interpretato come "continuazione della riga". Pertanto, il tuo commento continua nella riga successiva e la tua dichiarazione di variabili e l'inizializzazione vengono commentati.

Ciò è evidente quando si apre il codice con un buon programma di evidenziazione della sintassi, come Notepad ++.

inserisci qui la descrizione dell'immagine

Rimuovere tutto \\dalla fine della riga di commento risolve il problema.

Nota a margine: per ulteriori informazioni, consultare /programming//a/30290133/5296568 . Le barre rovesciate alla fine di una riga sono effettivamente utili quando utilizzate nelle definizioni di macro multilinea.


1
Sono sorpreso che l'evidenziatore di codice qui non lo capisca.
WernerCD,

2
Il markup del codice di Exchange Exchange di @WernerCD tenta di rilevare in modo intelligente quale lingua viene utilizzata nel blocco di codice, ma a volte non riesce a farlo e pensa che sia qualcosa che non lo è. puoi risolverlo specificando <! - language: insert-lang-here -> prima dello snippet.
Nzall,

1
@Nzall vedi il commento di NickGammon sopra; anche l'evidenziatore di sintassi StackOverflow, se messo in modalità C / C ++ (aggiungendo il tag C ++), non lo evidenzia correttamente.
Maximilian Gerhardt,

Perché funziona? Il primo \ non deve mascherare il secondo e quindi non commentare la nuova riga?
Nova,

Non sono a conoscenza del fatto che un \ in un commento sia in grado di sfuggire al carattere successivo come se `\` fosse inserito in una stringa di caratteri.
Maximilian Gerhardt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.