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

标签 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.

   ...

最佳答案

你有这个:

   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 问题,您就会遇到这个问题。

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

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

如果您有 BFL,并且运行时没有告诉您在哪里,或者您无法从失败信息或创建的输出中找出哪里,那么您将查看程序中存在循环的所有位置-构造。

您寻找“转到”。你寻找“失败”。您寻找PERFORM ... UNTIL ...并寻找可能的递归PERFORM。

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

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

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

但是,对于您的任务,请考虑使用带有 OCCURS 的表格。这将节省您命名各个总计的麻烦,并且无论如何都不需要那些 IF 字符串。

查看此处的一些其他 COBOL 问题。了解文件状态等信息。

关于loops - 这段代码的哪一部分导致了无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34112351/

相关文章:

COBOL 关键字 REDEFINES

c++ - 如何将 int 分解为数字并以相同的顺序将数字分配给 vector ?

arrays - 在 Swift 中遍历数组时,是否有循环索引/迭代的引用?

sas - 将 COBOL PIC 格式转换为 SAS 非 native 机器

cobol - COBOL 中的数据类型

java - 在 AS400 上通过 Java 传输运行时进程执行 (cobol obj) 的结果时出现 MalformedInputException

cobol - COBOL 程序中的 INSPECT 动词

c# - 在 'foreach' 循环中使用 LINQ 仅运行一次

loops - 如何更新 Ansible 中的字典

python - 如何在 while 循环中汇总某个范围内的整数