GTM-MML4VXJ
Skip to main content

FUJITSU Software NetCOBOL
プログラミング時のワンポイントアドバイス

具体的な事例を元に、COBOLプログラムを作成する上で、間違えやすいポイントおよび対策について説明します。
なお、ここでは、Windows (x86) NetCOBOLを例に説明しています。

効率よくプログラム誤りを検出しよう

ここでは、CHECKオプションのオペランド「BOUND」を使って、入力ミスが防止できるポイントをご紹介します。

CHECK機能の効果 ~オペランドBOUNDを使用したときに得られる効果~

アプリケーション運用時に発生するエラーには、添字の誤りに起因するトラブルの発生が多く、調査のための資料採取やデバッグ作業に多くの時間を費やす場合があります。事前にCHECK機能を利用すると、これらの時間を大幅に短縮することが可能となります。

プログラム例

[領域外を参照している誤ったプログラム]
プログラム例

現象

プログラムを実行すると、以下のエラーメッセージが表示されます。

[出力されるエラーメッセージ]
エラーメッセージ

メッセージはOSから出力されており、許可されていないメモリ領域への参照があったことを示しています。
さらに、プログラムでは、DISPLAY文でコンソールに出力しており、以下の内容が表示されています。

[領域外を参照している誤ったコンソール画面]
出力例

原因

「table1」には、「OCCURS 3 TIMES」で繰り返されているroomとnameの項目が計6個定義されています。

プログラムの配列図

プログラムでは、tabelの内容をDISPLAY文で表示した後、nameに固定の文字を設定しています。
この設定の時、PERFORM文の繰り返し回数が、table1の繰り返しの上限3個を超えているため、table1の外側の領域まで固定の文字を設定しています。
4回目の繰返しの時に、領域外のメモリを参照していることはコンソールにも表示されています。

上記のような簡単なプログラムでは、比較的容易に問題箇所を検出できますが、大規模で複雑なプログラムでは、原因調査に時間が掛かります。

対処

プログラム例

2回目のPERFORM文の繰返し回数をtable1の上限3個に修正することで、正しく動作するプログラムになります。

[修正後のコンソール]

修正後のコンソール

「CHECKオプション」の使い方

このような問題点をプログラムの運用開始前に検出するために、「CHECK機能」を利用します。添字のチェックを行う場合は、「BOUND」を指定します。

翻訳オプション BOUNDの追加

今回のプログラムでCHECK機能を使用した場合、実行時には以下のメッセージが表示されます。

JMP0820I-U [PID:00000C90 TID:00000C88] 添字または指標の値が範囲外を指定しています。PGM=YS1. LINE=24.1.OPD=ROOM (1)

メッセージの「LINE=」にはエラーが発生した行番号が示されます。また、「OPD=」には、データ名とデータの次元数が表示されますので、異常箇所の特定が容易です。
プログラムの行番号は、翻訳オプションに「PRINT」および「SOURCE」のオプションを指定することで、翻訳リストに表示されますので、メッセージの表示と比較してください。 なお、プログラム例は行番号付きの翻訳リストです。
実際の添字の値は、対話型デバッガで確認することができます。DISPLAY文で表示することも可能ですが、プログラムの動きを見るため、対話型デバッガの使用をお勧めします。