cobol中的组变量

Dob*_*bby 2 cobol

 01  g1.
     05  h1           PIC X   VALUE 'N'.
         88 s1                     VALUE 'Y'.
         88 s2                     VALUE 'N'.
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*ger 6

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

代码:

Set S1 to true
Run Code Online (Sandbox Code Playgroud)

将导致H1的值(在特定组的情况下为G1)为'Y'.如果你执行:

Set S2 to true
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

Move 'Y' to H1
Run Code Online (Sandbox Code Playgroud)

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

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

01 G1
  02 ...
  02 Filler Pic X value 'N'.
    03 S1         value 'Y'.
    03 S2         value 'N'. 
Run Code Online (Sandbox Code Playgroud)

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