COBOL

段落とサブプログラム

処理を名前付きのまとまりへ分け、読みやすく再利用しやすくします。

COBOL入門の講座一覧

01

段落を定義する

処理のまとまりの最後にピリオドを置き、段落名を付けると、後からPERFORMで呼び出せます。段落名は処理の目的が分かる名前にします。

挨拶の段落COBOL
PROCEDURE DIVISION.
MAIN-PROCESS.
    PERFORM SHOW-GREETING
    DISPLAY "処理が終わりました。"
    STOP RUN.

SHOW-GREETING.
    DISPLAY "COBOLの学習を始めます。".
実行結果OUTPUT
COBOLの学習を始めます。
処理が終わりました。
02

PERFORMで処理を呼び出す

PERFORM 段落名は、指定した段落を実行してから呼び出し元へ戻ります。入力、計算、出力などの責務を分けると、メイン処理の流れが読みやすくなります。

処理を分割するCOBOL
MAIN-PROCESS.
    PERFORM CALCULATE-TOTAL
    PERFORM SHOW-RESULT
    STOP RUN.

CALCULATE-TOTAL.
    COMPUTE TOTAL = PRICE * QUANTITY.

SHOW-RESULT.
    DISPLAY "合計: " TOTAL.

段落内の処理が終わる位置をピリオドで明確にします。呼び出した段落が意図せず次の段落まで実行し続けると、思わぬ二重実行につながるため、区切りを意識します。

03

SECTIONでさらに整理する

関連する段落をSECTIONの下へまとめることもできます。大きなプログラムでは、入力処理、検証処理、出力処理などの単位で整理します。

Sectionの例COBOL
VALIDATION-SECTION SECTION.
CHECK-SCORE.
    IF SCORE < 0 OR SCORE > 100
        DISPLAY "点数が範囲外です。"
    END-IF.

OUTPUT-SECTION SECTION.
SHOW-SCORE.
    DISPLAY "点数: " SCORE.

新しく学ぶ段階では、まず段落を使って処理のまとまりを作り、必要になったときにSectionで分類すると理解しやすいでしょう。

04

CALLで別プログラムを呼び出す

PERFORMが同じプログラム内の処理を呼ぶのに対し、CALLは別のCOBOLプログラムを呼び出します。引数を渡す場合はUSINGを使います。

CALLER.cob(呼び出し元)COBOL
IDENTIFICATION DIVISION.
PROGRAM-ID. CALLER.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SEND-MESSAGE PIC X(20) VALUE "Hello from main".
PROCEDURE DIVISION.
    CALL "SHOWMSG" USING SEND-MESSAGE
    STOP RUN.
SHOWMSG.cob(サブプログラム)COBOL
IDENTIFICATION DIVISION.
PROGRAM-ID. SHOWMSG.
DATA DIVISION.
LINKAGE SECTION.
01 RECEIVED-MESSAGE PIC X(20).
PROCEDURE DIVISION USING RECEIVED-MESSAGE.
    DISPLAY FUNCTION TRIM(RECEIVED-MESSAGE)
    GOBACK.
コンパイルと実行SHELL
cobc -m -free SHOWMSG.cob
cobc -x -free CALLER.cob -o caller
./caller
実行結果OUTPUT
Hello from main

cobc -mでサブプログラムをモジュールとして作り、呼び出し元を実行ファイルにします。生成されたSHOWMSGのモジュールは、実行時に呼び出し元から見つかる同じフォルダーへ置いてください。

05

練習

「入力」「計算」「表示」の3つの段落を作り、メイン処理から順番にPERFORMしてください。段落ごとに、どの変数を読み、どの変数を更新するかをコメントに残します。

次に、計算処理を別プログラムへ分けるなら、どのデータをUSINGで渡すかを設計してみましょう。