Почему этот пример работает только с точкой останова - PullRequest
0 голосов
/ 10 января 2019

Я создаю базовое консольное приложение на C / C ++.

В следующем примере я несколько раз записываю какой-то символ в консоль с задержкой 50 мс и хочу, чтобы он выходил из программы при нажатии клавиши.

#include "pch.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>

int PauseRet(int iDuree) {
    unsigned int uiTemps = GetTickCount();
    int iVal = 0;
    do {
        if (_kbhit()) {
            iVal = _getch();
        }

    } while ((GetTickCount() - uiTemps) < (unsigned int)iDuree);

    return iVal;
}

int main()
{
    char c = 0;
    int iTempo = 50;
    while (true) {


        putchar('a');

        c = PauseRet(iTempo);


        if (c) {

            return 0;
        }

    }
}

Моя проблема в том, что в моем проекте он переходит в состояние if(c){... только когда я ставлю точку останова здесь:

    if (_kbhit()) {
        <BREAKPOINT> iVal = _getch();
    }

Я использую Visual Studio 2017.

Я пробовал этот код на другом ПК в новом проекте, и у меня не было никаких проблем

Мне кажется, это как-то связано с настройками моего проекта.

1 Ответ

0 голосов
/ 10 января 2019

Возможно, вы столкнулись с небольшой ошибкой с _getch(). В SDK 10.0.17134.0 ошибка в том, что _getch() вернет нажатую клавишу, а при следующем вызове вернет 0.

Без точек останова, _kbhit может возвращать true более одного раза, что поместит 0 в c и ваш if(c) никогда не пройдет.
Что касается точек останова, то после того, как вы нажали клавишу, она остановится на этом, клавиша впоследствии будет отпущена во времени, и как только вы продолжите с точки останова, _getch() вернет нажатую клавишу, и _kbhit больше не будет верните истину. После выхода из цикла у вас будет ненулевое значение в c.

Чтобы это исправить, обновите свой SDK, снова запустив установку VS 2017 и обновив (или понизив до чего-то до обновления в апреле) и / или загрузив более новый SDK или используйте _getwch()

Соответствующий отчет об ошибках MS Dev Community . (Фиксированный)

...