88级别编号

时间:2015-03-29 07:34:21

标签: cobol

10  ERROR-FLAG              PIC X VALUE 'N'.
    88  ERROR-FOUND         VALUE 'Y'.      
    88  ERROR-NOT-FOUND     VALUE 'N'.  

如果我这样做:

SET ERROR-NOT-FOUND               TO TRUE

然后我这样做:

SET ERROR-FOUND                   TO TRUE

现在,ERROR-FLAG,ERROR-FOUND和ERROR-NOT-FOUND的值是什么?

1 个答案:

答案 0 :(得分:9)

10  ERROR-FLAG              PIC X VALUE 'N'.
    88  ERROR-FOUND         VALUE 'Y'.      
    88  ERROR-NOT-FOUND     VALUE 'N'.

10级数字定义了一个字节的存储空间,作为字母数字,这意味着没有任何问题,它可以包含从X'00'到X'FF'的任何位值。

两个88级定义无存储

88实际上是一种为文字(或多个)字面值赋予名称的方法,但是它只与它引用的特定字段相关联(在这种情况下为ERROR-FLAG)。

这里ERROR-FLAG是“条件变量”(这意味着它有一个或多个与之关联的88个级别),而88个中的每一个都是“条件名称”。

如果你这样做:

SET ERROR-NOT-FOUND                   TO TRUE     

然后

IF ERROR-NOT-FOUND

将是真的,

IF ERROR-FOUND

不会是真的。

SET与:

相同
MOVE "N"                              TO ERROR-FLAG

IF与以下相同:

IF ERROR-FLAG EQUAL TO "N" *> for the IF ERROR-NOT-FOUND

88和SET改变其引用的字段值的优点是纪录片,并且减少了维护。

请记住,条件名称不定义存储(严格来说,存储与之关联,但它只包含文字,您无法有效地访问它)。

所以SET ERROR-NOT-FOUND TO TRUE(漂亮的间距,非常好)对ERROR-NOT-FOUND没有任何作用(可以完成没有任何东西),但是将值“N”放在ERROR中-FLAG。

所以SET ERROR-FOUND TO TRUE对ERROR-FOUND没有任何作用,但是将值“Y”放在ERROR-FLAG中。

按顺序编码这两个SET语句只会导致ERROR-FLAG为“Y”(第一个SET将是多余的)。

88级的SET语句生成代码相同到MOVE语句(或者应该/可能,不知道所有编译器)。你使用SET,这样你就不会通过拼写错误(或通过无能)意外地弄乱旗帜的价值。

标志/开关的更好结构是:

01  FILLER.
    10  FILLER                  PIC X.
        88  ERROR-FOUND         VALUE 'Y'.      
        88  ERROR-NOT-FOUND     VALUE 'N'.
    10  FILLER                  PIC X.
        88  AMOUNT-NUMERIC      VALUE 'Y'.      
        88  AMOUNT-NOT-NUMERIC  VALUE 'N'.

当您为条件变量指定名称时,就像您在示例中所做的那样,某人可以MOVE进行编码以引用它,并输入错误值,或者对其进行分析代码更难。使用FILLER定义无法从PROCEDURE DIVISION引用的字段可防止发生这种情况。定义的数据只能通过SET和IF访问(以询问值)。

代码将包含:

SET ERROR-NOT-FOUND     
    AMOUNT-NOT-NUMERIC                TO TRUE  

开始每个处理迭代(最好不依赖于VALUE,因为你必须每次都重新设置),然后在识别出需要标志的特定症状时单独的SET语句。

不是,88可以有多个值。值“A”“Q”“V”THRU“Z”,例如。在执行SET时,使用的值是VALUE语句中首先提到的值,在此示例中为“A”。

请参阅此答案,其中包含许多其他答案的链接:https://stackoverflow.com/a/21338755/1927206