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

时间:2016-10-22 16:11:56

标签: c cobol gnucobol

我正在学习COBOL只是为了它的乐趣,现在想从我的COBOL源(使用GnuCOBOL)调用C函数。

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

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记录如下所示:

   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工作。我的代码中是否有明显的新手错误?

3 个答案:

答案 0 :(得分:8)

如果您返回int,则可以直接查看RETURN-CODE变量,并且根本不需要使用RETURNING条款。

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

答案 1 :(得分:8)

对其他评论和答案的一些澄清。

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

尝试

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更改为

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条件代码块且需要终止范围的情况下才能使用{。}}。

答案 2 :(得分:1)

只是一个随机的想法,但尝试使用comp 5作为int字段。我在确切的语法上生锈了,但它类似于:

TSI-ID 9999 comp 5.

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