1

以下のプログラムは、キーパッドと arduino を使用して、入力がパスワードと等しいかどうかをテストします。「#」が押されるたびに、入力がチェックされ、入力を格納する変数が空の文字列にリセットされます (char input[257] = "")。その後、プログラムは void loop() コード ブロックの先頭にループ バックします。プログラムが "void loop()" コード ブロックの先頭にループバックするときに問題が発生します。入力を空の文字列にリセットすると、入力は空の文字列にリセットされます。ただし、プログラムがループすると、input の値は以前の値に変更されます。したがって、最初に「123abc」と入力して「#」を押すと、プログラムは入力が正しくないことを通知し、変数を空の文字列にリセットします。しかし、プログラムがループすると、空の文字列を格納する変数は "123abc" に戻されます。何が起こっていますか?変数が空の文字列のままにならないのはなぜですか?

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {9, 8, 7, 6}; //connect to the column pinouts of the keypad
char password[9] = "3994A", input[257]="";
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int x;
void setup(){
  Serial.begin(9600);
}

void loop(){
  x = 0;
  Serial.println(input);
  while (1)
  {
    char key = keypad.getKey();
    if (key)
    {
    if (key == '#')
    {
      break;
    }
    input[x] = key;
    x+=1;
    }
  }
  if (strcmp(password,input) == 0)
  {Serial.println("Access Granted");
  }
  else
  {Serial.println("Access Denied");
  }
  char input[257] = "";
  Serial.println(input);
}
4

5 に答える 5

0

2番目char input[257] = "";は、という名前の新しい変数を宣言しますinput。。という名前の既存の変数の内容は変更されませんinputmemset()代わりに使用してください。

于 2012-05-06T18:14:43.143 に答える
0

同じ変数ではありません。input一番上のブロックに1つ、loop関数にもう1つあります。

于 2012-05-06T18:13:44.603 に答える
0

この行

char input[257] = "";

入力と呼ばれる新しいローカル変数を作成しますが、それは必要ありません。あなたはすでにここでグローバルなものを作っています:

char password[9] = "3994A", input[257]="";

変化する

    char input[257] = "";

    memset(input,0,257);

したがって、スタックから新しい変数を失うことはなく、代わりに以前に宣言したグローバル変数を使用します。

于 2012-05-06T18:13:54.433 に答える
0

入力変数を再度宣言する際のエラーに同意します

char input[257] = "";

しかし、私は memset() で解決しませんが、

input[0]='\0';

これは高速であり、コードに memset() 関数を含める必要がないためです。私たちはマイクロコントローラについて話しています.CPUとメモリは貴重であり、高速で軽いコードを書くのは良い習慣です.

于 2012-09-13T23:01:47.300 に答える
0

ここで、どうすればこれを達成できますか:

公式の Arduino Web サイトにアクセスします Keypad.hをダウンロードします http://playground.arduino.cc/Code/Keypad#Download (ctrl+f とタイプ: ダウンロード) C:\Program Files (x86)\Arduinoに配置するライブラリをダウンロードします\libraries現在の Arduino 画面を閉じてから、画面を再度開きます。コードを書き直して、コードを最初に置きます。私はこの方法でOKです。

#include <Keypad.h>
于 2013-11-29T17:09:43.127 に答える