COBOLの記憶域再定義を解説(REDEFINESの使用方法)

記憶域の再定義アイキャッチ

今回はCOBOLの再定義を解説します。COBOLではPL/Iと同じように再定義を行うことができます。
再定義はそれぞれの項目を各変数で定義した後に、二つの項目をKEY項目にしたい場合などに使用すると非常に便利です。
Atcoderなどの競プロで受け取った文字列を分割する場合などにも使えます、もちろん文字列の分割には、UNSTRING関数を使用することもできるので、ケースによって使い分けてください。

再定義の方法

では早速、COBOLで再定義を行う方法を解説していきます。
再定義を行うには、「REDEFINES」指定を行います。

下記は簡単な例です。

DATA DIVISION.
    WORKING-STORAGE SECTION.
        
        01 A-SAMPLE.
            03 A PIC 99.
            03 B PIC 99.
        
        01 B-SAMPLE REDEFINES A-SAMPLE.
            03 C PIC 9999.

PROCEDURE DIVISION.
    MAIN SECTION.
        
        MOVE 12 TO A.
        MOVE 34 TO B.

        DISPLAY A.    *> 12
        DISPLAY B.    *> 34
        DISPLAY C.    *> 1234

上記の例で説明すると、「A-SAMPLE」で定義した記憶域を使用して、「B-SAMPLE」を再定義しています。
再定義する際には、通常のデータ定義に「REDEFINES 再定義元データ名」を指定します。
そのため、今回は変数Aと変数Bの出力を合わせたものを変数Cとして再定義していますので、変数Cの中にあるものは「1234」となります。

再定義元と再定義先のレベルを揃える

また、再定義元と再定義先のレベルも同じにしてください。
「01 A-SAMPLE」を再定義したい場合、再定義先の「B-SAMPLE」に関しても同じレベルの「01」にする必要があります。
それ以下の項目に関しては、レベルは自由に設定可能です。

イメージで説明

再定義のイメージは以下の通りです。

再定義
再定義例

上記の例のように、変数Aと変数Bの領域を変数Cとして定義しているので、コード例のような出力となるのです。

どんな場面で使用するか

この再定義の方法は、レコードを処理する場合、複数の項目を一つのキーとして使用する場合などに使用します。
上述のイメージ図で解説した、項目Aと項目Bの二つをレコードのキー項目として使用する場合に、再定義を行ない、項目Cとすることで簡単にキー項目を用意することができるというわけです。

再定義を複数回行う

再定義は一つだけでなく、複数回(何回でも?)再定義を行うことができます。
「A-SAMPLE」を「B-SAMPLE」で再定義し、「A-SAMPLE」を「C-SAMPLE」でも再定義するといったようなことが可能です。

ちなみに、、、再定義先の「B-SAMPLE」を「C-SAMPLE」で再定義しようとすると、エラーになりますので注意が必要。

DATA DIVISION.
    WORKING-STORAGE SECTION.
        
        01 A-SAMPLE.
            03 A PIC 99 VALUES 1.
            03 B PIC 99 VALUES 90.
        
        01 B-SAMPLE REDEFINES A-SAMPLE.
            03 C PIC 9999.
            
        01 C-SAMPLE REDEFINES A-SAMPLE.
            03 D PIC XXXX.

初期値を与える場合

再定義を使用する場合には、初期値の設定には注意が必要。

初期値を設定する際には、定義元でのみ初期値の設定が可能であり、再定義先での初期値設定はエラーの原因となる可能性があるのでするのはダメです。

つまり、下記のような初期値の設定はすることができません。

DATA DIVISION.
    WORKING-STORAGE SECTION.
        
        01 A-SAMPLE.
            03 A PIC 99.
            03 B PIC 99.
        
        01 B-SAMPLE REDEFINES A-SAMPLE.
            03 C PIC 9999 VALUES 1919.

再定義をする際には、以下のように、再定義元で行うようにしましょう。

    WORKING-STORAGE SECTION.
        
        01 A-SAMPLE.
            03 A PIC 99 VALUES 19.
            03 B PIC 99 VALUES 19.
        
        01 B-SAMPLE REDEFINES A-SAMPLE.
            03 C PIC 9999.

REDEFINESを使用する際の注意点

REDEFINESを使用する際の注意点として、再定義元と再定義先の間に関係のない定義を入れないことが必要です。もし、再定義先と再定義元との間に関係のない定義をしてしまうとエラーになるので注意しましょう。

正しい例

DATA DIVISION.
    WORKING-STORAGE SECTION.
        
        01 A-SAMPLE.
            03 A PIC 99 VALUES 1.
            03 B PIC 99 VALUES 90.
        
        01 B-SAMPLE REDEFINES A-SAMPLE.
            03 C PIC 9999.
            
        01 C-SAMPLE.
            03 D PIC 9999.

間違った例

DATA DIVISION.
    WORKING-STORAGE SECTION.
        
        01 A-SAMPLE.
            03 A PIC 99 VALUES 1.
            03 B PIC 99 VALUES 90.
        
        01 C-SAMPLE.
            03 D PIC 9999.
            
        01 B-SAMPLE REDEFINES A-SAMPLE.
            03 C PIC 9999.

REDEFINES指定をする際には、再定義元と再定義先の位置をしっかり確認しましょう。

同じ変数名を使用する方法

一通り再定義の方法について説明をしましたが、再定義を行う際には同じ変数名を使用することがよくある。
COBOLではその際に、「変数名 OF グループ名」と指定することで、同じ変数名でも転記や算術式などで使用することができる。

DATA DIVISION.
    WORKING-STORAGE SECTION.
        
        01 A-SAMPLE.
            03 A PIC 99 VALUES 10.
            03 B PIC 99 VALUES 90.
        
        01 B-SAMPLE REDEFINES A-SAMPLE.
            03 A PIC 9999.
            
PROCEDURE DIVISION.
    MAIN SECTION.
        
        DISPLAY A OF A-SAMPLE.  *> 10
        DISPLAY A OF B-SAMPLE.  *> 1090

        *> 計算する場合
        ADD A OF A-SAMPLE B OF A-SAMPLE GIVING A OF B-SAMPLE.
        DISPLAY A OF B-SAMPLE.  *> 0100

ただし、可読性が悪くなる等の問題点があるので変数名は一意のものとしましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA