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)
您要定义的是"复杂发生取决于"结构(复杂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,因此没有分配内存,它只是一个记录布局.然后,您可以为所需表的实际大小动态分配足够的内存(即M次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).
OCCURS
在CICS下使用GETMAIN并在批处理下使用CEEGTST来获取内存).现在你有一个动态数据结构,它确实使用了最小的空间,并且由于上面说明的布局属性,仍然可以正确索引.
在COBOL中还有其他使用(或不使用)ODO的方法,但这些是我所知道的最常见的方法.
| 归档时间: |
|
| 查看次数: |
29014 次 |
| 最近记录: |