¿Por qué mi declaración IF no puede ver un global?

14

Soy bastante nuevo en la programación de Arduino. Tengo un problema al compilar el siguiente bit de 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 alguna razón, el compilador está convencido de que la variable lastTime_Debounce1en la segunda instrucción IF, en la línea 54, no se ha declarado dentro del alcance. No entiendo cómo esto es posible, ya que la variable en cuestión es un global definido e inicializado.

Si comento el primer trío de sentencias IF (manejo del botón 1), el segundo trío (manejo del botón 2) no tiene problemas para compilar, aunque hace exactamente lo mismo de la misma manera.

Verifiqué a todos los sospechosos habituales: ortografía, llaves, punto y coma, incluso bloques de código comentados uno por uno, pero no puedo encontrar la fuente del problema. Estoy usando el IDE Arduino 1.8.2.

¿Alguien puede señalar el error que me falta?

MikeB
fuente
1
Etiqueté su pregunta con la etiqueta C ++ para ver si el resaltado de sintaxis haría que el problema fuera más obvio, pero desafortunadamente no.
Nick Gammon

Respuestas:

28

La barra invertida en sus comentarios es el problema. Según las definiciones del lenguaje C ++, \a al final de la línea se interpreta como una "continuación de línea". Por lo tanto, su comentario continúa en la siguiente línea y su declaración e inicialización de variables se comentan.

Esto es evidente al abrir su código con un buen programa de resaltado de sintaxis, como Notepad ++.

ingrese la descripción de la imagen aquí

Eliminar todo \\desde el final de la línea de comentarios resuelve su problema.

Nota al margen: para obtener más información, consulte /programming//a/30290133/5296568 . Las barras diagonales al final de una línea son realmente útiles cuando se usan en definiciones de macro de varias líneas.

Maximilian Gerhardt
fuente
1
Me sorprende que el resaltador de código aquí no capte eso.
WernerCD
2
El marcado de código @WernerCD Stack Exchange intenta detectar de forma inteligente qué idioma se está utilizando en el bloque de código, pero a veces no lo hace y cree que es algo que no es. puede solucionarlo especificando <! - idioma: insert-lang-here -> antes del fragmento.
Nzall
1
@Nzall vea el comentario de NickGammon arriba; incluso el resaltador de sintaxis StackOverflow, cuando se coloca en modo C / C ++ (al agregar la etiqueta C ++), no lo resalta correctamente.
Maximilian Gerhardt
¿Por qué eso incluso funciona? ¿No debería el primero \ demask el segundo y, por lo tanto, no comentar la nueva línea?
Nova
No estoy al tanto de que un \ en un comentario pueda escapar del siguiente carácter como si el `\` se hubiera colocado en una cadena de caracteres.
Maximilian Gerhardt