使用 PERFORM VARYING 时表溢出

问题描述 投票:0回答:1

我正在做一个简单的 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 重新启动。

cobol
1个回答
1
投票

问题描述

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

© www.soinside.com 2019 - 2024. All rights reserved.