给出以下代码:
VAR X PIC S9(7)V9(2).
VAR Y PIC X(15)
Run Code Online (Sandbox Code Playgroud)
以下代码有编译错误.
MOVE X TO Y. * compile error.
Run Code Online (Sandbox Code Playgroud)
错误消息是这样的"不能将非整数移动到字母数字变量"
有没有办法解决这个问题而不使用其他变量(例如显示变量)?
修复有时涉及REDEFINES,如:
01.
05 Y PIC X(15).
05 X REDEFINES Y PIC S9(7)V9(2).
Run Code Online (Sandbox Code Playgroud)
请注意,X占用的存储空间少于其他存储空间Y,但反之X则REDEFINE Y不然.由于现在X和Y现在占用相同的物理存储,因此MOVE可以删除,如下面的程序和输出所示:
IDENTIFICATION DIVISION.
PROGRAM-ID. EXAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Y PIC X(15).
01 X REDEFINES Y PIC S9(7)V9(2).
PROCEDURE DIVISION.
MOVE -1234567.89 TO X
DISPLAY 'X: >' X '< Y: >' Y '<'
.
Run Code Online (Sandbox Code Playgroud)
输出:
X: >12345678R< Y: >12345678R <
Run Code Online (Sandbox Code Playgroud)
你可以很快看到,结果可能不是你所希望的,因为Y它不包含人类可读的格式化数字(即带有前导符号和小数点的数字).
所以我给你的建议是不要尝试将COBOL弯曲成不可能的东西.使用预期使用的语言.你可能需要做的是:
IDENTIFICATION DIVISION.
PROGRAM-ID. EXAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Y PIC X(15).
01 X PIC S9(7)V9(2).
01 T PIC -9(7).99.
PROCEDURE DIVISION.
MOVE -1234567.89 TO X
MOVE X TO T
MOVE T TO Y
DISPLAY 'X: >' X '< Y: >' Y '<'
GOBACK
.
Run Code Online (Sandbox Code Playgroud)
哪个输出:
X: >12345678R< Y: >-1234567.89 <
Run Code Online (Sandbox Code Playgroud)
是的,上面的程序在中间使用了一个额外的变量来将数字格式转换为显示格式,但这正是语言的设计方式.啰嗦但很直接.在练习结束时,变量Y包含一些可读且对正常人眼有意义的东西.