当前位置:  开发笔记 > 编程语言 > 正文

这段代码的哪一部分导致无限循环?

如何解决《这段代码的哪一部分导致无限循环?》经验,为你挑选了1个好方法。

我确信有一种更简单的方法可以做到这一点,但我是COBOL的新手.这段代码的某些部分会导致无限循环,在它向写入文件写入任何内容的部分之前,但我看不到位置; 我已经尝试重写它的多个部分,看起来它们可能是问题所在.我错过了什么?

具体问题是它会导致无限循环,即当我运行程序时,它会运行直到硬关闭并且什么也不做.所需的行为是程序访问Ch10_payroll.DAT文件,读取有关九个地区中每个地区的人员年薪的信息,并将每个地区的年度总工资写入Ch10_payroll.RPT文件.

   ...
   Working-Storage Section.
   ...
   01  WS-Total-1                      PIC 9(6)            Value Zeroes.
   01  WS-Total-2                      PIC 9(6)            Value Zeroes.
   01  WS-Total-3                      PIC 9(6)            Value Zeroes.
   01  WS-Total-4                      PIC 9(6)            Value Zeroes.
   01  WS-Total-5                      PIC 9(6)            Value Zeroes.
   01  WS-Total-6                      PIC 9(6)            Value Zeroes.
   01  WS-Total-7                      PIC 9(6)            Value Zeroes.
   01  WS-Total-8                      PIC 9(6)            Value Zeroes.
   01  WS-Total-9                      PIC 9(6)            Value Zeroes.
   01  WS-Territory-No                 PIC 99              Value Zeroes.
   ...
   01  Detail-Line.
       05                              PIC X(3)            Value Spaces.
       05  Territory-No-Out            PIC 99.
       05                              PIC X(17)           Value Spaces.
       05  Current-Territory-Total     PIC $ZZZ,ZZZ.99.

   ...
  * This section will list the inflation rate and item cost for each projected year.
   Procedure Division.

   ...

   700-HDR-Module.
   Perform Until Territory-No-Out Equals 10
       If Territory-No-Out Equals 01 Then Move WS-Total-1 To Current-Territory-Total
       If Territory-No-Out Equals 02 Then Move WS-Total-2 To Current-Territory-Total
       If Territory-No-Out Equals 03 Then Move WS-Total-3 To Current-Territory-Total
       If Territory-No-Out Equals 04 Then Move WS-Total-4 To Current-Territory-Total
       If Territory-No-Out Equals 05 Then Move WS-Total-5 To Current-Territory-Total
       If Territory-No-Out Equals 06 Then Move WS-Total-6 To Current-Territory-Total
       If Territory-No-Out Equals 07 Then Move WS-Total-7 To Current-Territory-Total
       If Territory-No-Out Equals 08 Then Move WS-Total-8 To Current-Territory-Total
       If Territory-No-Out Equals 09 Then Move WS-Total-9 To Current-Territory-Total
       Write Print-Rec From HDR-1
       Write Print-Rec From Column-Headings
           After Advancing 2 Lines
       Write Print-Rec From Detail-Line
           After Advancing 2 Lines
       At End-Of-Page Add 1 To Page-Text
       Add 1 To Territory-No-Out
   End-Perform
   Move 'NO ' To Are-There-More-Records.

   ...

Bill Woodger.. 5

你有这个:

   If Territory-No-Out Equals 01 Then Move WS-Total-1 To Current-Territory-Total
   If Territory-No-Out Equals 02 Then Move WS-Total-2 To Current-Territory-Total
   ...

A IF由一个句号/句号终止或由一个句号终止END-IF.如果在此之前遇到另一个IF(或任何条件语句),则它是"嵌套"的,它的执行是以前一个条件为真为条件的.

您的嵌套IF正在为多个不同的值测试相同的字段,并且您没有END-IF或句点/句点.因此,您认为与IF无关的代码实际上永远不会永远执行.

你也有这个:

Write Print-Rec From Detail-Line
       After Advancing 2 Lines
   At End-Of-Page Add 1 To Page-Text

AT END-OF-PAGE是一个必要的声明.同样,这由范围终止符(在这种情况下END-WRITE)或句点/句点终止.所以,一旦你解决了IF问题,你也有这个问题.

使用其范围终止符终止所有条件.使用其范围终止符终止所有命令式语句.使用句号/期限终止段落,部分和程序.

当你在程序中有一个大脂肪循环(BFL)时,通常很容易找到循环的位置.然后,您需要确切了解循环未终止的原因.

如果你有一个BFL并且运行时没有告诉你在哪里,或者你无法找出失败信息或创建的输出的位置,那么你可以查看程序中你有一个循环结构的所有位置.

你找GO TO.你寻找"堕落".您寻找PERFORM ... UNTIL ...并寻找可能的递归PERFORM.

你只有两个以上.第一个涉及到READ.如果删除(注释掉)与文件相关的任何其他处理,您可以向自己演示读循环是否正常工作.这意味着它是另一个.

然后,您查看该代码,以了解永远不会达到终止条件.在这种情况下,您会得到"无法执行ADD 1".您是否随后了解范围终止取决于您已经知道的内容.因此,如果您不知道,请查看您的教学笔记和语言手册.

如果您需要在同一场上测试条件的大量IF,请查看使用EVALUATE(with END-EVALUATE).

但是,对于您的任务,请查看使用表格OCCURS.这将节省您命名单个总计,并且无论如何都要求那些IF的字符串.

在这里查看一些其他COBOL问题.了解FILE STATUS和这样的事情.



1> Bill Woodger..:

你有这个:

   If Territory-No-Out Equals 01 Then Move WS-Total-1 To Current-Territory-Total
   If Territory-No-Out Equals 02 Then Move WS-Total-2 To Current-Territory-Total
   ...

A IF由一个句号/句号终止或由一个句号终止END-IF.如果在此之前遇到另一个IF(或任何条件语句),则它是"嵌套"的,它的执行是以前一个条件为真为条件的.

您的嵌套IF正在为多个不同的值测试相同的字段,并且您没有END-IF或句点/句点.因此,您认为与IF无关的代码实际上永远不会永远执行.

你也有这个:

Write Print-Rec From Detail-Line
       After Advancing 2 Lines
   At End-Of-Page Add 1 To Page-Text

AT END-OF-PAGE是一个必要的声明.同样,这由范围终止符(在这种情况下END-WRITE)或句点/句点终止.所以,一旦你解决了IF问题,你也有这个问题.

使用其范围终止符终止所有条件.使用其范围终止符终止所有命令式语句.使用句号/期限终止段落,部分和程序.

当你在程序中有一个大脂肪循环(BFL)时,通常很容易找到循环的位置.然后,您需要确切了解循环未终止的原因.

如果你有一个BFL并且运行时没有告诉你在哪里,或者你无法找出失败信息或创建的输出的位置,那么你可以查看程序中你有一个循环结构的所有位置.

你找GO TO.你寻找"堕落".您寻找PERFORM ... UNTIL ...并寻找可能的递归PERFORM.

你只有两个以上.第一个涉及到READ.如果删除(注释掉)与文件相关的任何其他处理,您可以向自己演示读循环是否正常工作.这意味着它是另一个.

然后,您查看该代码,以了解永远不会达到终止条件.在这种情况下,您会得到"无法执行ADD 1".您是否随后了解范围终止取决于您已经知道的内容.因此,如果您不知道,请查看您的教学笔记和语言手册.

如果您需要在同一场上测试条件的大量IF,请查看使用EVALUATE(with END-EVALUATE).

但是,对于您的任务,请查看使用表格OCCURS.这将节省您命名单个总计,并且无论如何都要求那些IF的字符串.

在这里查看一些其他COBOL问题.了解FILE STATUS和这样的事情.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有