为什么我的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第54行的第二个IF语句中的变量尚未在作用域内声明。我不知道这怎么可能,因为相关的变量是已定义和初始化的全局变量。

如果我注释掉IF语句的第一个三重奏(处理按钮1),则第二个三重奏(处理按钮2)编译没有问题,即使它以完全相同的方式执行完全相同的操作。

我检查了所有常见的可疑对象:一次拼写,花括号,分号,甚至注释掉了一段代码,但我找不到问题的根源。我正在使用Arduino 1.8.2 IDE。

有人可以指出我错过的错误吗?


1
我用C ++标记标记了您的问题,以查看语法高亮显示是否会使问题更加明显,但不幸的是没有。
尼克·加蒙

Answers:


28

您的评论中的反斜杠就是问题所在。根据C ++语言定义,\该行末尾的a被解释为“行延续”。因此,您的注释将在下一行继续,并且变量声明和初始化将被注释掉。

当使用良好的语法突出显示程序(例如Notepad ++)打开代码时,这很明显。

在此处输入图片说明

\\从注释行末尾删除所有内容可以解决您的问题。

旁注:有关更多信息,请参见/programming//a/30290133/5296568。在多行宏定义中使用时,行末的反斜杠实际上很有用。


1
我很惊讶这里的代码荧光笔没有抓住这一点。
WernerCD '18年

2
@WernerCD堆栈交换代码标记试图智能地检测代码块中使用的是哪种语言,但是有时它没有这样做,并认为这不是事实。您可以通过在代码段之前指定<!-语言:insert-lang-here->来解决此问题。
Nzall

1
@Nzall看到上面的NickGammon评论;甚至在置于C / C ++模式下(通过添加C ++标记)时,即使StackOverflow语法荧光笔也无法正确突出显示它。
马克西米利安·盖哈特

为什么这样行得通?第一个\不应该掩盖第二个而不掩盖新行吗?
新星

我不知道注释中的\能够转义下一个字符,就像将\放在字符串中一样。
马克西米利安·格哈特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.