COBOL 中的动态内存分配



我有一个通用的C函数,我想从C,Fortran和COBOL调用它。它从数据库中获取 x 字节的数据,并将其放在提供给它的 char 指针中。我下面的示例获取 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);
}

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

char *mydata;
mydata = malloc(1024);
fetch_data(mydata);
// Do something with the data.
free(mydata);

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

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

但是如何在 COBOL 中分配和释放动态内存呢?我一直无法找到用于此目的的内置函数/程序。

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

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

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

如果你想使用真正的动态内存分配,你的意思是标准的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

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

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

一个非常旧的编译器示例(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".

显示(修剪)为:

abcdabcdabcdabcd...(for 1024 characters total)

也许这会有所帮助。

如果您不需要内存中的整个数据,请考虑逐块工作:在 COBOL 中分配固定大小的存储,使用 C 函数将一个块提取到其中,使用它并循环以继续下一个块。这样,您可以完全避免分配动态内存。

如果你在 Z 上或使用 Gnu Cobol,你可以简单地调用 malloc():

CALL "malloc" USING BY VALUE MEM-SIZE
RETURNING MEM-PTR.
CALL "free" USING BY VALUE MEM-PTR.

最新更新