cobol中的组变量

时间:2011-08-04 06:41:51

标签: cobol

 01  g1.
     05  h1           PIC X   VALUE 'N'.
         88 s1                     VALUE 'Y'.
         88 s2                     VALUE 'N'.

在上面的代码中,s1和s2的值是多少?它是否保持组变量(05)中给出的值,或者它将具有自己的值?

2 个答案:

答案 0 :(得分:6)

S1和S1是命名条件。根据H1的值(或在这种情况下为G1),它们将成立或不成立。

代码:

Set S1 to true

将导致H1(以及特定组中的G1)的值为“Y”。如果你执行:

Set S2 to true

H1(和G1再次)的值将是一个字符'N'。

这些可以使用标准关系条件进行测试。例如:

Evaluate true
  when S1
    Display "S1 is true"
  when S2
    Display "S2 is true"
End-Evaluate

If S1
  Display "S1 is true"
Else
  Display "S1 is false"
End-If

布鲁诺涵盖了88级或命名条件的大部分重要特征,但我觉得提及他们被Cobol程序严重滥用的方式很重要,因为Cobol程序无法放弃他们1974年的技能。

您经常会看到人们做的事情如下:

Move 'Y' to H1

出于以下几个原因,这是一个非常糟糕的主意:   - 总有一天,有人会“向'移动'到'H1'并且真的搞乱了你的一天   - 有人会编写类似“如果H1 ='Y'”的代码,并且无法扫描您指定条件的使用情况

有一种方法可以避免这种情况,在命名条件下使用未命名的字节。如果您的数据项如下所示:

01 G1
  02 ...
  02 Filler Pic X value 'N'.
    03 S1         value 'Y'.
    03 S2         value 'N'. 

通过跳过H1上的名称,您可以强制使用数据布局的其他程序员使用您指定的条件S1和S2。这有很多好处,其中最主要的是您可以随时扫描源存储库以查找命名条件,并且可以轻松识别所有更改。

答案 1 :(得分:4)

s1s2没有值。它们是“命名条件”(所谓的88级)并且与另一个项目(条件变量)相关联。 88级别没有定义一个字段,并且不占用记录空间;它只是一个价值定义。

命名条件可以在IF语句中使用,并测试条件变量是否等于命名条件的VALUE子句中给出的任何值。

SET语句可用于使命名条件为TRUE(通过将其第一个值赋给条件变量)。

用法:

SET s1 TO TRUE 

h1将保留值'Y'

你可以用

测试它的值

IF h1 = 'Y'或简称IF s1

编辑:正如Joe Zitzelberger在他的回答中提到的,测试条件变量的正确方法是使用命名条件。

IF s1 THEN

   //do something
ELSE 

   //do somethingElse
END-IF