NetCOBOL 技術情報:ノウハウ情報
共通
NetCOBOL
Q
数字項目データの取扱いについて教えてください。
A
「数字項目データの取扱い」は、COBOLプログラムを作成するときに誤りやすい事項です。 以下にデータ型および規則、変数に不正な値が入ったときの動作、デバッグ方法について、説明します。
データ型および規則
各データ型の形式
各データ型の形式は、COBOL文法書の「5.4.15 USAGE句」に記述しています。
COBOL文法書については、マニュアルを参照してください。
以下に、例を挙げます。
[例]
符号付き2進項目 |
符号なし内部10進 |
符号付き内部10進 |
符号なし外部10進 |
符号付き外部10進(SIGN TRAILING)
符号付き2進項目
PIC S9(4) COMP VALUE 1234.
2進形式で2Byteに格納されます。
符号なし内部10進
PIC 9(4) PACKED-DECIMAL VALUE 1234.
内部10進形式で3Byteに格納されます。最後の4bitには、X'F'が入ります。
符号付き内部10進
PIC S9(4) PACKED-DECIMAL VALUE 1234.
内部10進形式で3Byteに格納されます。最後の4bitには、数値が正の場合X'C'、 負の場合X'D'が入ります。
符号なし外部10進
PIC 9(4) DISPLAY VALUE 1234.
外部10進形式で4Byteに格納されます。各文字位置には、文字'0'~'9'が入ります。
符号付き外部10進(SIGN TRAILING)
PIC S9(4) DISPLAY VALUE 1234.
外部10進形式で4Byteに格納されます。各文字位置には、文字'0'~'9'が入りますが、 最後の文字の先頭4bitには、数値が正の場合X'4'、負の場合X'5'が入ります。
変数に不正な値が入ったときの規則
変数に不正な値が入ったときの規則は、COBOL文法書で以下のように記述しています。
6.3.14 矛盾するデータ(COBOL文法書より)
字類条件を除いて、手続き部でデータ項目の内容が参照される場合、データ項目の
内容がPICTURE句によるデータ項目の字類または関数による字類と矛盾するとき、
手続き部での参照の結果は規定しません。
変数に不正な値が入っていた場合、プログラムの動作としては、
保障されないものとなります。
例えば、以下のようなプログラムでは、(a)で外部10進項目に不正な値が転記されている
ため、(b)の比較の結果は予測できません。
01 SND-DATA PIC X(4).
01 RSV-DATA PIC 9(4).
...
MOVE SPACE TO SND-DATA
...
MOVE SND-DATA TO RSV-DATA …(a)
IF RSV-DATA = SPACE THEN …(b)
変数に不正な値が入ったときの動作
GS/Mシリーズでは、ハードウェア命令がデータ異常を検出し、アプリケーションが異常終了
する場合があります。しかし、オープン系のアーキテクチャーでは、データ異常を検出しないため、
不正な値のまま処理され、実行結果が期待した値になりません。
不正な実行結果の残さないために、外部10進項目を使用する場合、字類検査(IS NUMERIC)
を行い、正しい値が格納されていることを確認してから、使用します。
01 SND-DATA PIC X(4).
01 RSV-DATA PIC 9(4).
...
MOVE SPACE TO SND-DATA
MOVE 0 TO RSV-DATA
...
IF SND-DATA IS NUMERIC THEN …(c)
MOVE SND-DATA TO RSV-DATA …(d)
ELSE
DISPLAY NC"データ異常" SND-DATA
END-IF
...
上記の(c)では、IF文の条件で SND-DATAには数字が入っているかどうかを確認しています ので、(d)の転記処理では正しい転記結果が得られるようになります。
デバッグ方法
安全なプログラムを作成するには、プログラム内で字類条件を用いて、 正しいデータであることを確認してください。
既にあるプログラムで誤ったデータを処理していないかどうかを確認するには、 翻訳オプションに「CHECK(NUMERIC)」または「CHECK(ALL)」を指定して、 翻訳、実行してください。このオプションの指定により、外部10進項目および内部10進項目に 不正なデータが格納されていた場合、実行時に誤りが検出されます。
