Tại sao tuyên bố IF của tôi không thể nhìn thấy toàn cầu?


14

Tôi còn khá mới với lập trình Arduino. Tôi gặp vấn đề khi biên dịch đoạn mã sau:

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

Vì một số lý do, trình biên dịch bị thuyết phục rằng biến lastTime_Debounce1trong câu lệnh IF thứ hai, trên Dòng 54, chưa được khai báo trong phạm vi. Tôi không hiểu làm thế nào điều này là có thể, vì biến trong câu hỏi là một toàn cầu được xác định và khởi tạo.

Nếu tôi nhận xét về bộ ba câu lệnh IF đầu tiên (xử lý Nút 1), bộ ba thứ hai (nút xử lý 2) không có vấn đề biên dịch, mặc dù nó thực hiện chính xác cùng một cách chính xác.

Tôi đã kiểm tra tất cả các nghi phạm thông thường: đánh vần, niềng răng, dấu chấm phẩy, thậm chí các khối mã được nhận xét một lần, nhưng tôi không thể tìm thấy nguồn gốc của vấn đề. Tôi đang sử dụng IDE Arduino 1.8.2.

Ai đó có thể vui lòng chỉ ra lỗi tôi đang thiếu?


1
Tôi đã gắn thẻ câu hỏi của bạn bằng thẻ C ++ để xem liệu tô sáng cú pháp có làm cho vấn đề rõ ràng hơn không, nhưng thật không may.
Nick Gammon

Câu trả lời:


28

Dấu gạch chéo ngược trong bình luận của bạn là vấn đề. Theo định nghĩa ngôn ngữ C ++, một dòng \ở cuối dòng được hiểu là "tiếp tục dòng". Do đó, bình luận của bạn sẽ được tiếp tục trong dòng tiếp theo và khai báo và khởi tạo biến của bạn được nhận xét.

Điều này là rõ ràng khi mở mã của bạn bằng một chương trình tô sáng cú pháp tốt, như Notepad ++.

nhập mô tả hình ảnh ở đây

Loại bỏ tất cả \\từ cuối dòng bình luận sẽ giải quyết vấn đề của bạn.

Lưu ý bên lề: Để biết thêm thông tin, hãy xem /programming//a/30290133/5296568 . Dấu gạch chéo ngược ở cuối dòng thực sự hữu ích khi được sử dụng trong các định nghĩa macro đa dòng.


1
Tôi ngạc nhiên mã highllight ở đây không nắm bắt được điều đó.
WernerCD

2
@WernerCD Stack Đánh dấu mã trao đổi cố gắng phát hiện thông minh ngôn ngữ nào đang được sử dụng trong khối mã, nhưng đôi khi nó không làm như vậy và nghĩ rằng đó không phải là ngôn ngữ. bạn có thể sửa nó bằng cách chỉ định <! - ngôn ngữ: insert-lang-here -> trước đoạn trích.
Nzall

1
@Nzall xem NickGammon bình luận ở trên; ngay cả cú pháp tô sáng cú pháp StackOverflow, khi được đặt ở chế độ C / C ++ (bằng cách thêm thẻ C ++), sẽ không tô sáng chính xác.
Maximilian Gerhardt

Tại sao điều đó thậm chí làm việc? Không phải là \ demask đầu tiên thứ hai và do đó không bình luận ra dòng mới?
Nova

Tôi không biết \ trong một bình luận có thể thoát khỏi ký tự tiếp theo như thể nó được đặt trong một chuỗi ký tự.
Maximilian Gerhardt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.