免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3328 | 回复: 11
打印 上一主题 下一主题

为什么有时有重复纪录会造成程序死循环 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-25 07:40 |只看该作者 |倒序浏览
以下就是一个重复纪录回造成死循环的典型例子。
F_KEY是FILE1的第一个KEY.

STD_RTG是被程序许多地方调用的标准子程序。程序员不动脑筋地就把它抄过来使用。
如果程序中有两个或以上的纪录的KEY值相同,那么当READ读到第二条重复的纪录之后,
本来FILE1的指针时指向第二条重复的纪录后面那条记录的,可是子程序中的CHAIN又把
FILE1中的指针扳回到第一条重复纪录的右面,也就是第二条重复的前面。。。

F_KEY是文件FILE1中的KEY FIELD.



C           KEY1        SETLL  FILE1
C                           READ   FILE1
C                           DOW   NOT %EOF(FILE1)
C                           ...
C                           EXSR    STD_RTG
C                           ...
C                           READ   FILE1
C                           ENDDO
C                           ...
C           STD_RTG  BEGSR
C                           ...
C           F_KEY       CHAIN  FILE1
C                           ...
C                           ENDSR

[ 本帖最后由 franliu 于 2009-11-25 07:55 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-11-25 09:11 |只看该作者
发生死循环多了一个调试的思考方法

[ 本帖最后由 lizi211314 于 2009-11-25 09:14 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-11-25 10:56 |只看该作者
这个是值得深思,但是一般情况下都不会去用同一个文件来读两次的,要做也是两个不同的LF

论坛徽章:
0
4 [报告]
发表于 2009-11-25 11:56 |只看该作者

回复 #1 franliu 的帖子

这个例子挺经典的,,不过最好逻辑文件的key该为唯一的,比较好..

论坛徽章:
0
5 [报告]
发表于 2009-11-25 12:33 |只看该作者
这个问题胖有型的《ILE程序员速成手册.doc》里面有详细说明,大家可以看看,
不好意思,记错名字了
http://bbs2.chinaunix.net/viewth ... p%3Bfilter%3Ddigest

[ 本帖最后由 insmile 于 2009-11-25 12:35 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-11-25 17:44 |只看该作者

回复 #5 insmile 的帖子

胖有形的手册里第几页介绍这种情况啊?你有没有搞错啊?请把页号告诉我。

我大略看了《手册》,他所讨论的死循环都是无条件的,属于菜鸟程序类。这类东西都不可能通过测试进入正式运行的环境。我拿出来讨论的问题是只有当有重复纪录的时候才死循环的例子。

论坛徽章:
0
7 [报告]
发表于 2009-11-25 20:57 |只看该作者

回复 #6 franliu 的帖子

其实很多死循环是在不经意时才会出现的,,要是知道了在写出来就没意思了..

论坛徽章:
0
8 [报告]
发表于 2009-11-26 02:07 |只看该作者

回复 #7 huangxkst 的帖子

明显的和无条件的死循环通常在程序测试阶段就被排除了。只有那些隐蔽的才能通过测试,被放进实际运行的环境中去。

总之我想拿出来跟大家分享的是排除系统故障的一种思路。希望对大家有用。


而且,养成在循环内不使用任何会移动主循环内文件指针的操作的好习惯。

论坛徽章:
0
9 [报告]
发表于 2009-11-26 12:23 |只看该作者
我们建立的逻辑档一般不可能KEY值重复的,重复的一般写不进去

本来就要靠key值来定位查找记录,不唯一有什么用

论坛徽章:
0
10 [报告]
发表于 2009-11-26 15:23 |只看该作者

回复 #9 insmile 的帖子

使用UNIQUE是一个好的办法,可是由于历史的原因,许多现成的软件包都不使用UNIQUE.
大型软件公司的产品,需要雇佣许多程序员。由于成本的关系,有所多程序员是新出炉的菜鸟。要全面控制程序质量是很困难的。一个折衷的办法就是允许重复,这样总比结果却胳膊少腿好一些。
如果你自作主张加上了UNIQUE, 那些没有出错控制的程序就成了*MSGW, 有出错控制的可能就“死人不管”假定写或者更新成功了。。。


某ERP软件中有50%程序以现有纪录中最大的流水号码加以一的办法来生成新流水号的。

这样的逻辑,在多用户环境,再加上在缓冲区里没有被写进磁盘的纪录的因素,不重复有可能吗?

要把这些烂程序重新写一遍工作量太大,没有人愿意干哪吃力不讨好的活。干这种活写不出漂亮的报告。

研发部主任宁可计划发出新的版本或者至少 NEW RELEASE, 可以借此向大老板邀功。

最多做个重新排序的程序应付一下。。。

这就是现状。。。

还有一点要提一下,使用了UNIQUE之后,为了防止重复,写纪录就不可以一块一快写了,只能一个记录一个记录写,程序运行要慢得多。

[ 本帖最后由 franliu 于 2009-11-26 15:32 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP