Странное поведение с параметрами функции и getch()

Я столкнулся с каким-то странным поведением при вызове функций с параметрами, содержащими getch().

Возьмем, к примеру, следующий код:

_Bool IsKeyDown(char c)
{
    if(!kbhit())
        return 0;
    char ch1 = getch();

    printf("%c\n", c);

    return 0;
}

/*
 * 
 */
int main(int argc, char** argv) {
    while(1)
    {
        IsKeyDown('a');
        IsKeyDown('b');
        Sleep(100);
    }
    return (EXIT_SUCCESS);
}

Когда клавиша нажимается с этим кодом, несмотря ни на что, она всегда будет печатать 'a', который является параметром первой функции. Проблема в том, что «a» не является параметром второй вызываемой функции, но «a» по-прежнему печатается вместо «b». Почему это происходит?


person NAME__    schedule 17.01.2014    source источник
comment
Это не ответ, а вопросы: почему вы сохраняете значение в ch, а затем никогда не используете это значение? Почему вы делаете возвращаемое значение вашей функции _Bool, но всегда возвращаете одно и то же. Почему вы не используете возвращаемое значение в вызывающем объекте? Я хотел бы убедиться, что логика верна, прежде чем вы зададите такой подробный вопрос о коде.   -  person Brandin    schedule 17.01.2014
comment
Вероятно, вы хотели напечатать «ch1», а не «c».   -  person kusma    schedule 17.01.2014


Ответы (1)


Подумайте об этом: что делает ваша программа? Вы нажимаете символ на клавиатуре. Когда main завершает сон, он вызывает функцию с «a». Поскольку kbhit истинно, будет напечатано «a». Затем немедленно снова вызывает IsKeyDown(). Поскольку kbhit теперь имеет значение false, он возвращает ничего не печатая. Затем main снова засыпает, и все начинается сначала.

Чтобы проверить это, измените IsKeyDown, чтобы он возвращал 1, если он получает символ. Затем в main проверьте возвращаемое значение, чтобы увидеть, что происходит.

person Chris J. Kiick    schedule 17.01.2014