从C库返回到GNU COBOL的不可打印整数指针
我学习COBOL只是为了好玩,现在想从我的COBOL源代码(使用GnuCOBOL)调用C函数 我可以很好地调用C函数,但是我的一个函数有一个小问题,它看起来是这样的:(现在它只是用相同的参数包装另一个函数) 我的问题是id变量中返回的值以后不能在COBOL中打印(下面是TSI-id)。例如,返回的值可以是67,如果我用COBOL打印变量,我会得到ascii字符“C”,而不是预期的值0067 COBOL记录如下所示:从C库返回到GNU COBOL的不可打印整数指针,c,cobol,gnucobol,C,Cobol,Gnucobol,我学习COBOL只是为了好玩,现在想从我的COBOL源代码(使用GnuCOBOL)调用C函数 我可以很好地调用C函数,但是我的一个函数有一个小问题,它看起来是这样的:(现在它只是用相同的参数包装另一个函数) 我的问题是id变量中返回的值以后不能在COBOL中打印(下面是TSI-id)。例如,返回的值可以是67,如果我用COBOL打印变量,我会得到ascii字符“C”,而不是预期的值0067 COBOL记录如下所示: 01 TELLSTICK-SENSOR-ITER. 05 T
01 TELLSTICK-SENSOR-ITER.
05 TSI-PROTOCOL PIC X(50).
05 TSI-MODEL PIC X(50).
05 TSI-ID PIC 9(4).
05 TSI-DATATYPES PIC 9(4).
05 TSI-RETURN PIC S9(4).
CALL "getSensors" USING
BY REFERENCE TSI-PROTOCOL BY VALUE 50
BY REFERENCE TSI-MODEL BY VALUE 50
BY REFERENCE TSI-ID
BY REFERENCE TSI-DATATYPES
RETURNING TSI-RETURN.
我的电话是这样的:
01 TELLSTICK-SENSOR-ITER.
05 TSI-PROTOCOL PIC X(50).
05 TSI-MODEL PIC X(50).
05 TSI-ID PIC 9(4).
05 TSI-DATATYPES PIC 9(4).
05 TSI-RETURN PIC S9(4).
CALL "getSensors" USING
BY REFERENCE TSI-PROTOCOL BY VALUE 50
BY REFERENCE TSI-MODEL BY VALUE 50
BY REFERENCE TSI-ID
BY REFERENCE TSI-DATATYPES
RETURNING TSI-RETURN.
我是COBOL新手,我的C语言技能已经相当生疏,因为我通常在Java中工作。我的代码中是否存在明显的新手错误?只是一个随机想法,但尝试使用comp 5作为int字段。我对确切的语法感到生疏,但与此类似:
TSI-ID 9999 comp 5.
Comp 5是二进制表示法(请尝试谷歌搜索以获取更多详细信息)如果返回
int
,则可以直接检查return-code
变量,而无需使用RETURNING
子句
如果您想使用它:一个
int
映射到retvar USAGE BINARY-LONG
关于其他注释和答案的一些澄清
如前所述,您正在将COBOL用法显示
与用法二进制
数据字段混合使用
试一试
为了避免一点重复的魔法编号,将调用更改为
CALL "getSensors" USING
BY REFERENCE TSI-PROTOCOL BY VALUE LENGTH OF TSI-PROTOCOL
BY REFERENCE TSI-MODEL BY VALUE LENGTH OF TSI-MODEL
BY REFERENCE TSI-ID
BY REFERENCE TSI-DATATYPES
RETURNING TSI-RETURN
我还删除了call语句中的终止期限,原因是;如果在if
块中移动该代码,则不必担心终止句号。如果你愿意,可以使用END-CALL
,但只有当你有异常
条件代码块需要终止作用域时,这才是真正必要的。UV表示同一句话中的“cobol”和“just for fun:”),更重要的是,也表示语言间接口,这很棘手。请检查PIC 9(4)的内存表示。我使用COBOL已经25年多了,但IIRC PIC 9(4)并没有存储为int。因此,不能在C中为整数赋值,并期望它在COBOL中看起来正常。也许可以将C-int转换为ASCII数字的非终止的4字节字符串?a您得到的正好是X'67',这是ASCII的“C”?没有前导空格或尾随空格或其他任何内容?基本上,您必须用与C程序定义数据完全相同的方式在COBOL程序中描述数据。同样的长度,同样的类型。查看Gary Cutler的GnuCOBOL V2用户指南(如果您还没有使用V2,您应该使用V2),了解可用的用法。感谢各位,您的输入将我推向了正确的方向!UV,这是一个很好的问题,可以向我们介绍嵌入式COBOL,这是物联网部门未来的语言。将PIC9(4)改为二进制语言解决了这个问题。因为它看起来像tdSensor函数从来不会返回大于255的任何值,所以我切换为二进制字符无符号。谢谢谢谢通过这些回答和评论,我学到了很多东西!:)@Deps,那么你可能会喜欢,是的,但我相信它是comp-5,否则编译器会认为5是一个数字,并且缺少关键字值。