documents:cobol:cobol-001
COBOLとZONE形式
2024-10-30
PIC X(4) → PIC S9(4) を行ったらどうなる?を確認する
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を使ってみます。
ZONE形式をファイルに書き出す
ググりながらコードを書く。そらで一から書くのもう無理。
行番号は入れてません。
実行するとファイル sample.bin にZONE形式の値を書き出します。
ソースコード | 実行結果 |
---|---|
| GnuCOBOLでコンパイルして実行してみます。警告が出ているけどとりあえず後回し。$ cobc -x gendata.cbl /tmp/cob79343_0.c:321:35: warning: illegal character encoding in string literal [-Winvalid-source-encoding] 321 module->module_formatted_date = COB_MODULE_FORMATTED_DATE; ^~~~~~~~~~~~~~~~~~~~~~~~~ /tmp/cob79343_0.c:15:39: note: expanded from macro 'COB_MODULE_FORMATTED_DATE' 15 #define COB_MODULE_FORMATTED_DATE "10<B7><EE> 30 2024 14:09:46" ^~~~~~~~ 1 warning generated. $ ./gendata $ hd sample.bin 00000000 31 32 33 34 31 32 33 70 31 32 33 71 31 32 33 72 |1234123p123q123r| 00000010 31 32 33 73 31 32 33 74 31 32 33 75 31 32 33 76 |123s123t123u123v| 00000020 31 32 33 77 31 32 33 78 31 32 33 79 |123w123x123y| 0000002c $ |
hdコマンドで sample.bin をhexダンプした結果を見ます。
この環境下では、GnuCOBOLで扱っている負値のZONE形式の最後桁の文字は 0x70~0x79になっている事を確認できました。
数値 2024 は 0x32, 0x30, 0x32, 0x34 となり、数値 -2024 は 0x32, 0x30, 0x32, 0x74 となります。
こんな形式です。
PIC X(4)を PIC S9(4) にMOVEできるか
PIC X(4)の値を PIC S9(4) にMOVEしたらどうなるかを見てみます。
※ZONE形式表現 “202t” が -2024 として扱えるのかを見てみます
ソースコード | 実行結果 |
---|---|
| どうも型変換的な処理が行われていますね。素直に内容を転記する事はできないように見えます。$ cobc -x sample.cbl /tmp/cob79487_0.c:212:35: warning: illegal character encoding in string literal [-Winvalid-source-encoding] 212 module->module_formatted_date = COB_MODULE_FORMATTED_DATE; ^~~~~~~~~~~~~~~~~~~~~~~~~ /tmp/cob79487_0.c:15:39: note: expanded from macro 'COB_MODULE_FORMATTED_DATE' 15 #define COB_MODULE_FORMATTED_DATE "10<B7><EE> 30 2024 14:23:17" ^~~~~~~~ 1 warning generated. $ ./sample 01:[2024] 02:[202t] ← -2024 のZONE形式表現の文字列 03: +2024 04: +0202 ← -2024を期待してたけど… $ |
REDEFINE句を使って PIC X(4)とPIC S9(4)を重ねてあげればよいようです。
ソースコード | 実行結果 |
---|---|
| 望みの結果となりました。$ cobc -x sample2.cbl /tmp/cob79918_0.c:213:35: warning: illegal character encoding in string literal [-Winvalid-source-encoding] 213 module->module_formatted_date = COB_MODULE_FORMATTED_DATE; ^~~~~~~~~~~~~~~~~~~~~~~~~ /tmp/cob79918_0.c:15:39: note: expanded from macro 'COB_MODULE_FORMATTED_DATE' 15 #define COB_MODULE_FORMATTED_DATE "10<B7><EE> 30 2024 15:06:08" ^~~~~~~~ 1 warning generated. $ ./sample2 01:[2024] 02:[202t] 03: +2024 04: -2024 ← -2024になりました $ |
documents/cobol/cobol-001.txt · 最終更新: 2024/11/09 20:55 by k896951