2012-05-06 2 views
1

아래 프로그램은 입력이 암호와 같은지 테스트하기 위해 키패드와 arduino를 사용합니다. '#'을 누를 때마다 입력을 검사 한 다음 입력을 저장하는 변수가 빈 문자열 (char 입력 [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); 
} 
+0

나는이 줄을 좋아한다. 'const byte COLS = 4; // 세 개의 컬럼' –

답변

0

동일한 변수가 아닙니다. 상단 블록에 input이 있고 loop 함수가 있습니다.

0

이 줄

char input[257] = ""; 

입력라는 새로운 지역 변수를 만들지 만, 당신은 그렇게 돼요.

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

변경

char input[257] = ""; 

당신은 스택에서 새로운 변수를 잃고 대신 이전에 선언 된 글로벌 하나를 사용 해달라고 그래서

memset(input,0,257); 

에 : 당신은 이미 여기에 세계를 만들어 .

+0

'input = ""; '은 올바른 방향의 한 걸음이지만 작동하지 않습니다. C에서 배열을 할당 할 수 없습니다. –

+0

그건 작동하지 않습니다. 그런 배열을 할당 할 수 없습니다. –

+0

C에서 문자열을 싫어합니다. – Justin

0

두 번째 char input[257] = "";input이라는 새 변수를 선언합니다. input이라는 기존 변수의 내용은 변경되지 않습니다. 대신 memset()을 사용하십시오.

0

는 다시

char input[257] = ""; 

변수 입력을 선언에 오류에 동의하지만,이 빠르며 필요로하지 않기 때문에 내가 memset 함수()하지만

input[0]='\0'; 

을하고 그것을 해결할 수없는 것 코드에 memset() 함수를 포함시킵니다. 우리는 마이크로 컨트롤러, cpu 및 메모리에 대해 이야기하고 있으며 소중하며 신속하고 가벼운 코드를 작성하는 것이 좋은 습관입니다. 여기

0

, 나는이 달성 할 수있는 방법 : 공식 아두 이노의 웹 사이트에

이동을 다운로드 Keypad.hhttp://playground.arduino.cc/Code/Keypad#Download (CTRL + F를 입력 : 다운로드) C에 넣어 라이브러리를 다운로드 : \ 프로그램 파일 (x86) \ Arduino \ libraries 현재 Arduino 화면을 닫은 다음 화면을 다시여십시오. 코드를 다시 작성하고 코드를 먼저 작성하십시오. 나는이 방법으로 오케이.

#include <Keypad.h> 
관련 문제