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

时间:2015-12-05 23:54:53

标签: loops cobol

我确定这是一种更简单的方法,但我是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.

   ...

1 个答案:

答案 0 :(得分: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
   ...

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问题,你也可以使用这个。

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

当你在一个程序中有一个Big Fat Loop(BFL)时,通常很容易找到循环的位置。然后,您需要确切了解循环没有终止的原因。

如果您有BFL并且运行时没有告诉您在哪里,或者您无法确定故障信息或创建的输出的位置,那么您可以查看程序中循环的所有位置-construct。

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

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

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

如果您需要在同一字段上测试条件的大量IF,请查看使用EVALUATEEND-EVALUATE)。

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

在这里查看一些其他COBOL问题。了解FILE STATUS等事情。