Чому моє твердження 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 для обробки) не має проблем зі складанням, хоча воно робить саме те саме таким же чином.

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

Чи може хтось, будь ласка, вказати на помилку, яку я пропускаю?


1
Я позначив ваше запитання тегом C ++, щоб побачити, чи виділення синтаксису зробить проблему більш очевидною, але, на жаль, ні.
Нік Гаммон

Відповіді:


28

Проблема полягає в зворотному нахилі в коментарях. Відповідно до визначень мови C ++, a \в кінці рядка інтерпретується як "продовження рядка". Таким чином, ваш коментар продовжується в наступному рядку, а ваше змінне оголошення та ініціалізація коментується.

Це очевидно, коли ви відкриваєте свій код за допомогою гарної програми виділення синтаксису, наприклад, Блокнот ++.

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

Видалення всіх \\із кінця рядка коментарів вирішує вашу проблему.

Бічна примітка. Для отримання додаткової інформації дивіться /programming//a/30290133/5296568 . Зворотні риски в кінці рядка дійсно корисні, коли вони використовуються у багаторядкових макроозначеннях.


1
Я здивований, що підсвітка коду тут не сприймає цього.
WernerCD

2
Розмітка коду @WernerCD Stack Exchange намагається інтелектуально визначити, яка мова використовується в блоці коду, але іноді це не вдається і вважає, що це щось не так. ви можете виправити це, вказавши <! - language: insert-lang-here -> перед фрагментом.
Nzall

1
@Nzall див. Коментар до NickGammon вище; навіть підсвітка синтаксису StackOverflow, коли його переводять у режим C / C ++ (додаючи тег C ++), не виділяє його правильно.
Максиміліан Герхардт

Чому це навіть працює? Чи не повинен перший \ демаскувати другий і, таким чином, не коментувати новий рядок?
Нова

Мені невідомо, що \ у коментарі \ n може бути уникнути наступного символу так, як ніби він `` `розміщений у рядку символів.
Максиміліан Герхардт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.