【问题标题】:Array processing and Table handling with packed decimal in COBOL在 COBOL 中使用压缩十进制进行数组处理和表处理
【发布时间】:2021-10-26 09:49:32
【问题描述】:

我正在练习数组处理和表处理,我的程序有这个输出我不明白。

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 去哪儿了?

【问题讨论】:

    标签: cobol


    【解决方案1】:

    尝试从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 符号。

    移至表格说明

    解释

    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
    

    【讨论】:

    • 非常感谢!我现在很明白了!
    • A-B(1) = 67890AB,A-B(2) = HI。这是移除 comp-3 后的结果。为什么这些字母被移动了?我以为 9 的图片只接受数字数据?
    • @rogerStrycova 我已经更新了答案,解释了小组级别的动作
    【解决方案2】:

    我不知道您使用的是哪个编译器和指令,但我预计 comp-3 使用的原始 DISPLAY 会出现异常数字异常。

    关于数字字段中的字母的后续问题,您通过将文字移至组项 TABLE-VALUES 来评估该字段。组项目始终为 USAGE ALPHANUMERIC。

    【讨论】:

    • 你写道:组项目总是使用字母。这是不正确的。组项目是USAGE DISPLAY,类别和类别为字母数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2018-05-11
    • 2011-04-26
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多