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行目の2番目のIFステートメントの変数がスコープ内で宣言されていないと確信しています。問題の変数は定義済みで初期化されたグローバルであるため、これがどのように可能かはわかりません。

IFステートメントの最初のトリオ(ボタン1を処理)をコメントアウトすると、2番目のトリオ(ボタン2を処理)は、まったく同じ方法でまったく同じことを行いますが、コンパイルに問題はありません。

スペル、ブレース、セミコロン、コメントアウトされたコードのブロックなど、通常の容疑者をすべてチェックしましたが、問題の原因は見つかりません。Arduino 1.8.2 IDEを使用しています。

誰かが私が見逃している間違いを指摘してもらえますか?


1
質問をC ++タグでタグ付けして、構文の強調表示によって問題がより明白になるかどうかを確認しましたが、残念ながらそうではありません。
ニックギャモン

回答:


28

コメントのバックスラッシュが問題です。C ++言語の定義に従って\、行末のaは「行の継続」として解釈されます。したがって、コメントは次の行に続き、変数の宣言と初期化はコメント化されます。

これは、Notepad ++のような適切な構文強調プログラムでコードを開くと明らかです。

ここに画像の説明を入力してください

\\コメント行の最後からすべて削除すると、問題が解決します。

サイドノート:詳細については、https://stackoverflow.com/a/30290133/5296568をご覧ください。複数行のマクロ定義で使用する場合、行末のバックスラッシュは実際に役立ちます。


1
ここのコードハイライターがそれをキャッチしないことに驚いています。
WernerCD

2
@WernerCD Stack Exchangeのコードマークアップは、コードブロックで使用されている言語をインテリジェントに検出しようとしますが、それができない場合があり、そうではないと考えます。スニペットの前に<!-language:insert-lang-here->を指定することで修正できます。
Nzall

1
@Nzallは、上記のNickGammonのコメントを参照してください。StackOverflowシンタックスハイライターでさえ、C / C ++モードに(C ++タグを追加して)配置すると、正しくハイライトされません。
マクシミリアンゲルハルト

なぜそれでもうまくいくのですか?最初の\で2番目のマスクを解除して、新しい行をコメントアウトしないでください。
ノヴァ

コメント内の\が次の文字をエスケープできることを、「\」が文字列に配置されているように認識していません。
マクシミリアンゲルハルト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.