我有一个常见的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之外的数据 .
3 回答
因为你只谈了“COBOL”而没有指明任何实际的实现,我认为你的意思是“标准COBOL” .
这可能意味着COBOL85 - 它没有此功能,但允许您只定义
DATA-FOR-C PIC X(1024)
并将其作为参考传递(COBOL85实际上没有指定调用C空间的任何内容,但这应该适用于大多数(如果不是所有的)COBOL实现) . 注意:这实际上是Acorns答案的更多细节 .如果你想使用真正的动态内存分配,你的意思是标准的COBOL - COBOL 2002没有问题,因为它引入了语句
ALLOCATE
和FREE
(注意:这实际上是roygvib和Rick的评论的细节):如果你不必使用实现者特定的例程(通常通过
CALL
)来获取/释放内存 .MicroFocus / NetCOBOL(见Rick的回答):
CBL_ALLOC_MEM
/CBL_FREE_MEM[2]
ACUCOBOL:
M$ALLOC
/M$FREE
IBM:
CEEGTST
...查看您的实施者手册......
使用非常旧的编译器(Micro Focus COBOL v3.2.50)的一个示例 . 其中大部分直接来自补充材料 . 由于我没有同样可用的旧C编译器,因此我将COBOL程序作为一个替代品 .
显示(修剪)是:
也许这会有所帮助 .
如果你不需要内存中的整个数据,那么考虑使用chunk-by-chunk:在COBOL中分配固定大小的存储,使用C函数获取一个块,使用它并循环以继续下一个块 . 这样就可以避免完全分配动态内存 .