COBOL 中的动态内存分配

Hel*_*ena 3 cobol dynamic-memory-allocation

我有一个通用的 C 函数,我想从 C、Fortran 和 COBOL 调用它。它从数据库中获取 x 字节的数据并将其放置在提供给它的字符指针中。我下面的示例获取 1024 字节,但在实际情况中,我希望能够获取比 1024 字节更大的数据块,因此需要动态内存分配。

void fetch_data(char *fetched)
{
    static struct {unsigned long data_length; char some_data[1024];} a_struct;
    // Fetch data into a_struct.
    memcpy(fetched, &(a_struct.some_data), 1024);
}
Run Code Online (Sandbox Code Playgroud)

我能够从 C 成功调用这个函数。

char *mydata;
mydata = malloc(1024);
fetch_data(mydata);
// Do something with the data.
free(mydata);
Run Code Online (Sandbox Code Playgroud)

我还能够从 Fortran 成功调用此函数。

INTEGER*4, ALLOCATABLE :: MYDATA(:)
ALLOCATE(MYDATA(1024))
CALL FETCH_DATA(MYDATA)    
// Do something with the data.
DEALLOCATE(MYDATA)
Run Code Online (Sandbox Code Playgroud)

但是如何在 COBOL 中分配和释放动态内存?为此,我一直无法找到内置函数/过程。

我也没有看到 C 可以处理 Fortran 和 COBOL 的分配和解除分配的替代方案,因为它们需要访问 C 之外的数据。

Ric*_*ith 6

一个使用非常旧的编译器的示例 (Micro Focus COBOL v3.2.50)。其中大部分直接取自补充材料。由于我没有可用的同样旧的 C 编译器,因此我包含了一个 COBOL 程序作为替代。

   program-id. dynam.
   data division.
   working-storage section.
   1 ptr pointer.
   1 mem-size pic x(4) comp-5 value 1024.
   1 flags pic x(4) comp-5 value 1.
   1 status-code pic x(2) comp-5.
   linkage section.
   1 mem pic x(1024).
   procedure division.
       call "CBL_ALLOC_MEM" using ptr
           by value mem-size flags
         returning status-code
       if status-code not = 0
           display "memory allocation failed"
           stop run
       else
           set address of mem to ptr
       end-if

       call "fetch_data" using mem
       display mem

       call "CBL_FREE_MEM" using mem
         returning status-code
       if status-code not = 0
           display "memory deallocation failed"
           stop run
       else
           set address of mem to null
       end-if
       stop run
       .
   end program dynam.

   program-id. "fetch_data".
   data division.
   working-storage section.
   1 some-struct pic x(1024) value all "abcd".
   linkage section.
   1 mem pic x(1024).
   procedure division using mem.
       move some-struct to mem
       exit program
       .
   end program "fetch_data".
Run Code Online (Sandbox Code Playgroud)

显示(已修剪)为:

 abcdabcdabcdabcd...(for 1024 characters total)
Run Code Online (Sandbox Code Playgroud)

也许这会有所帮助。


Sim*_*sch 5

由于您只讨论了“COBOL”而没有指定任何实际实现,因此我假设您的意思是“标准 COBOL”。

这可能意味着 COBOL85 - 它没有此功能,但允许您只定义DATA-FOR-C PIC X(1024)并将其作为参考传递(COBOL85 实际上没有指定任何有关调用 C 空间的内容,但这应该适用于大多数(如果不是全部)COBOL 实现)。注意:这实际上是 Acorns 答案的更多细节。

如果您想使用真正的动态内存分配并且您的意思是标准 COBOL - COBOL 2002 没有问题,因为它引入了语句ALLOCATEFREE(注意:这实际上是来自 roygvib 和 Rick 的评论的详细信息):

77 pointer-variable  USAGE POINTER.
77 address-holder    PIC X BASED.

ALLOCATE variable-number CHARACTERS RETURNING pointer-variable
SET ADDRESS OF address-holder TO pointer-variable
CALL "fetch_data" USING address-holder
PERFORM stuff
FREE pointer-variable
Run Code Online (Sandbox Code Playgroud)

如果您不使用支持这些语句的 COBOL 实现,则必须使用实现者特定的例程(通常通过CALL)来获取/释放内存。

  • MicroFocus/NetCOBOL(见 Rick 的回答):CBL_ALLOC_MEM/CBL_FREE_MEM[2]
  • ACUCOBOL:M$ALLOC/M$FREE
  • IBM: CEEGTST
  • 任何允许直接调用 C 函数的 COBOL 编译器和运行时(这可能会增加额外的需求,为这些函数指定适当的 CALL-CONVENTION):malloc/free
  • ... 请参阅您的实施者手册 ...