01 ws-var-05 pic x value 'n'.
88 ws-var-88 value 'y'
01 ws-var-2 pic 9 value 1.
88 ws-var-88-2 value 2.
.
.
.
* comment ws-var-88-2 is set to true when eof is
* reached in the at end clause of read statement
* need to understand when ws-var-05 evaluates to
* true! Is this right syntax? What happens if we use
* this syntax? Need to understand if this is a
* defect
Perform 1000-para until ws-var-88-2 or ws-var-05.
答案 0 :(得分:2)
线......
Perform 1000-para until ws-var-88-2 or ws-var-05.
...包含语法错误,至少在使用GNU COBOL 1.1.0编译时。
UNTIL
动词的PERFORM
子句可以包含条件表达式。一种类型的条件表达式是条件名称条件"这是一个88级。但是,标识符的名称(在本例中为ws-var-05
)必须后跟条件运算符(<,>,=等),然后是{{1}的另一个标识符或文字}子句有效。
这是正确的语法吗?
没有
如果我们使用这种语法会怎样?
将发生编译时错误。
答案 1 :(得分:0)
有几件事。
离开备份条件项(88s)未命名的存储空间是一种“最佳做法”。这可以防止人们意外地将错误的值移入其中并导致细微的错误。
例如,这个:
01 ws-var-05 pic x value 'n'.
88 ws-var-88 value 'y'
01 ws-var-2 pic 9 value 1.
88 ws-var-88-2 value 2.
写得更好:
01 pic x value 'n'.
88 ws-var-88 value 'y'.
01 pic 9 value 1.
88 ws-var-88-2 value 2.
所以没有人能不小心做“向Ys移动'到ws-var-05”。这在大型机上尤其成问题,在大型机上有一些自动的大写编辑器选项可以真正使'y'和'Y'之间的区别难以注意。
在这种情况下,有几件事,ws-var-05不是一个完整的条件,你可以使用“ws-var-88或ws-var-88-2”,这将是一个完整的有条件的。
最后你不需要一段时间,而现代编译器的使用通常会有问题。从Cobol-85开始,END-verbname是终止命令的首选方式。你可以这样写:
Perform 1000-para until ws-var-88-2 or ws-var-05.
as:
Perform 1000-para until (ws-var-88 or ws-var-88-2)
或者,IMNSHO,一种更清晰,更清晰的方法,因为它将你的终止条件与你将在表演体内执行的命令分开:
Perform until (ws-var-88-2 or ws-var-88-2)
Perform 1000-para
End-Perform
我也总是使用parens来划定我的预期操作顺序,尽管在这种情况下,重要的不是。对于更复杂的条件,它们对于随叫随到的程序员来说是一个很大的帮助,它需要查看凌晨3点发生的事情。
你会触发你的终端条件:
1000-para.
Read myfile
at end
set ws-var-88-2 to true
End-Read
If (something-else = time-to-quit)
set ws-var-88 to true
End-If
Exit. *> One of the few places you need a period
*> in modern cobol, adding the "Exit" or
*> "Continue" NOPs clearly calls out to a
*> reader that you are using a period.