首页 文章

COBOL中的动态内存分配

提问于
浏览
3

我有一个常见的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 回答

  • 4

    因为你只谈了“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
    

    如果你不必使用实现者特定的例程(通常通过 CALL )来获取/释放内存 .

    • MicroFocus / NetCOBOL(见Rick的回答): CBL_ALLOC_MEM / CBL_FREE_MEM[2]

    • ACUCOBOL: M$ALLOC / M$FREE

    • IBM: CEEGTST

    • ...查看您的实施者手册......

  • 3

    使用非常旧的编译器(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)
    

    也许这会有所帮助 .

  • 2

    如果你不需要内存中的整个数据,那么考虑使用chunk-by-chunk:在COBOL中分配固定大小的存储,使用C函数获取一个块,使用它并循环以继续下一个块 . 这样就可以避免完全分配动态内存 .

相关问题