You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GnuCOBOL中按值传递long类型给C函数?

GnuCOBOL调用C函数传递long类型按值的问题解决

问题场景

我尝试将long类型按值传递给C函数,但运行时C函数收到的是异常大的数字(疑似指针地址),而非预期的数值。相关测试代码与运行信息如下:

C函数代码

#include <stdio.h>
long addone (long x) {
        printf("c got %li\n", x);
        fflush(stdout);
        return 1+x;
}

COBOL代码

identification division.
program-id. ccalltest.
data division.
working-storage section.
01      my-val  usage binary-long.
01      my-rc   usage binary-long.
procedure division.
move 10 to my-val.
call 'addone' using 
        by content my-val
        giving my-rc.
display my-val.
display my-rc.
stop run.

编译命令

cobc -x -free cobolcode.cob ccode.c -lc

运行输出示例

c got 140725928122192
+0000000010
+1324668753

使用环境:GnuCOBOL 3.1.2.0、GCC 14.2.1


问题原因

你误用了BY CONTENT参数传递方式。在GnuCOBOL中,BY CONTENT会创建数据的副本,并传递指向该副本的指针,而非直接传递数据的值。而你的C函数期望接收的是long类型的数值,因此收到的指针地址被解析成了异常大的数值,返回值也因此错乱。

修复方案

将BY CONTENT替换为BY VALUE,这是GnuCOBOL中专门用于按值传递参数的方式,完全匹配C函数的按值参数接收逻辑:

修改后的COBOL代码片段:

call 'addone' using 
        by value my-val
        giving my-rc.

额外验证

GnuCOBOL的USAGE BINARY-LONG对应64位带符号整数,和64位系统中GCC的long类型(通常也是64位)完全匹配,无需调整变量类型。修改后重新编译运行,C函数将正确收到10,返回值也会是预期的11。

内容的提问来源于stack exchange,提问作者Harris M Snyder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:57:14