如何在Cobol中定义一个二维MxN数组,其中M和N的长度可变?
以下是尝试在另一个内部使用变量数组时在Net Express中收到的消息:
COBCH0144S OCCURS DEPENDING subsidiary to OCCURS only allowed with ODOSLIDE
答案 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来定义多维可变长度数组。