COBOLのINITIALIZE文を完全ガイド!初心者でもわかる変数初期化の基本と注意点
生徒
「先生、COBOLで変数を最初の状態に戻す方法ってありますか?」
先生
「良い質問ですね。COBOLでは、INITIALIZE(イニシャライズ)文を使うと、変数を簡単に初期化できますよ。」
生徒
「初期化って、どんなことをしてくれるんですか?」
先生
「初期化とは、変数の中身を最初の状態、つまり“空っぽ”や“ゼロ”に戻すことです。プログラムを正しく動かすためにはとても大切な操作なんです。」
生徒
「なるほど!じゃあ、そのINITIALIZE文の使い方を教えてください!」
先生
「もちろん!では、基本的な使い方から順番に見ていきましょう。」
1. INITIALIZE文とは?
COBOLのINITIALIZE文は、変数を初期状態に戻すための命令文です。初期化(しょきか)とは、変数の中身をあらかじめ決まった値に戻すことをいいます。例えば、数値なら「0」に、文字列なら「空白(スペース)」に戻してくれます。
プログラムを作るとき、変数に古い値が残ったままだと、思わぬ計算ミスや表示エラーが起きることがあります。そんなときに、INITIALIZEを使うことで、変数をきれいにリセット(まっさらに)できるのです。
2. INITIALIZE文の基本構文
基本的な書き方はとてもシンプルです。
INITIALIZE 変数名
たとえば、下のように書くと、変数を初期化できます。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME PIC A(10).
01 WS-AGE PIC 9(3).
PROCEDURE DIVISION.
MOVE "TARO" TO WS-NAME
MOVE 25 TO WS-AGE
DISPLAY "初期化前: " WS-NAME WS-AGE
INITIALIZE WS-NAME WS-AGE
DISPLAY "初期化後: " WS-NAME WS-AGE
STOP RUN.
実行すると、結果は次のようになります。
初期化前: TARO 025
初期化後: 000
このように、文字の変数(WS-NAME)は空白に、数値の変数(WS-AGE)はゼロに戻っています。
3. INITIALIZE文で初期化される内容
INITIALIZEは、変数の種類(データ型)によって、設定される値が異なります。以下が基本的なルールです。
- 数値項目(PIC 9など):ゼロ(0)が入ります。
- 文字項目(PIC AやXなど):空白(スペース)が入ります。
- 編集項目(PIC Zや$などを含む):空白になります。
- 再定義項目(REDEFINES):初期化されません。
このように、項目の種類ごとに自動で適切な初期値をセットしてくれるので、とても便利です。
4. VALUE句との違いに注意!
COBOLでは、変数を定義するときにVALUE句(バリューく)を使って、最初の値を設定することができます。
01 WS-COUNT PIC 9(3) VALUE 5.
しかし、INITIALIZE文を使っても、このVALUE句に書いた値は再設定されません。
つまり、INITIALIZEを使っても、VALUE句の値には戻らないのです。これが初心者の方がよく混乱するポイントです。
次の例を見てみましょう。
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-COUNT PIC 9(3) VALUE 5.
PROCEDURE DIVISION.
MOVE 123 TO WS-COUNT
DISPLAY "初期化前: " WS-COUNT
INITIALIZE WS-COUNT
DISPLAY "初期化後: " WS-COUNT
STOP RUN.
初期化前: 123
初期化後: 000
見てわかるように、初期化後の値はVALUE 5ではなく「0」になります。INITIALIZE文はVALUE句の値には戻さないということを覚えておきましょう。
5. INITIALIZE文のオプション
INITIALIZE文には、いくつかのオプションを付けることもできます。代表的なのが、REPLACING(リプレイシング)句です。これは、特定の種類のデータだけを指定して、別の値で初期化する方法です。
INITIALIZE WS-DATA
REPLACING NUMERIC DATA BY 9
ALPHANUMERIC DATA BY "*"
この例では、数値データは9、文字データは「*(アスタリスク)」で初期化されます。つまり、自分で初期化したい値を自由に設定できるのです。
6. INITIALIZEを使うときの注意点
便利なINITIALIZE文ですが、使うときにはいくつかの注意が必要です。
① 再定義(REDEFINES)には効かない
再定義された項目は初期化の対象外です。再定義とは、同じメモリ領域を別の形で使う仕組みのことです。もし必要なら、MOVE文で手動で初期化しましょう。
② GROUP項目を初期化するときは注意
INITIALIZE文でグループ項目(複数の項目をまとめたもの)を初期化すると、下位の項目もまとめて初期化されます。部分的に残したい値がある場合は、個別に初期化する方が安全です。
③ パフォーマンスに注意
大きなデータ構造を頻繁に初期化すると、処理が遅くなることがあります。初期化する回数を減らす工夫も大切です。
7. INITIALIZE文のまとめ方のコツ
複数の変数をまとめて初期化することで、コードをすっきり整理できます。例えば次のように書くと、複数のデータを一度にきれいにできます。
INITIALIZE WS-NAME WS-AGE WS-ADDRESS
プログラムの最初や、繰り返し処理のたびに初期化する場所をまとめておくと、ミスを減らすことができます。
8. 実際の開発での使いどころ
実務のCOBOLシステムでは、帳票処理やデータ更新など、同じ変数を何度も使うケースが多くあります。そんなときにINITIALIZEを使って変数をクリアにすることで、前回の処理結果が次の処理に影響しないようにできます。
たとえば、売上データを1件ずつ読み込む処理で、前の顧客名が残ってしまうと正しい結果になりません。そこで、ループの最初にINITIALIZE文を書いておくと、毎回リセットされ、正しい処理が行えます。