2014-01-17 9 views
0

getch()를 사용하는 기능을 사용하여 키 검사를 반복하는 데 문제가 있습니다. 문제가 발생하는 이유를getch()를 반복 키 검사 할 때의 문제

static char g_keybuffer[256]; 
_Bool IsKeyDown(char c) 
{ 
    char ch; 
    if(kbhit()) 
     ch = getch(); 

    if(ch == -32 || ch == 224) 
    { 
     ch = getch(); 
    } 

    g_keybuffer[ch] = 1; 
    if(g_keybuffer[c] == 1) 
    { 
     g_keybuffer[c] = 0; 
     return 1; 
    } 

    return 0; 
} 

/* 
* 
*/ 
int main(int argc, char** argv) { 
    while(1) 
    { 
     if(IsKeyDown('a')) 
     { 
      printf("Test\n"); 
     } 
     if(IsKeyDown('a')) 
     { 
      printf("Hello\n"); 
     } 
     else if(IsKeyDown('b')) 
     { 
      printf("World\n"); 
     } 
     Sleep(100); 
    } 
    return (EXIT_SUCCESS); 
} 

내가 아는 : 여기

은 코드 예입니다. 키를 누르면 kbhit가 루프마다 한 번 true가되고 ch를 버퍼에서 검색 한 문자로 설정합니다. IsKeyDown이 사용되면 매개 변수와 같으면 버퍼 g_keybuffer의 키가 0으로 설정되어 키가 무한히 "다운"되는 것을 방지합니다. 이 문제는 동일한 키가 두 번 이상 있는지 확인하려는 경우 IsKeyDown의 첫 번째 인스턴스 만 실행되고 키의 g_keybuffer가 0이되어 나머지는 유효하지 않습니다.

누구든지 IsKeyDown 루핑 당 동일한 키를 여러 번 검사 할 수있는 능력을 줄 수있는 방법을 알고 있습니까? 나는 붙어있다.

+0

당신은'cin.ignore()'을 시도 했습니까? – theharshest

+1

나는 당신의 코드를 너무 자세히 보지 않았지만,'kbhit'가 false를 반환 할 때'ch'가 초기화되지 않았다는 것을 알아야한다. 그게 당신의 기능을 엉망이 될 것입니다 – tay10r

+1

@theharshest 이것은'C++ '가 아닙니다 – tay10r

답변

0

0으로 설정했기 때문에 문제가되는 것은 키 상태에 대한 공격이 발생한 후입니다. 나는 같은 결과를 두 번 얻는 것을 피하기 위해이 작업을 수행 한 것으로 추측합니다. 그러나 이는 단지 일시적인 해결책 일뿐입니다. 원하는 작업을 수행하는 유일한 방법은 키보드 상태를 캡처하기 위해 실제로 만들어진 라이브러리를 선택하는 것입니다.

대부분의 그래픽 라이브러리에는 키보드 상태를 캡처하는 기능이 있습니다. 작은 프로그램을 작성하는 중이라면 약간의 오버 헤드를 포함하지 않는다고 생각되는 솔루션을 모르겠습니다.