Cobol中的二维可变长度数组

Jam*_* P. 4 arrays cobol variable-length

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

这是尝试在另一个内部使用变量数组时在Net Express中获得的消息:

COBCH0144S OCCURS DEPENDING subsidiary to OCCURS only allowed with ODOSLIDE
Run Code Online (Sandbox Code Playgroud)

Nea*_*alB 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).

       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×7矩阵,而固定表格版本保留10×10矩阵,其中有一堆"孔",以填充每行到其最大数量

       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).
.有时候这种区别很重要(但通常情况并非如此).

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

在程序中定义ODO,

       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).
因此没有分配内存,它只是一个记录布局.然后,您可以为所需表的实际大小动态分配足够的内存(即M次N个元素).使用以下内容连接两者:( OCCURS 在CICS下使用GETMAIN并在批处理下使用CEEGTST来获取内存).现在你有一个动态数据结构,它确实使用了最小的空间,并且由于上面说明的布局属性,仍然可以正确索引.

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