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带领几个小组成员做了一个国外项目,这里想为大家分享一些小经验,尽管我佣有六年多的项目经验,但我一直的方向是架构师.大家知道架构师一般情况是偏向技 ...
随机推荐
- 组合优于继承 Composition over inheritance
https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance 解答1 Prefer composition ...
- Spring boot 解决 hibernate no session异常
启动类中加入 @Beanpublic OpenEntityManagerInViewFilter openEntityManagerInViewFilter(){ return new OpenEnt ...
- Docker Mysql主主同步配置搭建Demo
主主同步配置和主从配置很相似,仅需稍做修改就可以了,对主从配置有疑问可以查看 上一篇文章. 进行Docker操作前,先建立目录,我的路径是d:/docker/mysql,目录结构如下: --mysql ...
- UVa 11324 最大团(强连通分量缩点)
https://vjudge.net/problem/UVA-11324 题意:给一张有向图G,求一个结点数最大的结点集,使得该结点集中任意两个结点u和v满足,要么u可以到达v,要么v可以达到u. 思 ...
- 使用js合并table中的单元格
用primefaces做的报表,领导要求合并相同内容的单元格,但是primefaces没有找到可以合并单元格的组件,想来想去,只有页面加载后用js合并了. http://blog.csdn.net/d ...
- mysql 的行转列 PIVOT 的使用
语句:SELECT DataDate , PropertyText , DataValue FROM RPT_ReportProperty p WITH ( NOLOCK ) JOIN RPT_Rep ...
- Devops 到底是什么?
Devops 到底是什么? 过去一年以来,一批来自欧美的.不墨守陈规的系统管理员和开发人员一直在谈论一个新概念:DevOps.DevOps就是开发(Development)和运维(Operations ...
- Python在线教程(廖雪峰)
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000
- ABP 学习问题集锦
一:Update-Database : 无法将“Update-Database”项识别为 cmdlet.函数.脚本文件或可运行程序的名称的问题 解决: 这是因为没有引用EntityFramework命 ...
- Spring源码解析-IOC容器的实现
1.IOC容器是什么? IOC(Inversion of Control)控制反转:本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,即交给了IOC容器,Spring的IO ...