Por que minha declaração IF não vê uma global?

14

Eu sou bastante novo na programação do Arduino. Estou com um problema ao compilar o seguinte código:

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

Por alguma razão, o compilador está convencido de que a variável lastTime_Debounce1na segunda instrução IF, na Linha 54, não foi declarada no escopo. Não entendo como isso é possível, pois a variável em questão é um global definido e inicializado.

Se eu comentar o primeiro trio de instruções IF (manipulação do botão 1), o segundo trio (manipulação do botão 2) não terá problemas em compilar, mesmo que faça exatamente a mesma coisa da mesma maneira.

Eu verifiquei todos os suspeitos de sempre: ortografia, chaves, ponto-e-vírgula e até blocos de código comentados, um de cada vez, mas não consigo encontrar a fonte do problema. Estou usando o IDE do Arduino 1.8.2.

Alguém pode apontar o erro que estou perdendo?

MikeB
fonte
1
Marquei sua pergunta com a tag C ++ para ver se o realce da sintaxe tornaria o problema mais óbvio, mas infelizmente não.
Nick Gammon

Respostas:

28

A barra invertida nos seus comentários é o problema. De acordo com as definições de linguagem C ++, a \no final da linha é interpretado como uma "continuação de linha". Assim, seu comentário continua na próxima linha e sua declaração e inicialização de variável são comentadas.

Isso é aparente ao abrir seu código com um bom programa de destaque de sintaxe, como o Notepad ++.

insira a descrição da imagem aqui

Remover tudo \\do final da linha de comentário resolve seu problema.

Nota lateral: para obter mais informações, consulte /programming//a/30290133/5296568 . As barras invertidas no final de uma linha são realmente úteis quando usadas em definições de macro de várias linhas.

Maximilian Gerhardt
fonte
1
Estou surpreso que o marcador de código aqui não capte isso.
WernerCD
2
A marcação de código do @WernerCD Stack Exchange tenta detectar de forma inteligente qual idioma está sendo usado no bloco de código, mas às vezes falha em fazê-lo e pensa que é algo que não é. você pode corrigi-lo especificando <! - language: insert-lang-here -> antes do snippet.
Nzall
1
@Nzall, veja o comentário do NickGammon acima; mesmo o marcador de sintaxe StackOverflow, quando colocado no modo C / C ++ (adicionando a tag C ++), não o destaca corretamente.
Maximilian Gerhardt
Por que isso funciona mesmo? O primeiro não deveria \ demask o segundo e, portanto, não deveria comentar a nova linha?
Nova
Eu não estou ciente de que um \ em um comentário pode escapar do próximo caractere como se o `\` fosse colocado em uma sequência de caracteres.
Maximilian Gerhardt