为什么这个例子只能与断点一起使用

时间:2019-01-10 01:57:16

标签: c++ c visual-studio kbhit

我正在用C / C ++创建一个基本的控制台应用程序。

在下面的示例中,我反复将一些char延迟50ms写入控制台,我希望它在敲键时退出程序。

func add(a: Int, b: Int) -> Int {
    return a + b
}

func mult(a: Double, b: Double) -> Double {
    return a * b
}

var functions = [Any]()
var inputs = [[Any]]()

let f: ([Any]) -> Any = { arr in
    return add(a: arr[0] as! Int, b: arr[1] as! Int) as Any
}

functions.append(f)
inputs.append([3, 5])

let g: ([Any]) -> Any = { arr in
    return mult(a: arr[0] as! Double, b: arr[1] as! Double) as Any
}

functions.append(g)
inputs.append([6.0, 7.0])

// Each time through the loop, get one function stored as Any and
// one array of inputs with type [Any]
for (function, input) in zip(functions, inputs) {
    // Downcast function from Any to ([Any]) -> Any
    let f = function as! ([Any]) -> Any

    // Call the function
    print(f(input))
}

我的问题是,在我的项目中,只有当我在此处放置断点时,它才会进入条件8 42.0

#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;
        }

    }
}

我正在使用Visual Studio 2017。

我在新项目的另一台PC上尝试过此代码,但没有任何问题

我相信这与我的项目设置有关。

1 个答案:

答案 0 :(得分:2)

您可能会遇到#define _MAX_PATH 260 /* max. length of full pathname */ #define HANDLE int #define MAX_PATH 260 #define TRUE true #define FALSE false #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) typedef int BOOL; typedef unsigned long DWORD; typedef void VOID; typedef wchar_t WCHAR; typedef WCHAR *LPWSTR; typedef unsigned char BOOLEAN; 的小错误。在SDK _getch()上,错误是10.0.17134.0将返回所按下的键,而在下一次调用时返回0。

没有断点,_getch()可能会返回true一次以上,这会将0放入_kbhit中,而您的c将永远不会过去。
使用断点时,一旦按下该键,它将在此处停止,随后将及时释放该键,一旦您从断点继续,if(c)将返回所按下的键,而{{1} }将不再返回true。循环退出后,您在_getch()中将具有一个非零值。

要解决此问题,请再次运行VS 2017设置并更新(或在4月更新之前降级到某些版本)和/或下载较新的SDK或使用_kbhit

来更新SDK。

Relevant MS Dev Community bug report。 (固定)