Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cobol中的组变量_Cobol - Fatal编程技术网

cobol中的组变量

cobol中的组变量,cobol,Cobol,在上述代码中,s1和s2的值是多少?它是保存组变量(05)中给定的值,还是有自己的值?s1和s2不保存值。它们是“命名条件”(所谓的88级),与另一项(条件变量)关联。88级别不定义字段,也不占用记录空间;这仅仅是一个价值定义 命名条件可以在IF语句中使用,并测试条件变量是否等于命名条件的VALUE子句中给定的任何值 SET语句可用于使命名条件为真(通过将其第一个值赋给条件变量) 用法: 01 g1. 05 h1 PIC X VALUE 'N'.

在上述代码中,s1和s2的值是多少?它是保存组变量(05)中给定的值,还是有自己的值?

s1
s2
不保存值。它们是“命名条件”(所谓的88级),与另一项(条件变量)关联。88级别不定义字段,也不占用记录空间;这仅仅是一个价值定义

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

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

用法:

 01  g1.
     05  h1           PIC X   VALUE 'N'.
         88 s1                     VALUE 'Y'.
         88 s2                     VALUE 'N'.
h1
将保存值
'Y'

你可以用它来测试它的价值

如果h1='Y'
或者如果s1

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

SET s1 TO TRUE 

S1和S1是命名条件。它们是否为真取决于H1的值(本例中为G1)

守则:

IF s1 THEN

   //do something
ELSE 

   //do somethingElse
END-IF
将导致H1的值(在您的特定组中为G1)为“Y”。如果您执行:

Set S1 to true
H1(以及G1)的值将是一个字符“N”

可以使用标准的关系条件来测试它们。例如:

Set S2 to true
Bruno涵盖了88级的大部分重要特性,或者命名条件,但我觉得重要的是要提到它们被Cobol程序严重滥用的方式,这些程序无法放弃它们的技能

你会经常看到人们做这样的事情:

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
这是一个非常糟糕的主意,原因如下: -总有一天,有人会“把‘x’移到H1”,把你的一天搞得一团糟 -有人将编写类似“if H1='Y'”的代码,并使其无法扫描命名条件的使用

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

Move 'Y' to H1

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

如果要使用文字测试命名条件,那么给出命名条件有什么意义?完全违背了目的,你说得对!不幸的是,看到这样的代码是很常见的,我只是想说明它们和“是一样的”。我会更新答案。我同意你的看法很普遍。我只是觉得有必要指出,现在没有必要了。好主意,使用未命名的数据项迫使程序员只使用命名的条件。不幸的是,我店里的人比这更聪明。。。他们会使用引用修改来获取未命名的字节,如:
将“X”移动到G1(2:1)
或任何需要的偏移量。是的,他们可以。您可以用任何语言射击自己,但这种方式会促使负责的程序员使用值类型安全的版本。随着时间的推移,它会有所不同。@Joe:如果你这样做,我也会省略“filler”。不再需要了。也可以用G1填充。那么就不可能修改引用:-)我更喜欢使用FILLER,而不是将其留空(“隐式”FILLER)。使用FILLER定义的一件事是在生成的代码中,当引用88时,您看到的是FILLER的引用,而不是dataname,但我认为这对于了解所有引用来说是一个很小的代价。
01 G1
  02 ...
  02 Filler Pic X value 'N'.
    03 S1         value 'Y'.
    03 S2         value 'N'.