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

标签: CSerialPort 串口 VS2010 线程
992人阅读 评论(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类析构,从而真正结束程序并释放资源。

查看评论

对Run-Time Check Failure #3 - The variable 'a' is being used without being initialized.的处理以及理解

对于这个问题,我们先来看一个简单的C程序:#include void Fun1() { int a = 48; }void Fun2() { int a; printf("%d...
  • qq_29894329
  • qq_29894329
  • 2016-04-18 23:58:32
  • 2219

Run-Time Check Failure #3 - The variable 'side' is being used without being defined.

Q:编译通过了 但是运行时弹出以对话框上面是Run-Time Check Failure #3 - The variable 'side' is being used without being de...
  • kinghzking
  • kinghzking
  • 2010-12-22 10:29:00
  • 3306

VS2010下使用SerialPort类出现The variable 'comstat' is being used without being initialized

http://blog.csdn.net/stephen1315/article/details/7457294 方案1: 改变项目配置属性 一种解决方案是改变基本运行时检...
  • zbyzhlsp2
  • zbyzhlsp2
  • 2013-08-09 19:47:05
  • 1592

Effective C++笔记之一:声明、定义、初始化与赋值

一.声明(Declaration)       声明的作用是指定变量的类型和名称,makes a name known to the program。区分声明和定义可以让C++支持分开编译,比如A.c...
  • caoshangpa
  • caoshangpa
  • 2018-03-03 16:27:05
  • 72

Run-Time check failure #3 : 报未初始化警告的解决办法。

经常在编译后报某些变量没有初始化的警告,解决办法就是初始化这些变量,但遇到自定义的结构体报这个警告,初始化自定义结构体的办法如下:        struct A {               ...
  • phenixyf
  • phenixyf
  • 2015-10-22 15:15:47
  • 4206

The variable 'str' is being used without being defined 问题

在c中对char 型 数据操作时会出现如下的错误:Run-Time Check Failure #3 - The variable str is being used without being de...
  • grtwall
  • grtwall
  • 2009-03-10 16:03:00
  • 2850

Run-Time Check Failure #2

Run-Time   Check   Failure   #2   一般是栈被破坏,代码可能有缓冲区溢出一类的问题。 Run-Time Check Failure #2 - Stack a...
  • changbaolong
  • changbaolong
  • 2013-11-20 21:58:40
  • 1818

the variable 'low' is being used without being initialized

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

Run-Time Check Failure #0 错误

使用VS,遇到过一个错误,如下图:文字描述是这样的: Run-Time Check Failure #0 - The value of ESP was not properly saved acr...
  • foruok
  • foruok
  • 2016-04-01 17:28:49
  • 4581

cv::mat to IplImage

这个问题竟然搞了好久好久。 she
  • tjusxh
  • tjusxh
  • 2014-10-27 16:51:28
  • 683
    个人资料
    等级:
    访问量: 2万+
    积分: 337
    排名: 23万+
    最新评论