我正在学习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工作.我的代码中是否有明显的新手错误?
如果你返回一个,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.
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
在需要范围终止的条件代码块时才需要使用.