本文へスキップ
BecomeCoder

COBOLコース · 第6章 表を扱う ― OCCURSと配列 · レッスン34

REDEFINES ― 同じ領域を別の形で見る

ローカル実施

導入

この章の最後に、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-YEARWS-MONTHWS-DAY に分解された値をそれぞれDISPLAYしてみましょう。