12

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

我可以很好地调用 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 工作。我的代码中是否有明显的新手错误?

4

3 回答 3

8

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

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

于 2016-10-22T18:16:31.497 回答
8

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

如前所述,您将 COBOLUSAGE 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

我还删除了通话声明中的终止期,只是因为;如果您曾经将该代码移动到IF块内,则不必担心终止句号。END-CALL如果您愿意,可以使用,但这只有在您有需要范围终止的条件代码块时才真正需要ON EXCEPTION

于 2016-10-22T18:56:24.077 回答
1

只是一个随机的想法,但尝试将 comp 5 用于 int 字段。我不知道确切的语法,但它类似于:

TSI-ID 9999 comp 5.

Comp 5 是二进制表示(尝试谷歌搜索以获取更多详细信息)

于 2016-10-22T17:15:54.527 回答