假设我在WORKING-STORAGE
...
01 SOAP-RECORD.
05 SOAP-INPUT PIC X(8) VALUE SPACES.
05 SOAP-STATUS PIC 9 VALUE ZERO.
05 SOAP-MESSAGE PIC X(50) VALUE SPACES.
05 SOAP-ITEMS OCCURS 0 TO 500 TIMES
DEPENDING ON ITEM-COUNT
INDEXED BY ITEM-X.
10 SI-SUB-ITEMS OCCURS 0 TO 100 TIMES
DEPENDING ON SUB-COUNT
INDEXED BY SUB-X.
15 SS-KEY PIC X(8) VALUE SPACES.
15 SS-AMOUNT PIC -9(7).99 VALUE ZEROS.
15 SS-DESCR PIC x(100) VALUE SPACES.
当这个程序运行时,它最初是否会分配这个表可能需要的空间,还是分配内存更动态?我猜想DEPENDING ON
子句会使它更具动态性,因为它会在ITEM-COUNT
变量递增时分配更多内存。一位同事告诉我,但他不是百分百肯定。所以我真的想知道这是如何工作的,以便尽可能有效地构建我的程序。
PS:是的,我我正在编写一个新的COBOL程序!它实际上是一个CICS Web服务。我认为这种语言永远不会死:(
答案 0 :(得分:6)
您没有提到您正在使用的编译器,但是,至少通过当前的2002 COBOL标准,为OCCURS分配的空间......不需要依赖于(ODO)数据项动态。 (实际上只是数据项的出现次数而不是长度变化。)虽然您的编译器供应商可能已经实现了标准的扩展,但我不知道任何供应商在此领域已经这样做了
标准的下一个但尚未批准的修订包括支持具有新OCCURS DYNAMIC格式的动态容量表。
答案 1 :(得分:1)
在CICS世界中,OCCURS DEPENDING ON(ODO)可用于创建
在运行时动态调整大小的表。但是,你宣布的方式
SOAP-RECORD
将分配足够的内存来保存最大大小的记录。
尝试以下方法:
首先,将SOAP-RECORD
移至LINKAGE SECTION
。声明的项目
在链接部分没有为它们分配任何内存。在这
指出你只有一个记录布局。留下声明
ITEM-COUNT
中的SUB-COUNT
和WORKING-STORAGE
。
接下来,在WORKING-STORAGE
中声明指针和长度,如:
77 SOAP-PTR USAGE POINTER.
77 SOAP-LENGTH PIC S9(8) BINARY.
最后在PROCEDURE DIVISION
:设置数组的大小
一些实际价值的维度;分配
适量的内存然后连接两个。例如:
MOVE 200 TO ITEM-COUNT
MOVE 15 TO SUB-COUNT
MOVE LENGTH OF SOAP-RECORD TO SOAP-LENGTH
EXEC CICS GETMAIN
BELOW
USERDATAKEY
SET(SOAP-PTR)
FLENGTH(SOAP-LENGTH)
END-EXEC
SET ADDRESS OF SOAP-RECORD TO SOAP-PTR
这将只分配足够的内存来存储带有200个SOAP-ITEMS的SOAP-RECORD 每个包含15个SI-SUB-ITEMS。
请注意,LENGTH OF
注册表的大小为SOAP-RECORD
基于ODO对象值(ITEM-COUNT,SUB-COUNT)而不是
OCCURS的最大数量。
非常重要......完成后不要忘记释放内存!