使用此代码,我得到了
16: Perform stmnt not terminated by end-perform
33: syntax error, unexpected end-perform
为什么说我需要最终表演而又不需要它?
identification division.
program-id. xxx.
* will accept and display a num until 0 is called then
* asks to go again
data division.
file section.
working-storage section.
01 num pic 9(4).
01 hold pic 9(4).
01 another pic x.
procedure division.
perform until another = 'N' (line 16)
Display "Another Session (Y/N)? "
with no advancing
if another = 'Y'
Display "Enter a 4-digit unsigned number (0 to stop): "
with no advancing
accept num
move num to hold
perform until num = 0
Display "Enter a 4-digit unsigned number (0 to stop): "
with no advancing
accept num
if num <> 0
move num to hold
end-perform.
display space
Display "The last number entered: "hold
End-perform. (Line 33)
stop run.
答案 0 :(得分:5)
end-perform.
display space
Display "The last number entered: "hold
End-perform. (Line 33)
这是杀手的全停/周期(第30行)。
虽然自1985年标准COBOL在全停/周期方面更加放松,但是单一的COBOL将使所有当前的范围尖叫停止。你可以将50级深度嵌套,并且一次性完成一个句号就可以一次性结束。
我的建议是在PROCEDURE DIVISION中使用绝对最小值的句号。
即:终止PROCEDURE DIVISION标题;一个终止每个段落/ SECTION标签;一个终止paragrpah / SECTION;一个终止程序(对于没有段落/ SECTIONS的程序)。此外,如果您有PROCEDURE DIVISION COPY或REPLACE语句,则需要使用句号/句号来终止这些语句。
除了标签的终止之外,我将每个句号/句点放在自己的一行上,从不附加到任何代码。然后,我可以移动代码并插入代码,而不必担心是否需要添加/删除句号/句号。
至于为什么你需要END-PERFORM,它是一个“内联PERFORM”。从语法上讲,内联PERFORM需要END-PERFORM,但是在END-PERFORM定位之前,使用全停止/周期会导致PERFORM范围终止,因此第16行出错。随后END-PERFORM未连接到找到了PERFORM,因此错误就在第33行。
在您的问题中添加错误消息时,重要的是您完全按照您的方式包含错误消息。复制/粘贴,请不要重新尝试。还包括任何消息编号。
答案 1 :(得分:1)
你绝对不能混合句号&#34;。&#34; Cobol-74的范围终止符和Cobol-85的End- *范围终止符。
不同之处在于完全停止&#34;。&#34;终止所有范围。
End- *仅终止最近的范围,就像您期望的那样。
放一个&#34;。&#34;在End- *的代码中间有点像在它的中间丢弃核弹。作为一项规则,对于在过去四分之一世纪左右制作的编译器,一段时间应该只发生在一个段落名称末尾的程序部分,或一个段落的末尾(和部分也是如此,但是那些在一个段落中是无用的)。由操作系统管理分段和叠加的年龄。我喜欢使用&#34;退出。&#34;或者&#34;继续。&#34;只是为了强调我在程序部门中使用了一个讨厌的,最好避免的时期。