段落を定義する
処理のまとまりの最後にピリオドを置き、段落名を付けると、後からPERFORMで呼び出せます。段落名は処理の目的が分かる名前にします。
挨拶の段落COBOL
PROCEDURE DIVISION.
MAIN-PROCESS.
PERFORM SHOW-GREETING
DISPLAY "処理が終わりました。"
STOP RUN.
SHOW-GREETING.
DISPLAY "COBOLの学習を始めます。".実行結果OUTPUT
COBOLの学習を始めます。
処理が終わりました。PERFORMで処理を呼び出す
PERFORM 段落名は、指定した段落を実行してから呼び出し元へ戻ります。入力、計算、出力などの責務を分けると、メイン処理の流れが読みやすくなります。
処理を分割するCOBOL
MAIN-PROCESS.
PERFORM CALCULATE-TOTAL
PERFORM SHOW-RESULT
STOP RUN.
CALCULATE-TOTAL.
COMPUTE TOTAL = PRICE * QUANTITY.
SHOW-RESULT.
DISPLAY "合計: " TOTAL.段落内の処理が終わる位置をピリオドで明確にします。呼び出した段落が意図せず次の段落まで実行し続けると、思わぬ二重実行につながるため、区切りを意識します。
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で分類すると理解しやすいでしょう。
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 maincobc -mでサブプログラムをモジュールとして作り、呼び出し元を実行ファイルにします。生成されたSHOWMSGのモジュールは、実行時に呼び出し元から見つかる同じフォルダーへ置いてください。
練習
「入力」「計算」「表示」の3つの段落を作り、メイン処理から順番にPERFORMしてください。段落ごとに、どの変数を読み、どの変数を更新するかをコメントに残します。
次に、計算処理を別プログラムへ分けるなら、どのデータをUSINGで渡すかを設計してみましょう。
