導入:なぜPICTURE句を省略するのか?
COBOLのプログラムを保守していて、「なぜこの項目にはPICTURE句がないんだ?」と疑問に思ったことはありませんか。実は、COBOLには「PICTURE句を書いてはいけない(書いてはならない)」特定のケースが存在します。これを知らずに安易にPICを記述すると、コンパイルエラーになったり、予期せぬメモリレイアウトの原因になったりします。今回は、コードの安全性を高めるための「PICTURE句の省略規則」について解説します。
基礎知識:USAGE句による型定義
COBOLのデータ定義において、PICTURE句は「データが何桁の、どんな形式(数字か文字か)か」を定義するために使われます。しかし、USAGE句(データの使用形式)が指定されている場合、データ項目そのものの「型」や「サイズ」がコンパイラによって自動的に決定されます。
特に、USAGE INDEX(インデックス項目)、USAGE POINTER(ポインタ項目)、そして浮動小数点数(COMP-1/COMP-2)は、ハードウェアの仕様に基づいた特別なデータ形式です。これらはPICTURE句でサイズを細かく規定する性質のものではないため、PICTURE句の記述は禁止されています。また、複数の基本項目をまとめる集団項目(Group Item)も、文字の集まりとして扱われるため、PICTURE句は記述しません。
実装・解決策:正しい定義方法
PICTURE句が不要な項目を定義する際は、シンプルにレベル番号、項目名、そしてUSAGE句のみを記述します。これにより、コンパイラは該当項目に対して適切なバイト数を自動的に割り当てます。
サンプルプログラム
以下のコードは、PICTURE句を省略すべき代表的なデータ定義の例です。コピーして、コンパイルができることを確認してみてください。
- 1. 集団項目:PICTURE句は記述しない
05 WS-GROUP-ITEM.
10 WS-FIELD-A PIC X(10).
- 2. インデックス項目:配列の添字として使用(PIC不可)
05 WS-IDX USAGE INDEX.
- 3. ポインタ項目:メモリアドレスを保持(PIC不可)
05 WS-PTR USAGE POINTER.
- 4. 浮動小数点項目:科学技術計算用(PIC不可)
05 WS-FLOAT-VAL USAGE COMP-1.
応用・注意点:現場でのトラブル回避
現場でよくあるミスは、集団項目に対して誤ってPIC Xなどを付けてしまうことです。これは文法エラーとなります。また、注意が必要なのは「再定義(REDEFINES)」をする際です。
REDEFINES句を使用する場合、再定義する側の項目にPICTURE句を記述するかどうかは、元の項目の定義に依存します。もし元がPICTURE句なしの集団項目であれば、再定義側もPICTURE句を省略するのが基本です。
最後に、「迷ったらコンパイラに聞く」のが一番です。現代のコンパイラは非常に優秀で、ルール違反があればエラーメッセージで「PICTURE句は記述できません」と明確に教えてくれます。エラーが出たら、まずはその項目が「型」をUSAGEで決定しているかどうかを確認する習慣をつけましょう。正しい定義は、バグのない堅牢なシステムへの第一歩です。

コメント