Распределение памяти в таблицах переменной длины - PullRequest
4 голосов
/ 04 января 2010

Скажем, у меня есть следующая таблица переменной длины, определенная в 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. Я не думаю, что этот язык когда-нибудь умрет: (

Ответы [ 2 ]

6 голосов
/ 04 января 2010

Вы не упоминаете, какой компилятор вы используете, но, по крайней мере до текущего 2002 года, стандарта COBOL, пространство, выделенное для элемента данных OCCURS ... DEPENDING ON (ODO), не обязательно должно быть динамичный. (На самом деле меняется только количество вхождений, а не длина элемента данных.) Хотя ваш поставщик компиляторов, возможно, внедрил расширение к стандарту, я не знаю ни одного поставщика, который бы делал это в этой области .

Следующая, но еще не утвержденная, редакция стандарта включает поддержку таблиц динамической емкости с новым форматом OCCURS DYNAMIC.

1 голос
/ 27 января 2010

В мире CICS OCCURS в зависимости от (ODO) может использоваться для создания таблица, которая динамически измеряется во время выполнения. Тем не менее, как вы заявляете SOAP-RECORD выделит достаточно памяти для хранения записи максимального размера.

Попробуйте следующее:

Сначала переместите SOAP-RECORD в LINKAGE SECTION. Предметы заявлены в разделе связей нет выделенной для них памяти. В этот Точка у вас есть только макет записи. Оставьте декларацию ITEM-COUNT и SUB-COUNT in 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

Это выделит только достаточно памяти для хранения SOAP-записи с 200 SOAP-ITEMS. каждый из которых содержит 15 SI-СУБ-ЭЛЕМЕНТОВ.

Обратите внимание, что регистр LENGTH OF дает размер SOAP-RECORD на основе значений объекта ODO (ITEM-COUNT, SUB-COUNT), а не максимальное количество OCCURS.

Очень важно ... Не забудьте освободить память, когда закончите!

...