将COBOL二进制显示为数字

时间:2018-03-06 08:31:31

标签: cobol

我对COBOL完全不熟悉。我有一个小的COBOL程序和一个小的C文件。根据这篇文章:https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.ceea400/sdtpt.htm COBOL中等效的C有符号整数是

PIC S9(9) USAGE IS BINARY

我想从COBOL调用C文件中的函数,并在COBOL中显示结果。我可以调用该函数,它似乎按预期运行,数据按预期传递,但我无法在COBOL中使用DISPLAY显示二进制值。

我的COBOL计划:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. MSQLTST5_COBHELPER.

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 SQLCODE PIC S9(9) USAGE IS BINARY VALUE 100.


   PROCEDURE DIVISION.
   HEAD SECTION.

   MAIN.

       DISPLAY "COBOL, sqlcode is: " SQLCODE.
       CALL "CONNECT_DEFAULT" USING SQLCODE.
       DISPLAY "COBOL, sqlcode is: " SQLCODE.

       STOP RUN.

   END PROGRAM MSQLTST5_COBHELPER.

我正在打电话的C函数:

void connect_default(int* sqlcode)
{
    printf("C, sqlcode is: %d\n", *sqlcode);
    // internal code that places the expected error code -14006 in the variable sqlcode
    printf("C, sqlcode is: %d\n", *sqlcode);
}

运行我的COBOL程序的输出:

COBOL, sqlcode is: d
C, sqlcode is: 100
C, sqlcode is: -14006
COBOL, sqlcode is: J▒▒▒

似乎变量确实具有我给它的值100,然后在C和COBOL之间正确传递,但是当我要求COBOL显示变量时,它似乎试图挑选出具有给定ASCII码而不是数值,因为显示的是具有ASCII码100的字符'd'而不是数字100.

如何在COBOL中将此值显示为数值?

4 个答案:

答案 0 :(得分:8)

为什么不使用SQLCODE指令将USAGE DISPLAY字段的内容转移到MOVE字段?它会将二进制数转换为数字。

如果格式很奇怪 - 这就是原因:

没有SIGN SEPARATE子句的带符号数字图片必须以某种方式包含符号而不占用空间,因此大多数编译器将最后一位数字与数字符号组合在一起。对于-9,大多数约定使用J表示-1到R。他们还用前导零填充数字。所以-14006将转换为00001400O,因为最后一位是6,因为它必须与减号结合,最后一位数变为-6,由O表示。 00000010{的推理大致相同。

为了重新格式化数字,您实际上可以使用其他图片,例如

pic S9(9) sign leading separate

这会将-14006显示为-000014006

答案 1 :(得分:2)

执行此操作的标准方法是将二进制字段移动到“数字编辑”字段:

01 DISPLAY-SQLCODE PIC -(9)9.

然后

MOVE SQLCODE TO DISPLAY-SQLCODE

完整示例:

IDENTIFICATION DIVISION.
PROGRAM-ID. MSQLTST5_COBHELPER.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 SQLCODE PIC S9(9) USAGE IS BINARY VALUE 100.
01 DISPLAY-SQLCODE PIC -(9)9.


PROCEDURE DIVISION.
HEAD SECTION.

MAIN.

    DISPLAY "COBOL, sqlcode is: " SQLCODE
    CALL "CONNECT_DEFAULT" USING SQLCODE
    MOVE SQLCODE TO DISPLAY-SQLCODE
    DISPLAY "COBOL, sqlcode is: " SQLCODE

    STOP RUN
    .

END PROGRAM MSQLTST5_COBHELPER.

答案 2 :(得分:2)

这应该达到预期的效果。

IDENTIFICATION DIVISION.
PROGRAM-ID. MSQLTST5_COBHELPER.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 SQLCODE PIC S9(9) USAGE IS BINARY VALUE 100.
01 SQLCODE-E PIC -9(9).

PROCEDURE DIVISION.
HEAD SECTION.

MAIN.
    PERFORM DISPLAY-SQLCODE.
    CALL "CONNECT_DEFAULT" USING SQLCODE.
    PERFORM DISPLAY-SQLCODE.

STOP RUN.

DISPLAY-SQLCODE.
    MOVE SQLCODE TO SQLCODE-E.
    DISPLAY "COBOL, sqlcode is: " SQLCODE-E.

END PROGRAM MSQLTST5_COBHELPER.

答案 3 :(得分:0)

将变量移动到显示字段,然后仅显示字段

01 WS-FIELD-FOR-DISPLAY PIC -(9)9.