はじめに ✨
COBOLプログラミングを進めていくと、プログラムを機能ごとに分割して、再利用可能な部品(サブルーチン)にしたい場面が出てきます。他のプログラム(サブルーチン)を呼び出すには CALL
文を使いますが、その際に重要なのが、呼び出し元と呼び出し先の間でデータをやり取りする「パラメータ受け渡し」です。
このデータの受け渡しを定義するのが、呼び出される側のプログラム(サブルーチン)にある LINKAGE SECTION(リンケージ・セクション) です。今回は、この LINKAGE SECTION の役割と、具体的なパラメータ受け渡しの方法について学んでいきましょう!
LINKAGE SECTIONとは? 🤔
LINKAGE SECTION は、COBOLプログラムの DATA DIVISION
内に記述される特別なセクションです。これは、主にサブルーチン(呼び出される側のプログラム)で使われ、呼び出し元のプログラムから渡されるデータを受け取るための「窓口」のような役割を果たします。
WORKING-STORAGE SECTION
がプログラム内部で使用するデータを定義するのに対し、LINKAGE SECTION は外部から受け取るデータの構造を定義します。ここで定義されたデータ項目は、呼び出し元プログラムから渡された値を受け取るための入れ物になります。
重要な点として、LINKAGE SECTION で定義されたデータ項目は、それ自体がメモリ領域を持つわけではありません。あくまで、呼び出し元プログラムが持っているデータの場所(アドレス)を受け取り、その場所を参照してデータを扱います(これを「参照渡し」と呼びます)。
パラメータ受け渡しの仕組み 🤝
プログラム間でデータを渡すには、主に以下の2つのステップが必要です。
- 呼び出し元プログラム:
CALL
文のUSING
句を使って、渡したいデータ項目を指定します。 - 呼び出し先プログラム(サブルーチン):
LINKAGE SECTION
で、受け取るデータ項目の構造を定義します。PROCEDURE DIVISION
の見出しにUSING
句を使って、LINKAGE SECTION で定義したどのデータ項目で値を受け取るかを指定します。
呼び出し元 CALL
文の USING
句に書かれたデータ項目の並び順と、呼び出し先 PROCEDURE DIVISION USING
句に書かれたデータ項目の並び順が、それぞれ対応します。
具体的なコード例 📝
簡単な例を見てみましょう。メインプログラム (MAINPROG
) から、2つの数値をサブルーチン (SUBPROG
) に渡し、その合計を計算してメインプログラムに戻す処理を考えます。
呼び出し元プログラム (MAINPROG.cob)
IDENTIFICATION DIVISION.
PROGRAM-ID. MAINPROG.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(4) VALUE 100.
01 WS-NUM2 PIC 9(4) VALUE 50.
01 WS-RESULT PIC 9(5). *> サブルーチンからの結果を受け取る領域
PROCEDURE DIVISION.
DISPLAY "呼び出し前の値:".
DISPLAY " WS-NUM1 : " WS-NUM1.
DISPLAY " WS-NUM2 : " WS-NUM2.
DISPLAY " WS-RESULT : " WS-RESULT. *> 初期値は不定
*> サブルーチンを呼び出し、パラメータを渡す
CALL "SUBPROG" USING WS-NUM1, WS-NUM2, WS-RESULT.
DISPLAY "呼び出し後の値:".
DISPLAY " WS-NUM1 : " WS-NUM1. *> 参照渡しなので変更される可能性あり
DISPLAY " WS-NUM2 : " WS-NUM2. *> 参照渡しなので変更される可能性あり
DISPLAY " WS-RESULT : " WS-RESULT. *> 計算結果が格納される
STOP RUN.
呼び出し先プログラム (SUBPROG.cob)
IDENTIFICATION DIVISION.
PROGRAM-ID. SUBPROG.
DATA DIVISION.
LINKAGE SECTION. *> 呼び出し元から渡されるデータを受け取る領域
01 LK-NUM1 PIC 9(4).
01 LK-NUM2 PIC 9(4).
01 LK-RESULT PIC 9(5).
PROCEDURE DIVISION USING LK-NUM1, LK-NUM2, LK-RESULT. *> 受け取るパラメータを指定
*> 受け取った値を計算し、結果を返す
COMPUTE LK-RESULT = LK-NUM1 + LK-NUM2.
*> 受け取った値を表示(デバッグ用)
DISPLAY "サブルーチン内の値:".
DISPLAY " LK-NUM1 : " LK-NUM1.
DISPLAY " LK-NUM2 : " LK-NUM2.
DISPLAY " LK-RESULT : " LK-RESULT.
*> サブルーチンを終了(暗黙的に呼び出し元に戻る)
EXIT PROGRAM.
コードの説明
- メインプログラム (
MAINPROG
) は、WORKING-STORAGE SECTION
にWS-NUM1
,WS-NUM2
,WS-RESULT
を定義します。 CALL "SUBPROG" USING WS-NUM1, WS-NUM2, WS-RESULT.
でサブルーチンSUBPROG
を呼び出し、3つの変数をパラメータとして渡します。- サブルーチン (
SUBPROG
) は、LINKAGE SECTION
にLK-NUM1
,LK-NUM2
,LK-RESULT
を定義します。これらの PIC句と長さは、呼び出し元の対応する変数と一致しています。 PROCEDURE DIVISION USING LK-NUM1, LK-NUM2, LK-RESULT.
で、CALL
文のUSING
句で渡された値(実際にはそのアドレス)を、LK-NUM1
,LK-NUM2
,LK-RESULT
で受け取ることを宣言します。- サブルーチン内で
LK-RESULT
に計算結果を代入すると、呼び出し元のWS-RESULT
の値も変更されます(参照渡しのため)。 EXIT PROGRAM
でサブルーチンの処理を終了し、呼び出し元のCALL
文の次の行に制御が戻ります。
パラメータ受け渡しの注意点 ⚠️
- データ型と長さの一致: 呼び出し元と呼び出し先で、対応するパラメータの
PIC
句とデータ長は厳密に一致させる必要があります。これが異なると、予期せぬエラーやデータ破壊の原因となります。 - パラメータの順番:
USING
句に指定するパラメータの順番は、呼び出し元と呼び出し先で完全に一致させる必要があります。順番が違うと、意図しないデータが渡されてしまいます。 - 参照渡し (BY REFERENCE) vs 値渡し (BY CONTENT):
- デフォルト(
BY REFERENCE
または省略時)では「参照渡し」となり、サブルーチン側でパラメータの値を変更すると、呼び出し元の変数の値も変更されます。 CALL
文のUSING
句でBY CONTENT
を指定すると「値渡し」となり、サブルーチン側で値を変更しても、呼び出し元の変数の値は変更されません。これは、サブルーチンが値のコピーを受け取るためです。呼び出し先プログラムに影響を与えずに値を渡したい場合に使用します。
- デフォルト(
- LINKAGE SECTION の VALUE句: LINKAGE SECTION で定義するデータ項目に
VALUE
句(初期値)を指定することは、通常できません(レベル88の条件名を除く)。値は呼び出し元から渡されるものだからです。
まとめ 🎉
今回は、サブルーチンを呼び出す際のデータの受け渡しに不可欠な LINKAGE SECTION
とパラメータ受け渡しの仕組みについて学びました。
LINKAGE SECTION
は、呼び出し元から渡されるデータを受け取るための定義を行う場所です。CALL
文とPROCEDURE DIVISION
のUSING
句を使って、パラメータを連携させます。- データ型、長さ、順番を正確に一致させることが非常に重要です。
- 参照渡し (
BY REFERENCE
) と値渡し (BY CONTENT
) の違いを理解しましょう。
LINKAGE SECTION を使いこなすことで、プログラムのモジュール化が進み、より構造化された、再利用性の高い COBOL プログラムを作成できるようになります。次は、COPY文を使ったコードの再利用について学んでいきましょう! 💪
参考情報 📚
より詳しく知りたい方は、以下の情報も参考にしてみてください。
- IBM Documentation – リンケージ・セクション: https://www.ibm.com/docs/ja/i/7.5?topic=dd-linkage-section
- GeeksforGeeks – Linkage Section in COBOL: https://www.geeksforgeeks.org/linkage-section-in-cobol/
- Micro Focus Documentation – 呼び出し先のプログラムへのパラメーターの引き渡し: https://www.microfocus.com/documentation/visual-cobol/vc80/VS2022/GUID-3F80F6E7-23D8-4F06-9F4E-97877A638689.html
コメント