เหตุใดคำสั่ง 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

ใครช่วยกรุณาชี้ให้เห็นความผิดพลาดที่ฉันหายไปได้ไหม


1
ฉันติดแท็กคำถามของคุณด้วยแท็ก C ++ เพื่อดูว่าการเน้นไวยากรณ์จะทำให้ปัญหาชัดเจนขึ้นหรือไม่
Nick Gammon

คำตอบ:


28

แบ็กสแลชในความคิดเห็นของคุณเป็นปัญหา ตามนิยามภาษา C ++, a \ที่ท้ายบรรทัดถูกตีความว่าเป็น "การต่อเนื่องของบรรทัด" ดังนั้นความคิดเห็นของคุณจะยังคงอยู่ในบรรทัดถัดไปและการประกาศตัวแปรและการกำหนดค่าเริ่มต้นของคุณจะได้รับการแสดงความคิดเห็น

สิ่งนี้ชัดเจนเมื่อเปิดรหัสของคุณด้วยโปรแกรมเน้นไวยากรณ์ที่ดีเช่น Notepad ++

ป้อนคำอธิบายรูปภาพที่นี่

การลบทั้งหมด\\ออกจากจุดสิ้นสุดของบรรทัดความคิดเห็นจะช่วยแก้ปัญหาของคุณ

บันทึก Side: สำหรับข้อมูลเพิ่มเติมดูที่/programming//a/30290133/5296568 แบ็กสแลชที่ส่วนท้ายของบรรทัดมีประโยชน์จริง ๆ เมื่อใช้ในนิยามแมโครหลายบรรทัด


1
ฉันประหลาดใจว่าปากกาเน้นข้อความที่นี่ไม่สามารถจับได้
WernerCD

2
@WernerCD การแลกเปลี่ยนรหัสมาร์กอัปพยายามตรวจสอบอย่างชาญฉลาดว่ามีการใช้ภาษาใดในบล็อกโค้ด แต่บางครั้งก็ล้มเหลวในการทำเช่นนั้นและคิดว่าเป็นสิ่งที่ไม่ใช่ คุณสามารถแก้ไขได้โดยระบุ <! - language: insert-lang-here -> หน้าตัวอย่าง
Nzall

1
@Nzall เห็นความคิดเห็นของ NickGammon ด้านบน; แม้แต่ปากกาเน้นข้อความไวยากรณ์ StackOverflow เมื่ออยู่ในโหมด C / C ++ (โดยการเพิ่มแท็ก C ++) ก็ไม่ได้เน้นอย่างถูกต้อง
Maximilian Gerhardt

ทำไมถึงใช้งานได้ ไม่ควรเป็นคนแรก \ demask อันที่สองและไม่ควรใส่เครื่องหมายบรรทัดใหม่?
โนวา

ฉันไม่ทราบว่า \ ในความคิดเห็นที่สามารถหนีอักขระถัดไปราวกับว่ามันถูกวางไว้ในสตริงอักขระ
Maximilian Gerhardt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.