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

What part of this code is causing an infinite loop?

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

具体的问题是它导致了一个无限循环,即当我运行这个程序时,它运行s直到硬关机并且什么都不做。期望的行为是程序访问 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.

   ...

你有这个:

   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 由 full-stop/period 或 END-IF 终止。如果在此之前遇到另一个IF(或任何条件语句),则为"nested",它的执行条件是前一个条件为真。

您的嵌套 IF 正在为多个不同的值测试同一字段,并且您没有 END-IF 或 full-stops/periods。因此,您认为与 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)或 full-stop/period 终止。所以一旦你解决了 IF 问题,你也有这个问题。

用范围终止符终止所有条件。使用范围终止符终止所有命令式语句。用 full-stop/period 结束段落、章节和程序。

当程序中有大循环 (BFL) 时,通常很容易找到循环的位置。然后你需要找出循环没有终止的确切原因。

如果你有一个 BFL 而 运行-time 没有告诉你在哪里,或者你不能从失败信息或创建的输出中找出哪里,那么你看看你的所有地方有循环结构的程序。

您寻找GO TO。您寻找 "fall-through"。您寻找 PERFORM ... UNTIL ... 并寻找可能的递归 PERFORM。

你只有以上两项。第一个涉及 READ。如果您删除(注释掉)与文件无关的任何其他处理,您可以向自己证明读取循环正在工作。这意味着它是另一个。

然后您查看该代码,了解如何永远不会达到终止条件。在这种情况下,您会得到 "that ADD 1 can't be being executed"。然后你是否解决范围终止取决于你已经知道的。所以如果你不知道,你看看你的教学笔记和你的语言手册。

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

但是,对于您的任务,请考虑使用 table 和 OCCURS。这将节省您命名个人总计,并要求那些无论如何都是 IF 字符串的人。

在此处查看其他一些 COBOL 问题。了解 FILE STATUS 之类的东西。