首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C库返回到GNU COBOL的不可打印整数指针

从C库返回到GNU COBOL的不可打印整数指针
EN

Stack Overflow用户
提问于 2016-10-22 16:11:56
回答 3查看 521关注 0票数 12

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

我可以很好地调用C函数,但是我的函数有一个小问题,如下所示:(目前它只是用相同的参数包装另一个函数)。

代码语言:javascript
复制
int getSensors( char * protocol, int protocolLen,
            char * model, int modelLen,
            int * id, int * dataTypes ) {
    return tdSensor(protocol, protocolLen, model, modelLen, id, dataTypes );
}

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

COBOL记录如下所示:

代码语言:javascript
复制
   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).

我的电话是这样的:

代码语言:javascript
复制
       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中工作。这里的代码中有明显的新手错误吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-22 18:16:31

如果返回一个int,就可以直接检查RETURN-CODE变量,根本不需要使用RETURNING子句。

如果您想使用它:一个int映射到retvar USAGE BINARY-LONG

票数 8
EN

Stack Overflow用户

发布于 2016-10-22 18:56:24

对其他评论和答复作出几点澄清。

如前所述,您正在将COBOL USAGE DISPLAYUSAGE BINARY数据字段混合。

试一试

代码语言:javascript
复制
01 TELLSTICK-SENSOR-ITER.                                           
       05 TSI-PROTOCOL     PIC X(50).                               
       05 TSI-MODEL        PIC X(50).                               
       05 TSI-ID           USAGE BINARY-LONG.                       
       05 TSI-DATATYPES    USAGE BINARY-LONG.                       
       05 TSI-RETURN       USAGE BINARY-LONG.                       

为了避免一些重复的神奇编号,将CALL更改为

代码语言:javascript
复制
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,但只有在需要终止范围的ON EXCEPTION条件代码块的情况下,这才是真正必要的。

票数 8
EN

Stack Overflow用户

发布于 2016-10-22 17:15:54

只是一个随机的想法,但是尝试使用comp 5作为int字段。我对确切的语法有些生疏,但它类似于以下内容:

代码语言:javascript
复制
TSI-ID 9999 comp 5.

Comp 5是二进制表示(尝试谷歌搜索获得更多细节)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40194267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档