这几天一直在改wince的应用程序bug,现把自己遇到的一些问题总结下来,在此抛砖引玉,希望大家也把自己遇到的一些提高应用程序稳定性的方法发出来一起分享。
1.指针的使用不能越界,否则很可能误修改其他变量的值,导致不可预测的结果,而且进行错误定位时,错误往往并不是在错误发生的地方。这个错误虽然大家都知道,但是本人这次还是犯了。
2.不要过于频繁的修改存储在NandFlash的文件,NandFlash写之前必须先擦除,所以每次修改一点内容,FAT文件目录表等信息都需要擦除重写,和电脑硬盘上的Fat系统操作是不一样的,而且长时间频繁操作还会导致nandflash Fat系统出错(不知道是不是我个人系统问题)。
3.对于重要区域数据应注意保护,比如nandflash内核文件(我在驱动中做了应用程序访问整个NandFlash的底层接口),因误擦除内核某个块的内容导致系统断电后不能启动。
4.全局变量勿嵌套使用,如果是在循环中发生全局变量嵌套使用很可能导致程序死循环,或其他奇怪的结果。
5.程序中用到结构体的大小时,尽量使用sizeof计算,而不要用常数,这样可以避免因结构体在使用中改动而带来的错误。
还有两条,补充上:
6.文件的操作:(1)打开属性为只读,则操作过程中不要企图写文件。(2)文件关闭后,不要再用文件句柄进行进行读写,否则应用程序很可能会直接退出。(3)文件Seek时不要越界。(4)不要频繁修改大文件,否则程序运行速度会很慢。
7.一个INT或Long型数据存在单字节数组中传输后解析一定要用无符号数组进行解析。
int COnLineDlg::Byte4ToInt(const BYTE *p)
{
return (p[0]<<0)+(p[1]<<8)+(p[2]<<16)+(p[3]<<24);
}
不能用:
int COnLineDlg::Byte4ToInt(const char *p)
{
return (p[0]<<0)+(p[1]<<8)+(p[2]<<16)+(p[3]<<24);
}。
或者直接用memcpy也可以。
非常感谢楼主
对于此等好人的此等好贴
版主加精吧
看帖的牛人们
有什么经验也分享出来吧
引用: 引用 7 楼 garyliu1104 的回复:
还有两条,补充上:
6.文件的操作:(1)打开属性为只读,则操作过程中不要企图写文件。(2)文件关闭后,不要再用文件句柄进行进行读写,否则应用程序很可能会直接退出。(3)文件Seek时不要越界。(4)不要频繁修改大文件,否则程序运行速度会很慢。
7.一个INT或Long型数据存在单字节数组中传输后解析一定要用无符号数组进行解析。
int COnLineDlg::Byte4ToInt(const BYTE *p)
{
return (p[0] < <0)+(p[1] < <8)+(p[2] < <16)+(p[3] < <24);
}
不能用:
int COnLineDlg::Byte4ToInt(const char *p)
{
return (p[0] < <0)+(p[1] < <8)+(p[2] < <16)+(p[3] < <24);
}。
或者直接用memcpy也可以。
memcpy还是慎用好呵呵
谢谢lz分享啊,最好写blog,方便弟兄容易查找呵呵
6.文件的操作:(1)打开属性为只读,则操作过程中不要企图写文件。(2)文件关闭后,不要再用文件句柄进行进行读写,否则应用程序很可能会直接退出。(3)文件Seek时不要越界。(4)不要频繁修改大文件,否则程序运行速度会很慢。
7.一个INT或Long型数据存在单字节数组中传输后解析一定要用无符号数组进行解析。
int COnLineDlg::Byte4ToInt(const BYTE *p)
{
return (p[0] < <0)+(p[1] < <8)+(p[2] < <16)+(p[3] < <24);
}
不能用:
int COnLineDlg::Byte4ToInt(const char *p)
{
return (p[0] < <0)+(p[1] < <8)+(p[2] < <16)+(p[3] < <24);
}。
或者直接用memcpy也可以。
6.文件的操作:(1)打开属性为只读,则操作过程中不要企图写文件。(2)文件关闭后,不要再用文件句柄进行进行读写,否则应用程序很可能会直接退出。(3)文件Seek时不要越界。(4)不要频繁修改大文件,否则程序运行速度会很慢。
7.一个INT或Long型数据存在单字节数组中传输后解析一定要用无符号数组进行解析。
int COnLineDlg::Byte4ToInt(const BYTE *p)
{
return (p[0] < <0)+(p[1] < <8)+(p[2] < <16)+(p[3] < <24);
}
不能用:
int COnLineDlg::Byte4ToInt(const char *p)
{
return (p[0] < <0)+(p[1] < <8)+(p[2] < <16)+(p[3] < <24);
}。
或者直接用memcpy也可以。