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

Dep*_*eps 12 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 );
}
Run Code Online (Sandbox Code Playgroud)

我的问题是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).
Run Code Online (Sandbox Code Playgroud)

我的电话看起来像这样:

       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.
Run Code Online (Sandbox Code Playgroud)

我是COBOL的新手,我的C技能非常生疏,因为我通常在Java工作.我的代码中是否有明显的新手错误?

Sim*_*sch 8

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

如果你想使用它:一张int地图retvar USAGE BINARY-LONG.

  • 将PIC 9(4)更改为BINARY-LONG解决了它.因为看起来tdSensor函数永远不会返回大于255的任何东西,所以我切换到BINARY-CHAR UNSIGNED.谢谢! (2认同)

Bri*_*fin 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.                       
Run Code Online (Sandbox Code Playgroud)

并且要避免一点点重复的魔术编号,请更改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
Run Code Online (Sandbox Code Playgroud)

我还删除了call语句中的终止期,只是因为; 如果您将代码移动到IF块中,则不必担心终止句点.END-CALL如果您愿意,请使用,但只有ON EXCEPTION在需要范围终止的条件代码块时才需要使用.