在 COBOL 中使用压缩十进制进行数组处理和 Table 处理

Array processing and Table handling with packed decimal in COBOL

我正在练习数组处理和 table 处理,但我不理解我的程序输出。

01  TABLE-VALUES.                      
    05 TABLE-ELEMENTS OCCURS 2 TIMES. 
       10 A-A PIC X(5).                
       10 A-B PIC S9(5)V99 COMP-3.     
01  WS-STRING PIC X(10).               
01  S PIC 99.                          
01  WS-COUNT PIC 99.                   
...
PROCEDURE DIVISION.                                       
0000-MAIN.                                                
    DISPLAY 'HELLO WORLD'                                 
    MOVE '1234567890ABCDEFGHI' TO TABLE-VALUES            
    DISPLAY 'TABLE VALUES ' TABLE-VALUES                  
    MOVE 0 TO WS-COUNT                                    
    INSPECT TABLE-VALUES TALLYING WS-COUNT FOR CHARACTERS 
    DISPLAY WS-COUNT                                      
    PERFORM 1000-PARA VARYING S FROM 1 BY 1 UNTIL S > 2  
    STOP RUN.                                             
1000-PARA.                                                
    MOVE 'A-A(&&) = ' TO WS-STRING                        
    INSPECT WS-STRING REPLACING FIRST '&&' BY S           
    DISPLAY WS-STRING A-A(S)  
    MOVE 'A-B(&&) = ' TO WS-STRING              
    INSPECT WS-STRING REPLACING FIRST '&&' BY S 
    DISPLAY WS-STRING A-B(S).                   

输出结果是:

HELLO WORLD                                                                     
TABLE VALUES 1234567890ABCDEFGHI                                                
18                                                                              
A-A(01) = 12345                                                                 
A-B(01) =  6 7 8                                                                
A-A(02) = 0ABCD                                                                 
A-B(02) =  5 6 7 

我不明白 A-B(1) 和 A-B(2) 是怎么变成那样的。为什么中间有空格?数字 9 去了哪里?

尝试从 A-B 定义中删除 COMP-3,它应该会更好。

Cobol comp-3

Comp-3是cobol的二进制编码十进制格式。每 4 个字节(1/2 字节或 nyble)代表一个十进制数字,符号保留在最后一位数字中。将字符串移动到 comp-3 值(就像您所做的那样)将导致无效的 comp-3 值。

通常值 1234 将存储为

`01234C`x

在你的情况下(如果使用 EBCDIC 机器)你正在移动 6789 十六进制字符串 'f6f7f8f9'x 到变量 A-B(01)。 F 不是有效的十进制数字,9 不是有效的 comp-3 符号。

移至Table解释

解释

MOVE '1234567890ABCDEFGHI' TO TABLE-VALUES

在上面 TABLE-VALUES 被视为 pic x(18)。该移动完全忽略了 A-AA-B.

的定义

假设定义

01  TABLE-VALUES.                      
    05 TABLE-ELEMENTS OCCURS 2 TIMES. 
       10 A-A PIC X(5).                
       10 A-B PIC S9(5)V99.      

以下内容更有意义

MOVE 'A-A 100234567A-A 200234567' TO TABLE-VALUES

移动到 组级别 时,字符串必须与 组中 字段 的地图。

对于上面的 Cobol 布局,字段对齐方式如下

   Field    Position  Length
   A-A(1)      1        5
   A-B(1)      6        7
   A-A(2)      13       5
   A-B(2)      18       7

我不知道您使用的是哪个编译器和指令,但我希望 comp-3 用法的原始显示会异常终止。

关于数字字段中字母的后续问题,您通过将文字移动到组项目 TABLE-VALUES 来为字段赋值。组项目始终是 USAGE ALPHANUMERIC。