在COBOL中,以下将直到条件评估为真

时间:2017-05-30 18:31:25

标签: cobol

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.

2 个答案:

答案 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.