【问题标题】:variables value unexpectedly changes?变量值意外变化?
【发布时间】:2012-05-06 18:02:02
【问题描述】:

下面的程序使用键盘和 arduino 来测试输入是否等于密码。每当按下“#”时,都会检查输入,然后存储输入的变量将重置为空字符串(char input[257] = "")。然后程序循环回到 void loop() 代码块的开头。当我的程序循环回到“void loop()”代码块的开头时,我遇到了问题。当我将输入重置为空字符串时,输入将重置为空字符串。但是,当程序循环时,输入的值会更改为之前的值。因此,如果我最初输入“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);
}

【问题讨论】:

  • 我喜欢这条线...const byte COLS = 4; //three columns

标签: c arduino microcontroller


【解决方案1】:

不是同一个变量。您的顶部块中有一个 input,而您的 loop 函数中有另一个。

【讨论】:

    【解决方案2】:

    这一行

    char input[257] = "";
    

    创建一个名为 input 的新局部变量,但您不希望这样。你已经在这里做了一个全球性的:

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

    改变

        char input[257] = "";
    

        memset(input,0,257);
    

    因此,您不会从堆栈中丢失新变量,而是使用您之前声明的全局变量。

    【讨论】:

    • input = ""; 是朝着正确方向迈出的一步,但它不起作用。您不能在 C 中分配数组。
    【解决方案3】:

    第二个char input[257] = ""; 声明了一个名为input 的新变量。它不会更改名为input 的现有变量的内容。请改用memset()

    【讨论】:

      【解决方案4】:

      我同意再次声明输入变量的错误

      char input[257] = "";
      

      但我不会用 memset() 解决它,而是这样做

      input[0]='\0';
      

      因为这样更快,并且不需要在代码中包含 memset() 函数。我们说的是微控制器,cpu和内存是宝贵的,编写快速轻量级代码是一个好习惯。

      【讨论】:

        【解决方案5】:

        在这里,我怎么能做到这一点:

        去Arduino官方网站下载Keypad.h http://playground.arduino.cc/Code/Keypad#Download (ctrl+f and type: download) 下载库放到C:\Program Files (x86)\ Arduino\libraries 关闭当前的 Arduino 屏幕,然后重新打开屏幕。重写你的代码,把代码放在第一位。我很喜欢这种方法。

        #include <Keypad.h>
        

        【讨论】:

          猜你喜欢
          • 2017-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-05
          • 1970-01-01
          • 2021-10-17
          • 2013-11-27
          相关资源
          最近更新 更多