例如,如果一个字符串是“工作”,我必须访问第三个字符并存储它。在 C 中可以这样做:
char data[5] = "work";
char temp = data[2];
变量temp
将具有值'r'
。现在我需要在 COBOL 中实现等价。
首先要了解的是数组索引在 C 中基于零,在 COBOL 中基于 1。
接下来 COBOL 和 C 有非常不同的方式来表示字符串。在 C 中,字符串通常存储为字符数组,字符串的结尾通常使用二进制零(空 \0)表示。COBOL 没有这样的约定。字符串存储在指定长度的命名数据项中。这些项目通常在 WORKING-STORAGE 下声明,并具有与它们关联的类型为“X”的 PICTURE 子句(PICTURE 子句还有其他几种可能性,但“X”代表任何类型的字符)。例如:
01 MY-VARIABLE PIC X(20).
名为 MY-VARIABLE 的工作存储变量声明为 20 个字符长。它可以在 PROCEDURE DIVISION 中分配一个值,如下所示。
MOVE 'work' TO MY-VARIABLE
然后,您可以使用称为引用修改的技术访问此字符串(或子字符串)的各种字符:
DISPLAY MY-VARIABLE(3:1)
将显示 MY-VARIABLE 的第三个字符(基于 1 的索引),即“r”。上面括号中的第一个数字 (3) 表示从变量开头的偏移量,第二个数字是从该位置 (1) 开始的字符数。
还有其他方法可以做到这一点,例如 REDEFINES,其中 MY-VARIABLE 可以重新定义为 20 个 1 字符单元格的数组。这是一个有点过时的机制,所以我鼓励使用引用修改来访问部分字符串。
重新回答。尽管提到了“字符串”,但我认为您正在谈论可能被称为“字段”的内容,即一段数据。
01 a-piece-of-data.
05 first-two-bytes-of-data PIC XX.
05 third-byte-of-data PIC X.
05 fourth-byte-of-data PIC X.
a-piece-of-data 是一个“组项”,它有四个字节长。“从属”定义允许您访问四个字节中的各个字节。
可以这样做:
01 a-piece-of-data PIC X(4).
01 FILLER REDEFINES a-piece-of-data.
05 first-two-bytes-of-data PIC XX.
05 third-byte-of-data PIC X.
05 fourth-byte-of-data PIC X.
它可以通过“下标”来完成:
01 a-piece-of-data.
05 FILLER OCCURS 4 TIMES.
10 a-byte-in-the-piece-of-data PIC X.
现在,
a-byte-in-the-piece-of-data ( 3 )
引用数据的第三个字节。
下标可以使用如图所示的文字或数据名称(您以正常方式定义的名称和存储,必须是数字,最好是二进制)或索引名称(使用 INDEXED BY,您定义名称,但编译器定义存储)。
正如 NealB 所示,它也可以通过参考修改来完成。
对我来说,选择通常归结为“下一个人最清楚哪个?”。
01 WHAREHOUSE-REF.
05 WHAREHOUSE-CODE PIC XX.
88 WHAREHOUSE-HAS-LIFT VALUE "LN" "CV".
05 WHAREHOUSE-FLOOR PIC X.
88 WHAREHOUSE-UPPER-FLOOR VALUE "1" "2".
05 WHAREHOUSE-BAY PIC X.
01 W-LIFT-USAGE PIC X.
88 W-LIFT-USAGE-NONE VALUE ZERO.
IF WHAREHOUSE-HAS-LIFT
AND WHAREHOUSE-UPPER-FLOOR
MOVE WHAREHOUSE-FLOOR TO W-LIFT-USAGE
ELSE
SET W-LIFT-USAGE-NONE TO TRUE
END-IF
PERFORM CALC-ROBOT-TIME-TO-BAY
哪个与(或者是?,您每次都可以查看手册)相同:
01 VAR1 PIC X(4).
01 VAR2 PIC X.
IF VAR1 (1:2) = "LN" OR "CV"
AND VAR1 (3:1) = "1" OR "2"
MOVE VAR1 (3:1) TO VAR2 (1:1)
ELSE
MOVE ZERO TO VAR2 (1:1)
END-IF
PERFORM CALC-ROUTINE THROUGH CALC-ROUTINE-EXIT
PS。我知道 VAR2,但根据我的经验,有多少没有使用参考修改经验的人会编写它。您还会看到 VAR2 (1:),而只需要一个普通的 VAR2。是的,选择的名称是似乎与参考修改齐头并进且没有经验的名称类型。