documents:proglang:cobol:cobol-002
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン | |||
| documents:proglang:cobol:cobol-002 [2026/05/14 13:33] – [COBOLとPackedDecimal形式確認コード] k896951 | documents:proglang:cobol:cobol-002 [2026/05/30 06:12] (現在) – ↷ 移動操作に合わせてリンクを書き換えました。 40.77.167.241 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | ====== 100.COBOLとPackedDecimal形式確認コード ====== | ||
| + | 2024-11-04\\ | ||
| + | ZONEの説明を書いたのでPackedDecimalも作成 | ||
| + | |||
| + | ===== GnuCOBOL ===== | ||
| + | |||
| + | 「そういやCOBOL使えたはずだな」とローカルのサーバで確認してみる。 | ||
| + | |||
| + | < | ||
| + | $ cobc -v | ||
| + | cobc (GnuCOBOL) 3.2.0 | ||
| + | Built Oct 10 2024 06: | ||
| + | C version " | ||
| + | loading standard configuration file ' | ||
| + | cobc: error: no input files | ||
| + | $ | ||
| + | </ | ||
| + | |||
| + | FreeBSD上にインストールされたGnuCOBOLを使ってみます。 | ||
| + | |||
| + | |||
| + | ===== PackedDecimal形式をファイルに書き出す ===== | ||
| + | |||
| + | ググりながらコードを書く。そらで一から書くのもう無理。\\ 行番号は入れてません。 | ||
| + | |||
| + | 実行するとファイル sample.bin にPackedDecimal形式の値を書き出します。 | ||
| + | |||
| + | ^ ソースコード | ||
| + | | <code cobol gendata.cbl> | ||
| + | ***** sample **** | ||
| + | | ||
| + | | ||
| + | * | ||
| + | | ||
| + | | ||
| + | FILE-CONTROL. | ||
| + | | ||
| + | |||
| + | DATA DIVISION. | ||
| + | FILE SECTION. | ||
| + | FD BIN-FILE. | ||
| + | 01 BIN-REC. | ||
| + | 03 BIN-REC-P | ||
| + | 03 BIN-REC00 | ||
| + | 03 BIN-REC01 | ||
| + | 03 BIN-REC02 | ||
| + | 03 BIN-REC03 | ||
| + | 03 BIN-REC04 | ||
| + | 03 BIN-REC05 | ||
| + | 03 BIN-REC06 | ||
| + | 03 BIN-REC07 | ||
| + | 03 BIN-REC08 | ||
| + | 03 BIN-REC09 | ||
| + | |||
| + | WORKING-STORAGE SECTION. | ||
| + | 01 VAL0P PIC S9(4) COMP-3 VALUE 1234. | ||
| + | 01 VAL00 PIC S9(4) COMP-3 VALUE -1230. | ||
| + | 01 VAL01 PIC S9(4) COMP-3 VALUE -1231. | ||
| + | 01 VAL02 PIC S9(4) COMP-3 VALUE -1232. | ||
| + | 01 VAL03 PIC S9(4) COMP-3 VALUE -1233. | ||
| + | 01 VAL04 PIC S9(4) COMP-3 VALUE -1234. | ||
| + | 01 VAL05 PIC S9(4) COMP-3 VALUE -1235. | ||
| + | 01 VAL06 PIC S9(4) COMP-3 VALUE -1236. | ||
| + | 01 VAL07 PIC S9(4) COMP-3 VALUE -1237. | ||
| + | 01 VAL08 PIC S9(4) COMP-3 VALUE -1238. | ||
| + | 01 VAL09 PIC S9(4) COMP-3 VALUE -1239. | ||
| + | |||
| + | | ||
| + | MAIN SECTION. | ||
| + | |||
| + | MOVE VAL0P TO BIN-REC-P. | ||
| + | MOVE VAL00 TO BIN-REC00. | ||
| + | MOVE VAL01 TO BIN-REC01. | ||
| + | MOVE VAL02 TO BIN-REC02. | ||
| + | MOVE VAL03 TO BIN-REC03. | ||
| + | MOVE VAL04 TO BIN-REC04. | ||
| + | MOVE VAL05 TO BIN-REC05. | ||
| + | MOVE VAL06 TO BIN-REC06. | ||
| + | MOVE VAL07 TO BIN-REC07. | ||
| + | MOVE VAL08 TO BIN-REC08. | ||
| + | MOVE VAL09 TO BIN-REC09. | ||
| + | |||
| + | OPEN OUTPUT BIN-FILE. | ||
| + | WRITE BIN-REC. | ||
| + | CLOSE BIN-FILE. | ||
| + | |||
| + | STOP RUN. | ||
| + | </ | ||
| + | $ cobc -x gendata.cbl | ||
| + | / | ||
| + | 321 module-> | ||
| + | | ||
| + | / | ||
| + | | ||
| + | ^~~~~~~~ | ||
| + | 1 warning generated. | ||
| + | $ ./gendata | ||
| + | $ hd sample.bin | ||
| + | 00000000 | ||
| + | 00000010 | ||
| + | 00000020 | ||
| + | 00000021 | ||
| + | $ | ||
| + | </ | ||
| + | |||
| + | |||
| + | hdコマンドで sample.bin をhexダンプした結果を見ます。\\ | ||
| + | この環境下では、GnuCOBOLで扱っている負値のPackedDecimal形式の最後バイトの下位4ビットは0xDになっている事を確認できました。\\ | ||
| + | 数値 2024 は 0x02, 0x02, 0x4C となり、数値 -2024 は 0x02, 0x02, 0x4D となります。 | ||
| + | [[documents: | ||
| + | |||
| + | ===== PIC X(3)を PIC S9(4) COMP-3 にMOVEできるか ===== | ||
| + | |||
| + | PIC X(3)の値を PIC S9(4) COMP-3にMOVEしたらどうなるかを見てみます。\\ | ||
| + | ※PackdDecimal形式表現 " | ||
| + | |||
| + | ^ ソースコード ^ 実行結果 ^ | ||
| + | |<code cobol sample.cbl> | ||
| + | $ vi sample.cbl | ||
| + | ***** sample **** | ||
| + | | ||
| + | | ||
| + | * | ||
| + | DATA DIVISION. | ||
| + | | ||
| + | 01 VAL01 PIC X(3) VALUE X" | ||
| + | 01 VAL02 PIC X(3) VALUE X" | ||
| + | 01 VAL03 PIC S9(4) COMP-3. | ||
| + | 01 VAL04 PIC S9(4) COMP-3. | ||
| + | |||
| + | | ||
| + | MAIN SECTION. | ||
| + | |||
| + | MOVE VAL01 TO VAL03. | ||
| + | MOVE VAL02 TO VAL04. | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | STOP RUN. | ||
| + | </ | ||
| + | $ cobc -x sample.cbl | ||
| + | / | ||
| + | 212 | | ||
| + | | | ||
| + | / | ||
| + | 15 | # | ||
| + | | ^~~~~~~~ | ||
| + | 1 warning generated. | ||
| + | $ ./sample | ||
| + | 01: | ||
| + | 02: | ||
| + | 03: +0000 ← 何か変換されてる | ||
| + | 04: +0000 ← 何か変換されてる | ||
| + | $ | ||
| + | </ | ||
| + | |||
| + | PackedDecimalもZONEと同様にREDEFINE句を使って PIC X(3)とPIC S9(4) COMP-3を重ねてあげればよいようです。 | ||
| + | ^ ソースコード ^ 実行結果 ^ | ||
| + | | <code cobol sample2.cbl> | ||
| + | ***** sample **** | ||
| + | | ||
| + | | ||
| + | * | ||
| + | DATA DIVISION. | ||
| + | | ||
| + | 01 VAL01 PIC X(3) VALUE X" | ||
| + | 01 VAL02 PIC X(3) VALUE X" | ||
| + | 01 VAL03 PIC S9(4) COMP-3. | ||
| + | 01 FILLER REDEFINES VAL03. | ||
| + | 03 VAL05 PIC X(3). | ||
| + | 01 VAL04 PIC S9(4) COMP-3. | ||
| + | 01 FILLER REDEFINES VAL04. | ||
| + | 03 VAL06 PIC X(3). | ||
| + | |||
| + | | ||
| + | MAIN SECTION. | ||
| + | |||
| + | MOVE VAL01 TO VAL05. | ||
| + | MOVE VAL02 TO VAL06. | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | STOP RUN. | ||
| + | </ | ||
| + | $ cobc -x sample.cbl | ||
| + | / | ||
| + | 217 module-> | ||
| + | | ||
| + | / | ||
| + | | ||
| + | ^~~~~~~~ | ||
| + | 1 warning generated. | ||
| + | $ ./sample | ||
| + | 01:[L] | ||
| + | 02:[M] | ||
| + | 03: +2024 ← 予想通り | ||
| + | 04: -2024 ← 予想通り | ||
| + | $ | ||
| + | |||
| + | </ | ||
| + | |||
| + | {{tag> | ||
documents/proglang/cobol/cobol-002.txt · 最終更新: by 40.77.167.241
