1. 導入:なぜREDEFINESのルールを知る必要があるのか
COBOLの現場で避けて通れないのが、一つのメモリ領域を複数の形式で使い分ける「REDEFINES」句です。しかし、この機能は非常に強力である反面、使い方を誤るとコンパイルエラーや予期せぬデータ破損を招きます。特に「レベル番号」のルールを理解していないと、大規模なデータ定義の変更時に思わぬトラブルを引き起こします。今回は、REDEFINESを安全かつ確実に使うための「レベル番号一致の原則」を解説します。
2. 基礎知識:REDEFINESとは何か
REDEFINESとは、簡単に言うと「同じメモリ上の場所に、別々の名前と形式を割り当てる」機能です。例えば、ある項目を「文字列」として受け取った後、プログラム内で「数値」として計算したい場合などに使われます。
ここで最も重要なルールが、「再定義する項目(REDEFINESされる側)」と「再定義される項目(REDEFINESする側)」のレベル番号を一致させるということです。このルールを守ることで、コンパイラはメモリ上のどの位置からデータを読み取るべきかを正確に判断できます。
3. 実装と解決策:レベル番号の正しい指定方法
REDEFINES句は、再定義する項目を記述した直後に指定しなければなりません。
ルールとして、以下の2点を必ず守ってください。
・再定義する項目と、再定義される項目のレベル番号は同じであること。
・再定義する項目は、再定義される項目の直後に記述すること。
※ただし、01レベル(レコード全体)を再定義する場合や、集団項目を再定義する場合など、複雑な構造になるほどこのルールがデータの整合性を守る命綱となります。
4. サンプルプログラム
以下のコードは、10桁の文字列領域を、用途に応じて「文字列」として扱う場合と「数値」として扱う場合の例です。そのままコピーして、ご自身の環境で試してみてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. REDEFINE-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 05レベルで定義し、同じレベル番号で再定義する
05 WS-DATA-AREA PIC X(10) VALUE “1234567890”.
05 WS-NUMERIC-DATA REDEFINES WS-DATA-AREA PIC 9(10).
PROCEDURE DIVISION.
DISPLAY “— REDEFINESのテスト開始 —”
- 文字列として表示
DISPLAY “文字列としての値: ” WS-DATA-AREA
- 数値として計算(REDEFINESにより同じメモリを数値として参照)
COMPUTE WS-NUMERIC-DATA = WS-NUMERIC-DATA + 10.
- 結果を表示
DISPLAY “計算後の値: ” WS-NUMERIC-DATA
STOP RUN.
5. 応用・注意点:現場で陥りやすい罠
実務で注意すべきは、「初期値の指定」です。REDEFINES句を指定した項目には、VALUE句を記述することができません。初期値を与えたい場合は、必ず「元の項目(REDEFINESされる側)」に対してVALUE句を記述してください。
また、集団項目を再定義する場合、再定義する側と再定義される側のデータ長が一致していなくてもコンパイルは通ることがありますが、これはメモリの範囲外を参照する危険なコードになります。常に「データ長が一致しているか」を確認する癖をつけることが、ベテランへの第一歩です。ルールを守り、安全なコードを書いていきましょう。

コメント