将 COBOL 二进制显示为数字
Displaying COBOL binary as numeric
我对 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 代码,而不是数值,因为显示的字符 'd' 具有 ASCII 代码 100,而不是数字 100。
如何在 COBOL 中将此值显示为数值?
为什么不使用MOVE
指令将SQLCODE
字段的内容传输到USAGE DISPLAY
字段?它会将二进制数转换为数字。
如果格式很奇怪 — 原因如下:
没有 SIGN SEPARATE
子句的带符号的数字图片必须以某种方式包含符号而不占用 space,因此大多数编译器将最后一位数字与数字的符号组合在一起。大多数约定使用 J
表示 −1 直到 R
表示 −9。他们还用前导零填充数字。所以-14006会转换成00001400O
,因为最后一位是6,又因为必须和负号结合,所以最后一位变成-6,用O
表示。 00000010{
.
的推理大致相同
为了重新格式化数字,您实际上可以使用另一张图片,例如
pic S9(9) sign leading separate
这会将 -14006
显示为 -000014006
执行此操作的标准方法是将二进制字段移动到 "numeric edited" 字段:
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.
MOVE SQLCODE TO DISPLAY-SQLCODE
DISPLAY "COBOL, sqlcode is: " DISPLAY-SQLCODE
CALL "CONNECT_DEFAULT" USING SQLCODE
MOVE SQLCODE TO DISPLAY-SQLCODE
DISPLAY "COBOL, sqlcode is: " DISPLAY-SQLCODE
STOP RUN
.
END PROGRAM MSQLTST5_COBHELPER.
这应该可以达到您的预期效果。
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.
将变量移动到显示字段,然后只显示该字段
01 WS-FIELD-FOR-DISPLAY PIC -(9)9.
我对 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 代码,而不是数值,因为显示的字符 'd' 具有 ASCII 代码 100,而不是数字 100。
如何在 COBOL 中将此值显示为数值?
为什么不使用MOVE
指令将SQLCODE
字段的内容传输到USAGE DISPLAY
字段?它会将二进制数转换为数字。
如果格式很奇怪 — 原因如下:
没有 SIGN SEPARATE
子句的带符号的数字图片必须以某种方式包含符号而不占用 space,因此大多数编译器将最后一位数字与数字的符号组合在一起。大多数约定使用 J
表示 −1 直到 R
表示 −9。他们还用前导零填充数字。所以-14006会转换成00001400O
,因为最后一位是6,又因为必须和负号结合,所以最后一位变成-6,用O
表示。 00000010{
.
为了重新格式化数字,您实际上可以使用另一张图片,例如
pic S9(9) sign leading separate
这会将 -14006
显示为 -000014006
执行此操作的标准方法是将二进制字段移动到 "numeric edited" 字段:
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.
MOVE SQLCODE TO DISPLAY-SQLCODE
DISPLAY "COBOL, sqlcode is: " DISPLAY-SQLCODE
CALL "CONNECT_DEFAULT" USING SQLCODE
MOVE SQLCODE TO DISPLAY-SQLCODE
DISPLAY "COBOL, sqlcode is: " DISPLAY-SQLCODE
STOP RUN
.
END PROGRAM MSQLTST5_COBHELPER.
这应该可以达到您的预期效果。
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.
将变量移动到显示字段,然后只显示该字段
01 WS-FIELD-FOR-DISPLAY PIC -(9)9.