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

Loops 这段代码的哪一部分导致了无限循环?,loops,cobol,Loops,Cobol,我相信有一种更简单的方法可以做到这一点,但我是COBOL新手。这段代码的某些部分会导致一个无限循环,在它将任何内容写入写入写入文件的部分之前,但我看不到在哪里;我试过重写它的多个部分,看起来它们可能是问题所在。我错过了什么 具体的问题是,它会导致一个无限循环,也就是说,当我运行程序时,它一直运行到硬关机,并且什么也不做。程序所需的行为是访问Ch10_payroll.DAT文件,读取九个地区中每个地区的人群年薪信息,并将每个地区的总年薪写入Ch10_payroll.RPT文件 ...

我相信有一种更简单的方法可以做到这一点,但我是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.

   ...
你有这个:

   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
   ...
Write Print-Rec From Detail-Line
       After Advancing 2 Lines
   At End-Of-Page Add 1 To Page-Text
IF
通过句号/句点或
END-IF
终止。如果在此之前遇到另一个If(或任何条件语句),则它是“嵌套的”,它的执行是以前一个条件为真为条件的

嵌套IF正在为多个不同的值测试同一字段,并且没有结束IF或句点/句点。所以你们认为和IFs无关的代码实际上永远不会被执行

你也有:

   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
   ...
Write Print-Rec From Detail-Line
       After Advancing 2 Lines
   At End-Of-Page Add 1 To Page-Text
页面末尾的
是命令式语句。同样,由作用域终止符(在本例中为
结束写入
)或句点/句点终止。所以一旦你解决了IF问题,你也会遇到这个问题

使用范围终止符终止所有条件。用作用域终止符终止所有命令语句。以句号/句号结束段落、章节和程序

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

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

你要找的是去哪里。你在寻找“失败”。您要查找
执行。。。直到…
并且您寻找可能的递归执行

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

然后查看该代码,以了解终止条件是如何从未达到的。在这种情况下,您会得到“无法执行ADD1”。然后,您是否确定范围终止取决于您已经知道的内容。如果你不知道,你可以看看你的教学笔记和语言手册

如果您需要在同一字段上测试一个条件的大量IFs,请查看使用
EVALUATE
(使用
END-EVALUATE

但是,对于您的任务,请查看使用带有
发生次数的表。这将节省您命名单个总计的时间,并需要那些字符串为IF的总计


看看这里的其他一些COBOL问题。了解
文件状态
以及诸如此类的信息。

这是我第一次看到Cobol,但是如何执行:
直到Territory No In等于9
终止?如果正确理解语法,则该循环中的
区域中没有指定的
。谢谢。不幸的是,取出该部件(根据编辑的代码)并不能解决问题;它仍然无限循环。由于问题被搁置,无法给出完整答案。无论如何,您必须做的是简单的老式调试。到处都放显示器。由于您有2个循环(读取入口文件并使每个入口行的所有行都在出口中),因此显示每个循环的信息(读取后显示Acct文件并显示当前区域总数和显示WS-Territory No将有助于了解错误的位置)。除非您告诉它,否则
IF
语句不会终止。您有两个大规模嵌套的IFs,您的代码更改值从属于其中一个。以
END-IF
终止。再看看
EVALUATE
,也许你永远不会遇到这个问题,除非你没有使用
END-EVALUATE
。您必须终止条件语句和命令语句(就像您在
END-READ
中所做的那样)找到了,比尔。我没看见。