首页 > 其他 > 详细

QT编写上位机程序一定要初始化变量以及谨慎操作指针(附:多个".c"文件包含一个".h"文件处理方法)

时间:2015-12-18 21:14:47      阅读:719      评论:0      收藏:0      [点我收藏+]

背景:

  在编写QT上位机界面时,界面在运行的时候经常出现卡死或者直接挂掉的怪现象。

正文:

  上位机有个函数为check_receive();该函数的作用为定时调用循环检测USB是否有数据。若有,则将信息打印到界面窗体上。界面上有两个QTableWidget窗体

"ui->can1tableWidget与ui->can2tableWidget",根据传上来的的数据某个字节信息为1、或2来打印到对应的窗体上。代码如下:

QTableWidget *canselWidget = NULL;
unsigned int CANSelCnt;

if(CANData.CANSel == 1)
{
    CANSelCnt = 第1个窗体显示的行数;    //伪代码
    canselWidget = ui->can1tableWidget ;
}
else if(CANData.CANSel == 2)
{
    CANSelCnt = 第2个窗体显示的行数;    //伪代码 
    canselWidget = ui->can2tableWidget ; 
} 
//接着即使用canselWidget来对界面进行操作。

接着,总会出现,QT上位机界面直接卡死甚至挂掉的问题。观察现象发现,APP在显示数据窗体时即疯狂地新增新的行数。再研究代码,然后将CANSelCnt打印出来,发现其值为一个很大的随机值。

解决方案:CANSelCnt 在定义的时候要初始化!!!

接着运行上位机发现,APP显示数据窗体不再疯狂的新增行数了。可还是出现挂掉的现象!!
进一步调试才发现若是CANData.CANSel的值不是为1、2那会出现什么情况! 就会对canselWideget这个NULL指针进行操作!更改代码如下:

switch(CANData.CANSel)
{
    case 1:
        CANSelCnt = 第1个窗体显示的行数;    //伪代码
        canselWidget = ui->can1tableWidget ;
         break;
    case 2:
        CANSelCnt = 第2个窗体显示的行数;    //伪代码 
        canselWidget = ui->can2tableWidget ; 
        break;
    default:
        // 防止后续代码对空指针进行操作,直接返回。
        return;
}

 

总结:

1、此处代码写的非常不小心,犯如此低级的错误却花费了1天多的时间(还以为是下位机没配置好!)!下次一定要把握住程序运行的每个通路,杜绝此现象再次发生。

 

2、由于之前一直在写下位机代码,所以不赋初值的习惯也带入到这里,出了这次惨痛教训!

 

附:

  在下位机,为何会经常出现不赋初值的情况发生。(应该说是在声明的时候不会赋初值。)

 

  通常会出现在多个".c"文件包含一个".h"文件的情况下,若在".h"文件中赋初值,则相当于在其内即声明又定义了,那么编译时,即会出现如下报错:

keil *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS (报错信息不完整,只挑了重点部分)

所以说,有多个".c"文件需要包含该".h"文件时,不能进行进行变量的定义,只能进行声明!然后在"main函数"内对其进行初始化操作。

否则会出现以上错误,即重复定义!

 

还有一种对全局变量处理既是:在主要使用该全局变量的".c"文件定义它,其他.c文件若需使用,则用"extern"关键字来声明。

 

记录地点:深圳WZ

记录时间: 2015年12月18日 18:55:57

QT编写上位机程序一定要初始化变量以及谨慎操作指针(附:多个".c"文件包含一个".h"文件处理方法)

原文:http://www.cnblogs.com/ChYQ/p/5058028.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!