您如何在Cobol中定义M和N均为可变长度的二维MxN数组?

这是我在Net Express中尝试在另一个内部包含变量数组时收到的消息:

COBCH0144S OCCURS DEPENDING subsidiary to OCCURS only allowed with ODOSLIDE

最佳答案

您要定义的是“依赖于复杂项”结构(复杂的ODO)。

您可以定义复杂的ODO,其中表是矩形的,如下所示:

       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时,绝对为假。
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的方法,但是
这些是我所知道的最常见的。

07-26 00:20