導入
この章の最後に、COBOL独特の仕組み REDEFINES を紹介します。「同じメモリ領域を、まったく違う形で読み替える」という、少し変わった機能です。
説明
01 WS-DATE PIC X(8) VALUE "20260729".
01 WS-DATE-PARTS REDEFINES WS-DATE.
05 WS-YEAR PIC 9(4).
05 WS-MONTH PIC 9(2).
05 WS-DAY PIC 9(2).
01 WS-DATE-PARTS REDEFINES WS-DATE.…WS-DATE-PARTSは、WS-DATEと同じメモリ領域を再定義(別の形で見る)する、という宣言。新しいメモリを確保するのではなく、既存の領域に別の名前と形を重ねるのがポイントです。
graph TD
subgraph overlap["同じ8バイトのメモリ領域"]
F1["WS-DATE<br/>PIC X(8)<br/>例: '20260729'"]
F2["WS-DATE-PARTS(REDEFINES WS-DATE)<br/>WS-YEAR: 9(4) = 2026<br/>WS-MONTH: 9(2) = 07<br/>WS-DAY: 9(2) = 29"]
end
F1 -.同じ領域を2通りの形で見る.- F2
この例では WS-DATE に "20260729" という8文字の文字列を入れると、その同じメモリを再定義した WS-DATE-PARTS を通して WS-YEAR(2026)・WS-MONTH(07)・WS-DAY(29)と、年月日に分解された形でアクセスできます。
PROCEDURE DIVISION.
DISPLAY WS-YEAR.
*> 結果: 2026
DISPLAY WS-MONTH.
*> 結果: 07
REDEFINESには大切な制約があります。
- REDEFINES先(
WS-DATE-PARTS)は、REDEFINES元(WS-DATE)と同じレベル番号で書く。 - REDEFINES先のサイズ(バイト数)が、REDEFINES元を超えてはいけない(超えても構文エラーにはならない処理系もありますが、意図しないメモリの読み書きにつながるため避けるべきです)。
- REDEFINESは何段でも重ねられる(同じ領域を3通り、4通りの形で持たせることも可能)。
実務では、次のような場面でよく使われます。
- ファイルの1レコードを、ケースによって違う形式で読み替えたいとき(例: レコードの先頭コードによって、後続の項目の意味が変わるレイアウト)。
- 数値項目を、文字列としても・数値としても扱いたいとき。
「新しい領域を作らずに、同じ場所を別の型として読み替える」——これは多くの現代言語にはあまりない発想ですが、限られたメモリを最大限活用してきたCOBOLらしい仕組みです。
試すには
WS-DATE に自分の好きな日付の文字列(例: "20261225")を入れ、WS-DATE-PARTS を通して WS-YEAR・WS-MONTH・WS-DAY に分解された値をそれぞれDISPLAYしてみましょう。