COBOL的问题转移到comp-3变量

mmu*_*lva 8 cobol

我在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-AFIELD-B保持值不同于我在第二次测试中进入它们的值?

我有其他动作,从DISPLAYCOMP-3我的程序中的变量,我没有得到这个行为.

Nea*_*alB 6

在 COBOL 中,组级数据是无类型的,并且无需转换即可移动。

元素级数据始终具有关联的数据类型。类型化数据在MOVE.

在第一个实例中,您将MOVE文字数值 ( 112011) 转换为压缩十进制字段,编译器在此过程中将其转换为正确的数据类型。正如您对任何编程语言所期望的那样。

在第二个实例中,您MOVE为组项目提供文字值。由于这是一个组项,编译器无法“知道”预期的数据类型,因此它始终将组移动作为字符数据(无数字转换)。PICTURE当接收项具有与字符数据兼容的子句(whichFIELD-AFIELD-B of are)时,这很好SUB-STRUCT-19当存储为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 数字。