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_Debounce154 행의 두 번째 IF 문의 변수 가 범위 내에서 선언되지 않았 음을 확신합니다 . 문제의 변수가 정의되고 초기화 된 전역이기 때문에 이것이 어떻게 가능한지 이해하지 못합니다.

IF 문의 첫 번째 트리오 (처리 버튼 1)를 주석 처리하면 두 번째 트리오 (처리 버튼 2)는 정확히 동일한 방식으로 컴파일해도 문제가 없습니다.

맞춤법, 중괄호, 세미콜론, 한 번에 하나씩 주석 처리 된 코드 블록까지 모든 일반적인 용의자를 확인했지만 문제의 원인을 찾을 수 없습니다. Arduino 1.8.2 IDE를 사용하고 있습니다.

누군가 내가 누락 된 실수를 지적 할 수 있습니까?


1
구문 강조 표시로 문제가 더 분명해 지지만 불행히도 그렇지 않은지 확인하기 위해 C ++ 태그로 질문에 태그를 지정했습니다.
Nick Gammon

답변:


28

귀하의 의견에 백 슬래시가 문제입니다. C ++ 언어 정의 \에 따라 줄 끝의 a는 "줄 연속"으로 해석됩니다. 따라서 다음 줄에서 주석이 계속되고 변수 선언 및 초기화가 주석 처리됩니다.

이것은 메모장 ++과 같은 좋은 구문 강조 프로그램으로 코드를 열 때 분명합니다.

여기에 이미지 설명을 입력하십시오

\\주석 행의 끝에서 모두 제거하면 문제가 해결됩니다.

참고 : 자세한 내용은 /programming//a/30290133/5296568참조하십시오 . 줄 끝에있는 백 슬래시는 실제로 여러 줄 매크로 정의에 사용될 때 유용합니다.


1
여기 코드 하이 라이터가 그것을 잡지 못하는 것에 놀랐습니다.
WernerCD

2
@WernerCD Stack Exchange 코드 마크 업은 코드 블록에서 사용되는 언어를 지능적으로 감지하려고 시도하지만 때로는 그렇게하지 않고 그렇지 않은 것으로 생각합니다. 스 니펫 앞에 <!-language : insert-lang-here->를 지정하여 문제를 해결할 수 있습니다.
Nzall

1
@Nzall 위의 NickGammon 주석을 참조하십시오. C / C ++ 모드 (C ++ 태그 추가)로 전환하면 StackOverflow 구문 강조 표시조차 제대로 강조 표시되지 않습니다.
막시밀리안 게르 하트

왜 그렇게 작동합니까? 첫 번째 \ 두 번째를 마스크 해제하여 새 줄을 주석 처리해서는 안됩니까?
Nova

`\`가 문자열에있는 것처럼 다음 문자를 이스케이프 할 수있는 주석에서 \를 인식하지 못합니다.
Maximilian Gerhardt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.