富士通

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進項目に 不正なデータが格納されていた場合、実行時に誤りが検出されます。