Q_CHECK_PTR and “fscanf float or double”
来源:互联网 发布:战地1淘宝代购 编辑:程序博客网 时间:2024/04/30 07:11
在机房做实验,同学发短信过来问,段错误一般如何调试。这个问题有点问大了,我认为造成端错误一般都是指针问题,而且绝大多数情况为使用未初始化的指针,这并不是说使用值为NULL的指针,下面我遇到的就可以说明这点,其实大家都知道,只不过要知行合一,那还得有一番修炼才行。
中午回去后,调试发现如下出错的地方是在下面代码中的setRange出错,报的是SIGSEGV,段访问错误。
LCDRange *angle=new LCDRange();
Q_CHECK_PTR(angle);
angle->setRange(5,70);
以前没有用过Q_CHECK_PTR,但看到过,就在setRange前加上了,但还是到setRange才报同样错误,这儿显然Q_CHECK_PTR没有发挥到作用,而仔细查看文档知道,这个宏只是检查指针是否为NULL(C++里更偏向于说是否为0),而不是去检查是否为野指针或者说悬浮指针,当然我还没看到有能这方面能力的检查工具,其实也没有必要,堆上的内存管理是程序员的责任,Greater Power comes Greater Responsibility(记得自己当年参加惟一的一次竞选是说这句话的时候台下是一片哗然)。
int *a;
Q_CHECK_PTR(a = new int[80]); // WRONG!
a = new (nothrow) int[80]; // Right
Q_CHECK_PTR(a);
最后还是同学自己一行行比较找出来的,自己那个Qt里那个cannon例子谢了很久,发现过几处有问题,但当时并没有记录下来。
QSlider *slider=new QSlider(Qt::Horizontal);
slider->setRange(0,99);
上面两行是出现在 LCDRange的构造函数里,而下面这行是出现在LCDRange的setRange方法里,
slider->setRange(minValue,maxValue);
聪明的你很快就明白了问题之所在了吧。在构造函数里出现的代码并没有初始换slider,而是自己声明了一个局部变量,忙乎一阵,最后成员变量slider还是dangling pointer,其实这儿也涉及到C++语法:对于成员变量,如果未在构造函数初始换,那么值类型的成员将会赋值为个类型的默认值,而引用类型的值则为不确定。哎,我当时半天都没有看出来,只是傻啦吧唧地盯着Q_CHECK_PTR.
刚才同学问我C语言怎么读文件,让我写几行示例一下。我也正好闲着,那就写吧,可是在读写float型变量时总是出问题以前在TurboC下也是,以为VC6.0也是,最后才发现声明时为double,fprintf写的时候是用”%f”,fscanf读的时候也是用”%f”,自然出不来啊,得用”lf”啊,TurboC是真bug也.
和网页http://blog.schemacs.com/?p=687的作者无
- Q_CHECK_PTR and “fscanf float or double”
- float and double,why?
- 如何完整打印float or double
- float or double ==0?
- Bit-level Difference between Float and Double
- ConvertRgbToYuv intermediate variables should be double or float
- 数值转换(string 转换 为double or float)-- swift
- float && double
- float,double
- float && double
- double+float
- Avoid float and double types if exact answers are required.
- Java run-off error(on float and double)
- fscanf读取double类型数据
- 消除fscanf()读取float误差
- How to insert double and float values to sqlite?如何向sqlite插入double和float型数据
- double float 有效位数
- double,float精度问题
- Windows Socket IO 模型
- poj2363-blocks
- ZOJ1414 POJ1663 Number Steps 很简单的找规律题
- Java中引用类型和原始类型的区分
- POJ1256 Anagram STL中的next_permutation()
- Q_CHECK_PTR and “fscanf float or double”
- 字符串中的||去掉
- nmon 的使用
- Qt学习——布局管理器QLayout类
- GetPixel SetPixel bitbil
- Makefile 入门
- 谈谈关于程序员或者IT人员的健康问题,因为自己出现了
- 开启第一步
- 浮点数累加的方法