从 C 库返回到 GNU COBOL 的不可打印整数指针
Unprintable integer pointer returned to GNU COBOL from C library
我学习 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 工作。我的代码中有明显的新手错误吗?
只是一个随机的想法,但请尝试将 comp 5 用于 int 字段。我对确切的语法很陌生,但它类似于:
TSI-ID 9999 comp 5.
Comp 5 是二进制表示(尝试 google 搜索更多详细信息)
如果你 return 一个 int
你可以直接检查 RETURN-CODE
变量,根本不需要使用 RETURNING
子句。
如果您想使用它:int
映射到 retvar USAGE BINARY-LONG
。
对其他评论和答案的一些澄清。
如前所述,您正在混合使用 COBOL USAGE DISPLAY
和 USAGE 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
需要范围终止的条件代码块时才真正需要这样做。
我学习 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 工作。我的代码中有明显的新手错误吗?
只是一个随机的想法,但请尝试将 comp 5 用于 int 字段。我对确切的语法很陌生,但它类似于:
TSI-ID 9999 comp 5.
Comp 5 是二进制表示(尝试 google 搜索更多详细信息)
如果你 return 一个 int
你可以直接检查 RETURN-CODE
变量,根本不需要使用 RETURNING
子句。
如果您想使用它:int
映射到 retvar USAGE BINARY-LONG
。
对其他评论和答案的一些澄清。
如前所述,您正在混合使用 COBOL USAGE DISPLAY
和 USAGE 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
需要范围终止的条件代码块时才真正需要这样做。