谈谈实际编程中遇到最多的问题

zhenghongchao 2012-05-30 12:03:01
工作几年了,算不上码农,总是在解bug,谈谈经常遇到的问题
1) 数据类型混用。 这个问题由来已久,大家可能都知道,但是实际工作中不注意,经常转换出错,最多的是int 被转换成unsigned int或者unsigned 变换成int, 造成的错误很难检查出来,编译时最多是个警告,很多编译器警告也没有。最基本的东西往往需要牢记,并且多看看些历史的失败经验教训,那样才会有深刻的体会!
2)返回值检查不充分。 返回值有很多种可能,很少人会每个都处理,基本就是两个:成功或者不成功,甚至很多时候连返回值都不判断,直接调用,理所当然认为不会失败,结果问题会很绕,往往出错的地方离触发点很远,调试很辛苦啊!另外C++中还有个讨厌的异常处理,很多人不关心,有些则因为编译器的问题对异常类(模板)的继承与重载处理不好,出了问题都让人抓狂。
3)边界条件处理不当。 这个最难处理,因为很多时候设计者为了简单,往往不会考虑太多,程序运行的结果像是飞船进入了异度时空,而且很多时候往往很久才能发现,最重要问题还不是这个,相比较前两个这个最难的是修改,因为原来设计者都没有考虑,你必须完全理解原始设计者的思想才能比较好地解决。最简单的例子就是 for循环(i=0; i <=100; i++)中的 i < 100 还是 i <= 100, 如果没有注释鬼才知道他要100次还是101次呢。
基本上通用的就三点,另外我做嵌入式,有些特殊的方面要特别注意
1)效率,嵌入式程序的CPU占用率不能太高,否则系统随时崩溃,所以在大数据量的循环嵌套,查找替换等等需要好的算法,另外很多时候一个简单的语句如果被重复调用很多次,那么这个简单语句就不能简简单单的了!很多时候需要实际测试来决定。
2)内存,能少用就少用,很多时候内存耗费在你根本想不到的地方,有时开个大块内存(4k)就失败,所以内存泄漏是非常严重的问题,毕竟嵌入式系统的内存太少了。。。另外栈的使用也要注意,很多函数形参最好能用引用就用引用,不能用引用用指针,否则堆栈很快满了,运行效率大大地低啊!
...全文
340 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
赵4老师 2012-06-05
  • 打赏
  • 举报
回复
防御式编程。
可能发生错误的地方一定会发生错误。
赵4老师 2012-06-05
  • 打赏
  • 举报
回复
很多本来该写“<=”或“>=”的地方错误地写成“==”了。
hondely 2012-06-05
  • 打赏
  • 举报
回复
nice_cxf 2012-06-05
  • 打赏
  • 举报
回复
3其实也简单,循环一律用<(迭代器用!=)而不用<=,后边如果是常量尽量用宏定义
cbzjzsb123 2012-06-05
  • 打赏
  • 举报
回复
zhenghongchao 2012-06-05
  • 打赏
  • 举报
回复
受教了!

[Quote=引用 6 楼 的回复:]

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语……
[/Quote]
qq120848369 2012-05-30
  • 打赏
  • 举报
回复
嵌入式啊, 两码事, 围观.
ma100 2012-05-30
  • 打赏
  • 举报
回复
lz用的什么嵌入式平台啊, 4k就失败, 那就即早别用c++了
赵4老师 2012-05-30
  • 打赏
  • 举报
回复
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
a=fgetc(f);
//...
b=fgetc(f);//可能此时已经feof了!
//...
}
而这样写就没有问题:
whlie (1) {
a=fgetc(f);
if (feof(f)) break;
//...
b=fgetc(f);
if (feof(f)) break;
//...
}
类似的例子还可以举很多。

不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
赵4老师 2012-05-30
  • 打赏
  • 举报
回复
“多一少一”问题占程序员常犯错误的10%以上!

printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
星星x 2012-05-30
  • 打赏
  • 举报
回复
楼上 +1
cyclejdm 2012-05-30
  • 打赏
  • 举报
回复
第一个问题很好处理 把所有警告都当作错误来处理 这是个好习惯
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧