我对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
Run Code Online (Sandbox Code Playgroud)
我想从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.
Run Code Online (Sandbox Code Playgroud)
我正在调用的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);
}
Run Code Online (Sandbox Code Playgroud)
运行我的COBOL程序的输出:
COBOL, sqlcode is: d
C, sqlcode is: 100
C, sqlcode is: -14006
COBOL, sqlcode is: J???
Run Code Online (Sandbox Code Playgroud)
似乎变量确实具有我给它的值100,然后在C和COBOL之间正确传递,但是当我要求COBOL显示变量时,它似乎试图挑选出具有给定ASCII码的字符而不是数值,因为显示具有ASCII码100的字符'd'而不是数字100.
如何在COBOL中将此值显示为数值?
为什么不使用该指令将SQLCODE
字段内容传输到USAGE DISPLAY
字段MOVE
?它会将二进制数转换为数字.
如果格式很奇怪 - 这就是为什么:
没有SIGN SEPARATE
条款的签名数字图片必须以某种方式包含符号而不占用空间,因此大多数编译器将最后一位数字与数字符号组合在一起.大多数约定使用J
-1直到R
-9.他们还用前导零填充数字.因此-14006将转换为00001400O
,因为最后一位是6,并且因为它必须与减号相结合,所以最后一位数字变为-6,由a表示O
.大致相同的推理都是重要的00000010{
.
为了重新格式化数字,您实际上可以使用另一张图片,例如
pic S9(9) sign leading separate
Run Code Online (Sandbox Code Playgroud)
那将显示-14006
为-000014006