函数执行期间的未定义行为

问题描述

我正在使用Win32 API用C ++编写软件,但是在线程中运行的以下函数提出了一个奇怪的问题,我不知道其来源。

功能将用于校准光传感器,它的作用是:

  • 以5%的幅度将调光从0%增加到100%;

  • 它比较传感器的最大和最小范围(在main.h中定义);

  • 读取的最小值和最大值存储在get_lux_highget_lux_low中;

  • 最后,这些值将在软件窗口中更新。

在软件执行期间,DIM显示为(0,48,49,50,51,51 ...)。在调试软件期间,我注意到count_dim变量正在以下行中更新:

wsprintfW (wbuf_readhigh,L"%d",get_lux_high);

当我注释掉上述命令时,该软件可以按5%的步数计算DİM。我还注意到,如果将static int keep_low的声明更改为int keep_low,它也会更正假定的“错误”。

我的问题是,为什么或什么原因导致软件出现此问题?我以前从未见过这样的东西。直到几天前,该软件还可以完美运行。昨天我只是在软件中添加了其他新功能,然后出现了这个问题。请注意,此函数没有应用全局变量

我正在使用CODE :: Blocks v17.02来编译软件。

DWORD WINAPI ThreadCalibrate (LPVOID lpParam)   //THREAD USED FOR CALIBRATE THE SENSOR
{
    unsigned int get_lux_high = 0;
    unsigned int get_lux_low  = 0;
    unsigned int count_dim =0;

    wchar_t wbuf_readhigh [2];
    wchar_t wbuf_readlow  [2];
    wchar_t wbuf_getdim   [2];

    static int keep_low  = Max_SensorRange;    //Static Int variable to hold the lower value
    static int keep_high = Min_SensorRange;    //Static Int variable to hold the higher value

    SetwindowTextW(hcalibrate_status,L"%  CALIBrating");
    for (count_dim; count_dim <= 100; count_dim +=5)
    {
        Register_Write(EQP_DIM_CONTROL,(int) count_dim,0x00);
        Sleep(250);

        if (USB_Read(1) < keep_low)   //Compare if USB_Read is lower than keep_low
        {
            keep_low = USB_Read(1);   //Update keep_low
            get_lux_low = keep_low;
        }

        if (USB_Read(1) > keep_high)  //Compare if USB_Read is lower than keep_high
        {
            keep_high = USB_Read(1);  //Update keep_high
            get_lux_high = keep_high;
        }
        wsprintfW( wbuf_readhigh,get_lux_high);
        SetwindowTextW(hMax_value,wbuf_readhigh);

        wsprintfW( wbuf_readlow,get_lux_low);
        SetwindowTextW(hMin_value,wbuf_readlow);

        wsprintfW( wbuf_getdim,L"%ld",count_dim);
        SetwindowTextW( hCal,wbuf_getdim );
    }
    SetwindowTextW(hcalibrate_status,L"FINISHED" );    //display Text
    SetwindowTextW( hCal,L" " );
    return 0;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)