代码之家  ›  专栏  ›  技术社区  ›  Josh Stodola

可变长度表中的内存分配

  •  4
  • Josh Stodola  · 技术社区  · 15 年前

    假设我在 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程序!它实际上是一个CICSWeb服务。我认为这种语言永远不会消失:(

    2 回复  |  直到 15 年前
        1
  •  6
  •   Bruce Hobbs    15 年前

    您没有提到正在使用的编译器,但是,至少在当前的COBOL标准2002中,分配给发生的空间…取决于(odo)数据项,不需要动态的。(实际上只是数据项的出现次数,而不是长度不同。)虽然您的编译器供应商可能已经实现了标准的扩展,但我不知道在这方面有任何供应商这样做。

    下一个,但尚未批准的标准修订包括对动态容量表的支持,新的动态格式出现了。

        2
  •  1
  •   Josh Stodola    15 年前

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

    尝试以下操作:

    首先,移动 皂液记录 进入之内 LINKAGE SECTION . 申报项目 在“链接”部分没有为它们分配任何内存。在这 点您只有一个记录布局。离开声明 ITEM-COUNT SUB-COUNT 在里面 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项的SOAP记录。 每个包含15个SI子项。

    请注意 LENGTH OF 寄存器给你的大小 皂液记录 基于ODO对象值(项目计数、子计数),而不是 发生的最大数目。

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