Mengapa pernyataan IF saya tidak melihat global?


14

Saya agak baru dalam pemrograman Arduino. Saya memiliki masalah dalam mengkompilasi sedikit kode berikut:

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

Untuk beberapa alasan, kompiler yakin bahwa variabel lastTime_Debounce1dalam pernyataan IF kedua, pada Baris 54, belum dinyatakan dalam lingkup. Saya tidak mengerti bagaimana ini mungkin, karena variabel yang dimaksud adalah global yang didefinisikan dan diinisialisasi.

Jika saya mengomentari trio pertama pernyataan-IF (menangani Tombol 1), trio kedua (menangani tombol 2) tidak memiliki masalah dalam mengkompilasi, meskipun ia melakukan hal yang persis sama dengan cara yang persis sama.

Saya memeriksa semua tersangka yang biasa: mengeja, kawat gigi, titik koma, bahkan mengomentari blok kode satu per satu, tetapi saya tidak dapat menemukan sumber masalahnya. Saya menggunakan IDE Arduino 1.8.2.

Bisakah seseorang menunjukkan kesalahan yang saya lewatkan?


1
Saya menandai pertanyaan Anda dengan tag C ++ untuk melihat apakah penyorotan sintaks akan membuat masalah lebih jelas, tetapi sayangnya tidak.
Nick Gammon

Jawaban:


28

Backslash dalam komentar Anda adalah masalahnya. Sesuai definisi bahasa C ++, a \di akhir baris ditafsirkan sebagai "kelanjutan garis". Dengan demikian, komentar Anda dilanjutkan di baris berikutnya dan deklarasi dan inisialisasi variabel Anda dikomentari.

Ini terlihat ketika membuka kode Anda dengan program penyorotan sintaks yang bagus, seperti Notepad ++.

masukkan deskripsi gambar di sini

Menghapus semua \\dari akhir baris komentar menyelesaikan masalah Anda.

Catatan: Untuk info lebih lanjut, lihat /programming//a/30290133/5296568 . Garis miring terbalik pada akhir baris sebenarnya berguna ketika digunakan dalam definisi makro multi-baris.


1
Saya terkejut kode stabilo di sini tidak menangkap itu.
WernerCD

2
@WernerCD Markup kode pertukaran Exchange mencoba untuk mendeteksi dengan cerdas bahasa apa yang sedang digunakan dalam blok kode, tetapi kadang-kadang gagal untuk melakukannya dan berpikir itu bukan sesuatu. Anda dapat memperbaikinya dengan menentukan <! - bahasa: masukkan-lang-sini -> sebelum cuplikan.
Nzall

1
@Nall, lihat komentar NickGammon di atas; bahkan stabilo sintaksis StackOverflow, ketika dimasukkan ke dalam mode C / C ++ (dengan menambahkan tag C ++), tidak menyorotnya dengan benar.
Maximilian Gerhardt

Mengapa itu bekerja? Tidakkah seharusnya \ demask pertama dan karenanya tidak mengomentari baris baru?
Nova

Saya tidak mengetahui bahwa \ dalam komentar dapat keluar dari karakter berikutnya seolah-olah `\` ditempatkan dalam string karakter.
Maximilian Gerhardt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.