Cobol中的二维可变长度数组

时间:2010-01-25 18:08:11

标签: arrays cobol variable-length

如何在Cobol中定义一个二维MxN数组,其中M和N的长度可变?

以下是尝试在另一个内部使用变量数组时在Net Express中收到的消息:

COBCH0144S OCCURS DEPENDING subsidiary to OCCURS only allowed with ODOSLIDE

2 个答案:

答案 0 :(得分:6)

您要定义的是“复杂发生取决于”结构(复杂ODO)。

您可以定义一个复杂ODO,其中表是rectaguar,如下所示:

       01  TABLE-REC.
05 M PIC S9(4) BINARY. 05 N PIC S9(4) BINARY. 05 ROWS OCCURS 10 TIMES DEPENDING ON M. 10 COLUMNS OCCURS 10 TIMES DEPENDING ON N. 20 CELL PIC X(1).

诀窍是N的声明不能在变量中发生 表的一部分。例如,以下声明:

       01  TABLE-REC.
           05  M             PIC S9(4) BINARY.
           05  ROWS OCCURS 1 TO 10 TIMES DEPENDING ON M.
               10 N          PIC S9(4) BINARY
               10 COLUMNS OCCURS 1 TO 10 TIMES DEPENDING ON N.
                  20 CELL PIC X(1).

会给你一个错误,因为声明暗示每行可能包含不同的行 列数(即不是矩形表)。

一般来说,对于COBOL中的ODO结构存在很多困惑 真的“买”你。它有一个共同但错误的观点 用来节省记忆 因为数据结构的大小可以动态调整大小。这是 当ODO在LOCAL或WORKING STORAGE下声明时,绝对是错误的。 COBOL编译器将分配足够的内存来容纳 M和N的最大值。

它做什么“买”你是一种物理组织数据的机制 在记忆中。看看下面的程序和什么 它显示:

       IDENTIFICATION DIVISION.
         PROGRAM-ID. EXODO.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       77  I                 PIC S9(4) BINARY.
       77  J                 PIC S9(4) BINARY.
       01  DIMENSIONS.
           05  M             PIC S9(4) BINARY VALUE 6.
           05  N             PIC S9(4) BINARY VALUE 7.
       01  TABLE-REC-1.
           05  ROWS OCCURS 1 TO 10 TIMES DEPENDING ON M.
               10 COLUMNS OCCURS 1 TO 10 TIMES DEPENDING ON N.
                  20 CELL PIC X(1).
       01  TABLE-REC-2.
           05  ROWS OCCURS 10 TIMES.
               10 COLUMNS OCCURS 10 TIMES.
                  20 CELL PIC X(1).
       PROCEDURE DIVISION.
           PERFORM VARYING I FROM 1 BY 1 UNTIL I > M
              PERFORM VARYING J FROM 1 BY 1 UNTIL J > N
                 MOVE 'X' TO CELL OF TABLE-REC-1 (I J)
                 MOVE 'X' TO CELL OF TABLE-REC-2 (I J)
              END-PERFORM
           END-PERFORM
           DISPLAY TABLE-REC-1
           DISPLAY TABLE-REC-2
           GOBACK
           .

显示器:

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXX   XXXXXXX   XXXXXXX   XXXXXXX   XXXXXXX   XXXXXXX

请注意,ODO版本已经很好地融入了所有数据 一个6 X 7矩阵,而固定表版本保留10 X 10 矩阵中有一堆“洞”,用来填写每个 行的最大数量为OCCURS。有时候这个 区别很重要(但通常情况并非如此)。

我看到你正在使用Net Express,我不熟悉你 可能不得不摆弄,以使下一部分工作。同 IBM Enterprise COBOL for Z / OS您可以执行以下操作:

在程序LINKAGE SECTION中定义ODO,因此没有内存 被分配,它只是一个记录布局。然后你可以 为表的实际大小动态分配足够的内存 需要(即M次N元素)。使用连接两者 类似于:SET ADDRESS OF ODO-DATA-STRUCTURE TO mem-address (在CICS下使用GETMAIN并在批处理下使用CEEGTST来获取内存)。 现在你有了一个动态数据结构 这确实使用了最小的空间量,仍然可以正确索引 因为上面说明的布局标准。

在COBOL中还有其他使用(或不使用)ODO的方法 这些是我所知道的最常见的。

答案 1 :(得分:1)

您可以通过在您想要去的每个维度级别定义OCCURS.. DEPENDING ON来定义多维可变长度数组。