关闭

Run-Time Check Failure #3 - The variable 'comstat' is being used without being initialized

标签: CSerialPort串口VS2010线程
938人阅读 评论(0) 收藏 举报
分类:

方案1: 改变项目配置属性


一种解决方案是改变基本运行时检查(changing the runtime checks in project settings):在菜单Project->Project properties-> C/C++ -> Code generation-> Basic Runtime checks --> change to 'Default',在中文版中是:项目-〉属性-〉配置属性-〉C/C++代码生成-〉基本运行时检查-〉设置为默认,当将基本运行时检查改为默认之后,编译自然顺利通过了,向串口调试助手发送消息正常了,再从串口调试助手向SerialPortTest发送消息时,也正常了。


方案2:改变comstat变量属性


另一种解决方案是将CSerialPort.CPP中的COMSTAT comstat;改为static COMSTAT comstat;这样改了之后,debug顺利通过,然后调试,与串口调试助手相互发消息都OK了。为什么这样就能解决呢?其实当你使用debug解决方案时,它的基本运行时检查初始设置为:两者(/RTC1,等同于 /RTCsu),这个两者是指:堆栈帧(/RTCs),未初始化的变量(/RTCu)。由于它要检查未初始化的变量,所以将SerialPort.cpp中的COMSTAT comstat;改为static COMSTAT comstat;就可以正常使用CSerialPort类了。
以上是在debug下的解决方案,当在Release编译状态时,你会发现并不需要将COMSTAT comstat;改为static COMSTAT comstat;就能编译成功并且发送接收消息正常。其实,在Release下,它的基本运行时检查初始设置已为默认。这应该也算是第一种解决方案之内。
而当你将它设置为两者(/RTC1,等同于 /RTCsu)时,不论是否将COMSTAT comstat;改为static COMSTAT comstat;,编译都不能通过,报错““cl.exe”返回的结果有误。",这个应该是属于Release的问题了,另当别论了。

方案3:

添加代码:memset(&comstat, 0, sizeof(COMSTAT)); //VC6不用这句也可以用,2008就要加.

**************************************************************以上是拿到VS2010中编译出现的问题**********************************

在后续又发现了这样一个问题:如下

对于该类中提供的StopMonitoring函数只能挂起线程,没办法结束线程,而当用户打开端口后需要关闭端口,或者结束程序,那么就会导致线程无法结束,窗口销毁后进程驻留在内存中,一直停在该类的析构函数处,如下:

CSerialPort::~CSerialPort()
{
do
{
SetEvent(m_hShutdownEvent);
} while (m_bThreadAlive);
TRACE("Thread ended\n");
delete [] m_szWriteBuffer;
}

解决方法是:设置m_hShutdownEvent为有信号状态,然后线程中的WaitForMultipleObjects()函数将会捕获到信号,返回事件编号,执行线程内部的AfxEndThread(100);来结束线程,并将m_bThreadAlive赋值为FALSE,以让CSerialPort类析构,从而真正结束程序并释放资源。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Docker学习系列(三):Ubuntu下使用Docker的基本指令记录及一些注意事项

ubuntu下使用docker的基本指令记录
  • tina_ttl
  • tina_ttl
  • 2016-05-15 15:38
  • 6750

ubutn 16.04 编译openJdk7及问题解决方法

1、下载并安装依赖软件: 安装gcc、g++、make等sudo apt-get install build-essential 安装ant 1.7以上sudo apt-get install a...
  • ShallowDreams
  • ShallowDreams
  • 2016-10-06 10:56
  • 1214

GeoMesa-Accumulo安装并运行示例

参考官网 http://www.geomesa.org/documentation/tutorials/geomesa-quickstart-accumulo.html安装geomesagit cl...
  • qiaojialin
  • qiaojialin
  • 2017-03-06 10:50
  • 1232

Run_time CHeck Failure---THe variable ‘src-Img’ is being used without being initialized

今天在vs2008+opencv调试的时候出现这种错误。出现这种错误的意识是程序中有变量未进行初始化,比如 原始代码的定义:IplImage* outImage; 正确的应该初始化为IplImag...
  • muzhiai
  • muzhiai
  • 2013-04-14 10:19
  • 493

the variable 'low' is being used without being initialized

IplImage *img_1; //定义一个图像指针,用来存放视频下一帧 IplImage *img; IplImage *nomalizeimage; ...
  • guanqinchu
  • guanqinchu
  • 2013-07-24 22:53
  • 1010

Run-Time Check Failure #2 - Stack around the variable 'var' was corrupted

摘要:简介VC++.NET编译新功能,运行时错误检查,编译选项 (/RTC1, equiv. to /RTCsu) 最近把一个别人早期在VC 6下编写的一个服务移植到VC 7.1 (.NET 200...
  • gaofeidongdong
  • gaofeidongdong
  • 2012-08-07 17:52
  • 815

Run-Time Check Failure #2搜索 - Stack around the variable 'buff' was corrupted.

这种情况一般是由内存访问越界造成的,比如数组越界,memset,memcpy,等内存操作函数。 此处的size是一个variable,即,变量,下面将出错的代码贴出 // 将文件读入内存,返回内存...
  • liangjisheng
  • liangjisheng
  • 2017-07-06 14:14
  • 194

【转】SerialPort收数据时出现的BUGcomstat is being used without defining

【来自】http://hi.baidu.com/qiuzhongqun/blog/item/fc755d8185ff56d7bd3e1eaa.html很是郁闷搞了一中午以为是自己的程序写的有问题。 报...
  • madison_wang
  • madison_wang
  • 2011-04-19 14:04
  • 258

SerialPort comstat is being used without defining

Run-Time Check Failure #3 - The variable 'comstat' is being used without being initialized. 参考:http...
  • ljz9425
  • ljz9425
  • 2011-11-23 01:07
  • 810

Run-Time Check Failure #0 错误小结

1. 前言今天在 mfc 程序框架中 加入了 C++11 的thread 线程, 将他生成之后, 就直接detach了, 结果关闭程序的时候出现了问题: 2. 处理方案网上也搜索了一些解决方案:...
  • zhyh1435589631
  • zhyh1435589631
  • 2016-10-13 15:59
  • 1658
    个人资料
    • 访问:20872次
    • 积分:319
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:13篇
    • 译文:0篇
    • 评论:7条
    最新评论