Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C库返回到GNU COBOL的不可打印整数指针_C_Cobol_Gnucobol - Fatal编程技术网

从C库返回到GNU 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

我学习COBOL只是为了好玩,现在想从我的COBOL源代码(使用GnuCOBOL)调用C函数

我可以很好地调用C函数,但是我的一个函数有一个小问题,它看起来是这样的:(现在它只是用相同的参数包装另一个函数)

我的问题是id变量中返回的值以后不能在COBOL中打印(下面是TSI-id)。例如,返回的值可以是67,如果我用COBOL打印变量,我会得到ascii字符“C”,而不是预期的值0067

COBOL记录如下所示:

   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是一个数字,并且缺少关键字值。