如何在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
相关产品推荐
相关产品推荐

