Почему мое заявление IF не может увидеть глобальное?

14

Я довольно новичок в программировании Arduino. У меня проблема с компиляцией следующего кода:

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

По какой-то причине компилятор убежден, что переменная lastTime_Debounce1во втором операторе IF в строке 54 не была объявлена ​​в области видимости. Я не понимаю, как это возможно, поскольку рассматриваемая переменная является определенной и инициализированной глобальной.

Если я закомментирую первое трио операторов IF (обработка кнопки 1), то второе трио (обработка кнопки 2) не будет иметь проблем с компиляцией, даже если оно делает точно то же самое точно таким же образом.

Я проверил всех обычных подозреваемых: орфографию, скобки, точки с запятой, даже закомментированные блоки кода по одному, но я не могу найти источник проблемы. Я использую Arduino 1.8.2 IDE.

Может кто-нибудь указать на ошибку, которую я пропустил?

MikeB
источник
1
Я пометил ваш вопрос тегом C ++, чтобы увидеть, сделает ли подсветка синтаксиса проблему более очевидной, но, к сожалению, нет.
Ник Гэммон

Ответы:

28

Обратная косая черта в ваших комментариях - это проблема. Согласно определениям языка C ++, a \в конце строки интерпретируется как «продолжение строки». Таким образом, ваш комментарий будет продолжен в следующей строке, а объявление и инициализация вашей переменной закомментированы.

Это очевидно при открытии кода с помощью хорошей программы подсветки синтаксиса, такой как Notepad ++.

введите описание изображения здесь

Удаление всего \\из конца строки комментария решает вашу проблему.

Примечание: для получения дополнительной информации, смотрите /programming//a/30290133/5296568 . Обратная косая черта в конце строки на самом деле полезна при использовании в многострочных макроопределениях.

Максимилиан Герхардт
источник
1
Я удивлен, что подсветка кода здесь не улавливает это.
WernerCD
2
@WernerCD Stack Exchange разметка кода пытается интеллектуально определить, какой язык используется в блоке кода, но иногда это не удается сделать и думает, что это не так. Вы можете исправить это, указав <! - language: insert-lang-here -> перед фрагментом.
Nzall
1
@Nzall см. Комментарий NickGammon выше; даже подсветка синтаксиса StackOverflow при переводе в режим C / C ++ (путем добавления тега C ++) не выделяет его правильно.
Максимилиан Герхардт
Почему это даже работает? Не должен ли первый \ демаскировать второй и, следовательно, не закомментировать новую строку?
Нова
Я не знаю, чтобы \ в комментарии была возможность экранировать следующий символ, как если бы он был помещен в символьную строку.
Максимилиан Герхардт