documents:cobol:cobol-002
COBOLとPackedDecimal形式
2024-11-04
ZONEの説明を書いたのでPackedDecimalも作成
GnuCOBOL
「そういやCOBOL使えたはずだな」とローカルのサーバで確認してみる。
$ cobc -v cobc (GnuCOBOL) 3.2.0 Built Oct 10 2024 06:43:09 Packaged Jul 28 2023 17:02:56 UTC C version "FreeBSD Clang 18.1.5 (https://github.com/llvm/llvm-project.git llvmorg-18.1.5-0-g617a15a9eac9)" loading standard configuration file 'default.conf' cobc: error: no input files $
FreeBSD上にインストールされたGnuCOBOLを使ってみます。
PackedDecimal形式をファイルに書き出す
ググりながらコードを書く。そらで一から書くのもう無理。
行番号は入れてません。
実行するとファイル sample.bin にPackedDecimal形式の値を書き出します。
| ソースコード | 実行結果 |
|---|---|
| GnuCOBOLでコンパイルして実行してみます。警告が出ているけどとりあえず後回し。$ cobc -x gendata.cbl
/tmp/cob62814_0.c:321:35: warning: illegal character encoding in string literal [-Winvalid-source-encoding]
321 module->module_formatted_date = COB_MODULE_FORMATTED_DATE;
^~~~~~~~~~~~~~~~~~~~~~~~~
/tmp/cob62814_0.c:15:39: note: expanded from macro 'COB_MODULE_FORMATTED_DATE'
15 #define COB_MODULE_FORMATTED_DATE "11<B7><EE> 04 2024 09:51:49"
^~~~~~~~
1 warning generated.
$ ./gendata
$ hd sample.bin
00000000 01 23 4c 01 23 0d 01 23 1d 01 23 2d 01 23 3d 01 |.#L.#..#..#-.#=.|
00000010 23 4d 01 23 5d 01 23 6d 01 23 7d 01 23 8d 01 23 |#M.#].#m.#}.#..#|
00000020 9d |.|
00000021
$
|
hdコマンドで sample.bin をhexダンプした結果を見ます。
この環境下では、GnuCOBOLで扱っている負値のPackedDecimal形式の最後バイトの下位4ビットは0xDになっている事を確認できました。
数値 2024 は 0x02, 0x02, 0x4C となり、数値 -2024 は 0x02, 0x02, 0x4D となります。
こんな形式です。
PIC X(3)を PIC S9(4) COMP-3 にMOVEできるか
PIC X(3)の値を PIC S9(4) COMP-3にMOVEしたらどうなるかを見てみます。
※PackdDecimal形式表現 “0x01,0x23,0x4D” が -2024 として扱えるのかを見てみます
| ソースコード | 実行結果 |
|---|---|
| これは予想通り。素直に内容を転記する事はできないようです。$ cobc -x sample.cbl
/tmp/cob63029_0.c:212:35: warning: illegal character encoding in string literal [-Winvalid-source-encoding]
212 | module->module_formatted_date = COB_MODULE_FORMATTED_DATE;
| ^~~~~~~~~~~~~~~~~~~~~~~~~
/tmp/cob63029_0.c:15:39: note: expanded from macro 'COB_MODULE_FORMATTED_DATE'
15 | #define COB_MODULE_FORMATTED_DATE "11<B7><EE> 04 2024 10:10:25"
| ^~~~~~~~
1 warning generated.
$ ./sample
01:[L] ← 0x4cが'L'
02:[M] ← 0x4dが'M'
03: +0000 ← 何か変換されてる
04: +0000 ← 何か変換されてる
$
|
PackedDecimalもZONEと同様にREDEFINE句を使って PIC X(3)とPIC S9(4) COMP-3を重ねてあげればよいようです。
| ソースコード | 実行結果 |
|---|---|
| 望みの結果となりました。$ cobc -x sample.cbl
/tmp/cob63116_0.c:217:35: warning: illegal character encoding in string literal [-Winvalid-source-encoding]
217 module->module_formatted_date = COB_MODULE_FORMATTED_DATE;
^~~~~~~~~~~~~~~~~~~~~~~~~
/tmp/cob63116_0.c:15:39: note: expanded from macro 'COB_MODULE_FORMATTED_DATE'
15 #define COB_MODULE_FORMATTED_DATE "11<B7><EE> 04 2024 10:19:40"
^~~~~~~~
1 warning generated.
$ ./sample
01:[L]
02:[M]
03: +2024 ← 予想通り
04: -2024 ← 予想通り
$
|
documents/cobol/cobol-002.txt · 最終更新: by k896951