我学习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中工作。这里的代码中有明显的新手错误吗?
发布于 2016-10-22 18:16:31
如果返回一个int,就可以直接检查RETURN-CODE变量,根本不需要使用RETURNING子句。
如果您想使用它:一个int映射到retvar USAGE BINARY-LONG。
发布于 2016-10-22 18:56:24
对其他评论和答复作出几点澄清。
如前所述,您正在将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我还删除了call语句中的终止期,这仅仅是因为;如果您将代码移动到IF块中,则不必担心终止的完全停止。如果愿意,可以使用END-CALL,但只有在需要终止范围的ON EXCEPTION条件代码块的情况下,这才是真正必要的。
发布于 2016-10-22 17:15:54
只是一个随机的想法,但是尝试使用comp 5作为int字段。我对确切的语法有些生疏,但它类似于以下内容:
TSI-ID 9999 comp 5.Comp 5是二进制表示(尝试谷歌搜索获得更多细节)
https://stackoverflow.com/questions/40194267
复制相似问题