5

假设我在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变量的增加分配更多的内存。一位同事告诉我不是这样,但他不是 100% 确定。所以我真的很想知道这是如何工作的,以便尽可能有效地构建我的程序。

PS:是的,我正在编写一个新的 COBOL 程序!它实际上是一个 CICS Web 服务。我认为这种语言永远不会消亡:(

4

2 回答 2

7

您没有提及您正在使用哪个编译器,但是,至少在当前的 2002 年 COBOL 标准中,分配给 OCCURS...DEPENDING ON (ODO) 数据项的空间不需要是动态的。(实际上只是数据项的出现次数,而不是长度不同。)尽管您的编译器供应商可能已经实现了标准的扩展,但我不知道有任何供应商在这方面这样做了.

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

于 2010-01-04T18:27:13.283 回答
1

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

尝试以下操作:

首先,移动SOAP-RECORDLINKAGE SECTION. 在链接部分中声明的项目没有为它们分配任何内存。此时您只有一个记录布局。留下 和 ITEM-COUNTSUB-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,每个 SOAP-ITEMS 包含 15 个 SI-SUB-ITEMS。

请注意,该LENGTH OF寄存器SOAP-RECORD 根据 ODO 对象值(ITEM-COUNT、SUB-COUNT)为您提供大小,而不是 OCCURS 的最大数量。

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

于 2010-01-27T18:38:17.907 回答