我确定这是一种更简单的方法,但我是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.
...
答案 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,请查看使用EVALUATE
(END-EVALUATE
)。
但是,对于您的任务,请查看使用OCCURS
的表格。这将节省您命名单个总计,并且无论如何都要求那些字符串为IF。
在这里查看一些其他COBOL问题。了解FILE STATUS
等事情。