您如何在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的方法,但是
这些是我所知道的最常见的。