我在OpenVMS上运行的COBOL程序中遇到以下问题.
我有以下变量声明:
01 STRUCT-1.
02 FIELD-A PIC S9(6) COMP-3.
02 FIELD-B PIC S9(8) COMP-3.
01 STRUCT-2.
03 SUB-STRUCT-1.
05 FIELD-A PIC 9(2).
05 FIELD-B PIC 9(4).
03 SUB-STRUCT-2.
05 FIELD-A PIC 9(4).
05 FIELD-B PIC 9(2).
05 FIELD-C PIC 9(2).
Run Code Online (Sandbox Code Playgroud)
以下代码:
* 1st Test:
MOVE 112011 TO FIELD-A OF STRUCT-1
MOVE 20100113 TO FIELD-B OF STRUCT-1
DISPLAY "FIELD-A : " FIELD-A OF STRUCT-1 CONVERSION
DISPLAY "FIELD-B : " FIELD-B OF STRUCT-1 CONVERSION
* 2nd Test:
MOVE 112011 TO SUB-STRUCT-1.
MOVE 20100113 TO SUB-STRUCT-2.
MOVE SUB-STRUCT-1 TO FIELD-A OF STRUCT-1
MOVE SUB-STRUCT-2 TO FIELD-B OF STRUCT-1
DISPLAY "SUB-STRUCT-1 : " SUB-STRUCT-1
DISPLAY "SUB-STRUCT-2 : " SUB-STRUCT-2
DISPLAY "FIELD-A : " FIELD-A OF STRUCT-1 CONVERSION
DISPLAY "FIELD-B : " FIELD-B OF STRUCT-1 CONVERSION
Run Code Online (Sandbox Code Playgroud)
哪个输出:
FIELD-A : 112011
FIELD-B : 20100113
SUB-STRUCT-1 : 112011
SUB-STRUCT-2 : 20100113
FIELD-A : 131323
FIELD-B : 23031303
Run Code Online (Sandbox Code Playgroud)
为什么FIELD-A和FIELD-B保持值不同于我在第二次测试中进入它们的值?
我有其他动作,从DISPLAY到COMP-3我的程序中的变量,我没有得到这个行为.
在 COBOL 中,组级数据是无类型的,并且无需转换即可移动。
元素级数据始终具有关联的数据类型。类型化数据在MOVE.
在第一个实例中,您将MOVE文字数值 ( 112011) 转换为压缩十进制字段,编译器在此过程中将其转换为正确的数据类型。正如您对任何编程语言所期望的那样。
在第二个实例中,您MOVE为组项目提供文字值。由于这是一个组项,编译器无法“知道”预期的数据类型,因此它始终将组移动作为字符数据(无数字转换)。PICTURE当接收项具有与字符数据兼容的子句(whichFIELD-A和FIELD-B
of are)时,这很好SUB-STRUCT-1。9当存储为PIC X和 存储为 时,a 的内部表示没有区别PIC 9。两者都是假设的USAGE DISPLAY。
现在,当您进行组级别从SUB-STRUCT-1COMP-3(压缩十进制)转换时,您实际上告诉编译器不要转换为DISPLAY格式COMP-3。这就是你得到的。
尝试对您的代码进行以下修改。使用REDEFINES为移动创建一个数字基本项。COBOL 在移动基本数据时将进行适当的数据转换。
01 STRUCT-2.
03 SUB-STRUCT-1.
05 FIELD-A PIC 9(2).
05 FIELD-B PIC 9(4).
03 SUB-STRUCT-1N REDEFINES
SUB-STRUCT-1 PIC 9(6).
03 SUB-STRUCT-2.
05 FIELD-A PIC 9(4).
05 FIELD-B PIC 9(2).
05 FIELD-C PIC 9(2).
03 SUB-STRUCT-2N REDEFINES
SUB-STRUCT-2 PIC 9(8).
Run Code Online (Sandbox Code Playgroud)
以及以下代码:
* 3RD TEST:
MOVE 112011 TO SUB-STRUCT-1.
MOVE 20100113 TO SUB-STRUCT-2.
MOVE SUB-STRUCT-1N TO FIELD-A OF STRUCT-1
MOVE SUB-STRUCT-2N TO FIELD-B OF STRUCT-1
DISPLAY "SUB-STRUCT-1 : " SUB-STRUCT-1
DISPLAY "SUB-STRUCT-2 : " SUB-STRUCT-2
DISPLAY "FIELD-A : " FIELD-A OF STRUCT-1
DISPLAY "FIELD-B : " FIELD-B OF STRUCT-1
Run Code Online (Sandbox Code Playgroud)
注意:将字符数据移动到 COMP-3 字段可能会在引用接收项时导致可怕的 SOC7 数据异常异常结束。这是因为并非所有位模式都是有效的 COMP-3 数字。