Chinaunix首页 | 论坛 | 博客
  • 博客访问: 567414
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 19:16:08

1 现象:问题描述
某局点发现,将smp割接到新的设备上后,smp上统计程序对某个表统计后的数据,根据主键字段判断有重复记录。
2 关键过程:根本原因分析
  通过检查生成统计报表的代码,发现导致统计数据中主健重复的原因是由于程序中的一个判断主键的地方有误,从而导致此记录插到排序二叉树的其他节点上,导致统计时有两条或多条重复记录出现;
伪代码表示如下:
int iRet = strcmp("记录1主健", "记录2主健");
if (iRet == 0)
{
    //表示相等
}
else if (iRet == -1)//这里有问题,因为有些机型表示小于时不一定是-1,也可能是-2或-3等
{
    //表示小于
}
else
{
   //大于
}
修改方法,就是把"iRet == -1"修改为:"iRet < 0"即可
{
   //表示小于
}
else
{
    //表示大于
}

3 结论:解决方案及效果
   用strcmp时,当第一个字符串小于第二个字符串时,判断方法应当为 "strcmp(str1,str2) < 0";
修改后记录的二叉树生成正确,统计报表符合要求。
4 经验总结:预防措施和规范建议
函数的返回值应当考虑充分,对于一些库函数和系统调用不仅要处理所有的返回值,还需要明确每个返回值的含义。不能仅仅根据自己的经验和某些平台的结果就得出结论。
5 备注
6 考核点
strcmp函数的返回值的含义;
7 试题
(选择题)
1、如下第二个判断String1小于String2条件的if语句得括号内应当填(D);
int iRet = strcmp(String1, String2)
if (0 ==iRet) //相等
{
    ...
}
else if ( ) //小于
{
    ...
}
else //大于
{
    ...
}
A : -1 == iRet
B : -2 == iRet
C : -3 == iRet
D : iRet < 0
阅读(847) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~