C++ 项目经验总结:程序严谨性(一)
作者:JK
时间:2015/09/24
特别说明:版权所有,转载请注明出处;
最近笔者在参与项目时,遇到了一些很奇特的问题,程序运行正常,产生的结果异常,程序功能是对当天的数据进行统计,数据里有可能有重复的,如果数据重复则该数据对应的计数器增1,问题是统计以后,有数据的次数居然类似于一个随机数,看到这个数字我就认定这个结果肯定是错误的,只是一时不能想出问题出在哪里,百思之下仍不得其解,甚至拿着工程的源代码,根据程序的流程重新走读代码,仔细思考每一个处理过程,最后程序看完,仍然对问题没有任何头绪。
搔首顿足,冥思苦想若干分钟,最后决定在每一个关节处增加调试输出语句,这样就能确定数据是在哪个阶段出现了问题。这是一个最笨的办法,也最麻烦。既然没有想到更好的解决办法,那就只能硬着头皮,抱着强大的耐心,在每一个处理过程增加调试输出语句。比如数据从输入到输出,中间可能有10个处理过程(10个函数),我的做法是先在第5个函数产生数据的地方增加调试语句,这样做的好处是,可能在多半的情况下能减少排查问题的时间,这种处理办法类似于“二分查找”算法,从中间位置开始查找,要比从头开始或者从尾开始的做法快,如果在第5个过程处经过调试输出发现,已经出现问题,那数据在第5个过程以前肯定已经出现了问题,最后经过笔者的不断尝试,终于在大概第7个过程的位置发现了一个很隐蔽的问题。
为什么这是一个很隐蔽的问题呢,听我一一道来。C++里关联容器可以使用中括号(‘[]’)来直接引用,关联容器里不存在的KEY值也可以使用中括号来操作,如果该key值对应的值不存在,则往该容器中添加键值对。本项目中所使用的关联容器是一个key为string类型,value为另一个自定义结构体,类似于map<string, STRUCT> >; STRUCT是自定义的数据结构,里面有两个long类型的变量,如下定义:
- typedef struct _STATCOUNT
- {
- long curdatetimes;
- long total;
- }STATCOUNT;
在项目的代码中,对map的操作时类似于下列代码:
假定map<string, string>contentMap为每一条记录;
- map<string, STATCOUNT> statCount;
- map<string, string>contentMap::const_iterator iter;
- for(iter = contentMap.begin(); iter !=contentMap.end(); ++iter)
- {
- statCount[iter->second].curdatetimes += ;
- }
这样的代码表面上看没有任何问题,也能正常运行,可是隐藏的问题是:
(1) statCount中如果key值iter->second所对应的value值不存在,直接使用statCount[iter->second].curdatetimes += 1; 将会根据long类型的属性产生一个随机的结果;
(2) long类型在定义后默认是不进行初始化的,和int类型不同,int类型定义后将被编译器自动初始化为0,而long类型则没有初始值。
因此经过调试输出发现问题在此,因此结果数据中,统计的次数可能出现一个看似奇怪的结果。修正该问题后,重新调试发现,原来的随机数情况就没有再出现了。笔者不禁感慨,设计代码的严谨性多么重要,如果设计之时粗心大意,可能就是给自己埋下的无数的“坑”。
怎么样,可能大家在没有自己亲身经历的情况下,不会有太深刻的体会,没关系,看过这篇文章,脑海里只要有一个印象就够了,下次如果真遇到相似的问题,就能迅速联想起来。那这篇文章就会变得特别有意义了。
C++ 项目经验总结:程序严谨性(一)的更多相关文章
- Java项目经验——程序员成长的关键(转载)
Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的分析与设计技巧3.掌握用例驱动.以 ...
- Java项目经验——程序员成长的钥匙
本文转载至:http://geek.csdn.net/news/detail/109880,像我这样的菜鸟应该多看几遍这样的文章,学起来才更加有动力和方向. Java就是用来做项目的!Java的主要应 ...
- java程序员面试交流项目经验
粘贴自:https://blog.csdn.net/wangyuxuan_java/article/details/8778211 1:请你介绍一下你自己 这是面试官常问的问题.一般人回答这个问题过于 ...
- Java项目经验
Java项目经验 转自CSDN. Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的 ...
- java面试项目经验:框架及应用
Java项目经验 Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的分析与设计技巧3 ...
- Javaee项目经验须知
Java的主要应用领域就是企业级的项目开发!具体要点(09年,那一年我去面试,被拒了几次,想起来还不错!他锻炼了我的心理素质,让我体会到很多,笑一个吧!): 1.掌握项目开发的基本步骤 2.具备极强的 ...
- 安利一个基于Spring Cloud 的面试刷题系统。面试、毕设、项目经验一网打尽
推荐: 接近100K star 的Java学习/面试指南 Github 95k+点赞的Java面试/学习手册.pdf 今天给小伙伴们推荐一个朋友开源的面试刷题系统. 这篇文章我会从系统架构设计层面详解 ...
- 最近面试java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备
在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面 ...
- 项目经验分享[转自min.jiang]
最近三个月,我非常荣幸的做为TeamLeader带领几个小组成员做了一个国外项目,这里想为大家分享一些小经验,尽管我佣有六年多的项目经验,但我一直的方向是架构师.大家知道架构师一般情况是偏向技 ...
随机推荐
- System.IO命名空间下常用的类
System.IO System.IO.Directory 目录 System.IO.Path 文件路径(包含目录和文件名) System.IO.FileInfo 提供创建.复制.删除.移动和打开文件 ...
- 【jdk源码分析】java多线程开启的三种方式
1.继承Thread类,新建一个当前类对象,并且运行其start()方法 package com.xiaostudy.thread; /** * @desc 第一种开启线程的方式 * @author ...
- 解题报告:poj1321 棋盘问题 - 搜索
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 51262 Accepted: 24785 Description 在一 ...
- 你可能不知道的mouseover/mouseout mouseenter/mouseleave
mouseover与mouseenter 1. 触发时机 mouseover在被监听的节点与子节点上都会触发 mouseenter只在被监听的节点上触发 本质上是因为mouseenter不能冒泡 2. ...
- 让vs IIS Express支持本地静态Json文件
根据前辈的解决方案是IIS Express没有配置Json文件的处理程序,只要增加对应配置即可,IIS Express 对应配置文件夹为: “%UserProfile%\Documents\IISEx ...
- DXVA2解码数据用texture纹理渲染
FFmpeg DXVA2解码得到的数据使用surface来承载的,surface限制很多,如果能用纹理来渲染的话,那我们就可以充分开发D3D,比如可以用坐标变换来实现电子放大的功能,还可以用坐标变换来 ...
- 不使用构造方法创建Java对象: objenesis的基本使用方法
转载:http://blog.csdn.net/codershamo/article/details/52015206 objenesis简介: objenesis是一个小型Java类库用来实例化一个 ...
- IRC BOT原来是利用IRC下发C&C命令——在xx云环境遇到了,恶意软件开的是6666端口
Backdoor/IRC.RpcBot 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! Backdoor/IRC.RpcBot是一些批处理文件.脚本文件和执行文件的集合,也是 ...
- HTML5:了解Polyfills
利用 HTML5 来搭建网站和应用可能是一项艰巨的任务.尽管现在越来越多的现代浏览器正在更多的支持Html5新特性,但实际上只有很少部分人能够幸运的只需要为这些最新的浏览器编写代码.作为一个专业的开发 ...
- mysql的搭建
创建程序用户 root@localhost ~]# groupadd mysql [root@localhost ~]# useradd -s /sbin/nologin -g mysql -M my ...