可变长度表中的内存分配

时间:2010-01-04 17:04:15

标签: cobol

假设我在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服务。我认为这种语言永远不会死:(

2 个答案:

答案 0 :(得分:6)

您没有提到您正在使用的编译器,但是,至少通过当前的2002 COBOL标准,为OCCURS分配的空间......不需要依赖于(ODO)数据项动态。 (实际上只是数据项的出现次数而不是长度变化。)虽然您的编译器供应商可能已经实现了标准的扩展,但我不知道任何供应商在此领域已经这样做了

标准的下一个但尚未批准的修订包括支持具有新OCCURS DYNAMIC格式的动态容量表。

答案 1 :(得分:1)

在CICS世界中,OCCURS DEPENDING ON(ODO)可用于创建 在运行时动态调整大小的表。但是,你宣布的方式 SOAP-RECORD将分配足够的内存来保存最大大小的记录。

尝试以下方法:

首先,将SOAP-RECORD移至LINKAGE SECTION。声明的项目 在链接部分没有为它们分配任何内存。在这 指出你只有一个记录布局。留下声明 ITEM-COUNT中的SUB-COUNTWORKING-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的最大数量。

非常重要......完成后不要忘记释放内存!