给出以下代码:
VAR X PIC S9(7)V9(2).
VAR Y PIC X(15)
以下代码出现编译错误。
MOVE X TO Y. * compile error.
错误信息是这样的“无法将非整数移动到字母数字变量”
有没有办法解决这个问题而不使用其他变量(例如显示变量)?
答案 0 :(得分:9)
修复有时涉及REDEFINES,如:
01.
05 Y PIC X(15).
05 X REDEFINES Y PIC S9(7)V9(2).
请注意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 '<'
.
,如以下程序和输出所示:
X: >12345678R< Y: >12345678R <
输出:
Y
正如您可以很快看到的那样,结果可能不是您所希望的,因为 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
.
不包含人类可读的格式化数字(即带有前导符号和小数点的数字)。
所以我的建议是不要尝试将COBOL弯曲成不可能的东西。使用预期使用的语言。您可能需要做的是:
X: >12345678R< Y: >-1234567.89 <
哪个输出:
Y
是的,上面的程序在中间使用了一个额外的变量来将数字格式转换为显示格式,但这正是语言的设计方式。啰嗦但很直接。在练习结束时,变量{{1}}包含一些可读且对正常人眼有意义的东西。
答案 1 :(得分:1)
根据您想要包含的内容,编号
01 VARS.
05 X PIC S9(7)V9(2).
05 Y REDEFINES X PIC X(9).
05 Z PIC -9(7).99.
05 Q PIC X(11).
MOVE X TO Z
MOVE Z TO Q
DISPLAY Y
DISPLAY Q
尝试一下,看看是什么能给你你想要的答案。
警告,这只是徒手,我还没有尝试过编译它。
答案 2 :(得分:0)
IDENTIFICATION DIVISION.
PROGRAM-ID. EXAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Y PIC X(15).
01 T REDEFINES Y PIC -(5)9(7).99.
01 U REDEFINES Y PIC -9(7).99B(4).
01 X PIC S9(7)V9(2).
PROCEDURE DIVISION.
MOVE -1234567.89 TO X
MOVE X TO T
DISPLAY 'X: >' X '< Y: >' Y '<'
MOVE X TO U
DISPLAY 'X: >' X '< Y: >' Y '<'
GOBACK
.
T给出右对齐,U给出左对齐。由于两个REDEFINES占用了整个15个字节,因此在MOVE到T或U之前不需要考虑Y中的任何值。
输出是:
X: >12345678R< Y: > -1234567.89<
X: >12345678R< Y: >-1234567.89 <