
Example: ALLOCATE and FREE storage for UNBOUNDED tables
This example illustrates one way to manage an UNBOUNDED table that needs to be dynamically increased in size by using the ALLOCATE and FREE statements.

ID DIVISION.
PROGRAM-ID. ALLOC.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 X PIC 9(2) PACKED-DECIMAL.
77 NUM-ELEMENTS PIC 9(4) BINARY.
77 SIZE-NEEDED PIC 9(4) BINARY.
77 VPTR POINTER.
LINKAGE SECTION.
01 VARGRP.
02 OBJ PIC 9(4) COMP.
02 TABGRP.
03 VARTAB OCCURS 1 TO UNBOUNDED DEPENDING ON OBJ.
04 T1 PIC 9(4).
04 T2 PIC X(8).
04 T3 PIC 9(4) COMP.
01 BUFFER PIC X(1000).
PROCEDURE DIVISION.
DISPLAY ’Starting testcase ALLOC’
SET VPTR To NULL
*************************************************************
* Allocate a table with 20 elements
*************************************************************
COMPUTE NUM-ELEMENTS = 20
PERFORM ALLOC-VARGRP
*************************************************************
* Set some ’test’ values to validate re-allocated table
*************************************************************
COMPUTE T1(12) = 9999
MOVE ’HI MOM’ TO T2 (17)
DISPLAY ’ ’
DISPLAY ’VARTAB(12) = ’ VARTAB(12)
DISPLAY ’VARTAB(17) = ’ VARTAB(17)
DISPLAY ’ ’
*************************************************************
* Need a bigger table! Allocate a larger one and copy data
*************************************************************
COMPUTE NUM-ELEMENTS = 30
PERFORM ALLOC-VARGRP
*************************************************************
* Ensure that new table has correct data from original
*************************************************************
DISPLAY ’VARTAB(12) = ’ VARTAB(12)
DISPLAY ’VARTAB(17) = ’ VARTAB(17)
GOBACK.
*************************************************************
* The first time allocate the original table. If the table
* has already been allocated, assume that we are allocating
* a larger one and want to copy the data over to it
*************************************************************
ALLOC-VARGRP.
If VPTR = NULL Then *> If first time, allocate the table
COMPUTE SIZE-NEEDED = LENGTH OF OBJ +
LENGTH OF VARTAB * NUM-ELEMENTS
ALLOCATE SIZE-NEEDED CHARACTERS INITIALIZED RETURNING VPTR
SET ADDRESS OF VARGRP TO VPTR
MOVE NUM-ELEMENTS TO OBJ
Else *> If already have a table, doing re-size
*********************************************************************
* Re-size it!
* First, map BUFFER on current table
*********************************************************************
SET ADDRESS OF BUFFER TO VPTR
*********************************************************************
* Calculate new size from NUM-ElEMENTS
*********************************************************************
COMPUTE SIZE-NEEDED = LENGTH OF OBJ +
LENGTH OF VARTAB * NUM-ELEMENTS
ALLOCATE SIZE-NEEDED CHARACTERS INITIALIZED RETURNING VPTR
*************************************************************
* Move data from old table to new larger table
*************************************************************
SET ADDRESS OF VARGRP TO VPTR
MOVE NUM-ELEMENTS TO OBJ
MOVE BUFFER(1:SIZE-NEEDED) TO VARGRP
*************************************************************
* Free the original table
************************************************************
SET VPTR TO ADDRESS OF BUFFER
FREE VPTR
.

related references
ALLOCATE statement
FREE statement
MOVE statement
Working with unbounded tables and groups (Enterprise COBOL Programming Guide)
ALLOCATE statement
FREE statement
MOVE statement
Working with unbounded tables and groups (Enterprise COBOL Programming Guide)
