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