我正在做一个简单的 PERFORM VARYING WS-IND FROM 1 BY 1
以下是我的代码:
PERFORM VARYING WS-INDICE FROM 1 BY 1
UNTIL WS-INDICE > 9
OR TEST-OBJEC(WS-INDICE) = SPACES
MOVE TEST-OBJEC(WS-INDICE) TO WS-VAL-OBJEC(WS-INDICE)
MOVE TEST-DATE(WS-INDICE) TO WS-DAT-OBJEC(WS-INDICE)
END-PERFORM
索引是这样声明的:
01 WS-INDICE PIC 9(01).
下面是我的数组的声明
10 TEST-GROUP
OCCURS 009.
15 TEST-OBJEC PICTURE X(01).
15 TEST-DATE PICTURE X(8).
10 FILLER PICTURE X(56).
我的问题是 WS-INDICE 直到 9 才到达并从 0 重新启动。
问题描述
WS-INDICE 到达 9 点并从 0 点重新启动
代码
VARYING WS-INDICE FROM 1 BY 1
UNTIL WS-INDICE > 9
问题原因
编译器既不会警告可能永远不会成立的条件,也会溢出(COBOL 标准说“引发异常且不更改值”)。
...因为定义
WS-INDICE PIC 9(01).
此变量不能容纳多于一位数字,并且永远不能大于 9(排除有人将
x'99'
移动到该位置,插入无效数据的可能性)。
调整定义以使用
PIC 99
,一切都很好。
并可能考虑使用常量来代替:
10 TEST-GROUP
- OCCURS 009.
+ OCCURS WS-INDICE-MAX.
PERFORM VARYING WS-INDICE FROM 1 BY 1
- UNTIL WS-INDICE > 9
+ UNTIL WS-INDICE > WS-INDICE-MAX
为此,您需要支持通用 PC 扩展“78 级常量”或支持“COBOL 2002 常量”的编译器:
78 WS-INDICE-MAX VALUE 9.
01 integer-constant CONSTANT AS 9.
...并可能考虑使用另一个编译器以获得更好的警告(否则您不需要使用它),例如使用 GnuCOBOL 3+ 和
cobc -W -frelax-syntax-checks -fsyntax-only
:
警告:“WS-INDICE”不得大于 9