在 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-A 和 A-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。
我正在练习数组处理和 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-A 和 A-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。