• ベストアンサー

COBOLのCALL文がいまいちつかめません。

いつもお世話になっています。 WINDOWSでCOBOL85を使いながら、COBOLの勉強をしています。 JAVAを基本情報試験のために勉強したくらいの初心者です。 シーケンシャルファイルでマッチング処理を行う、 小さなプログラムを課題としている途中、 CALL文を使ってサブプログラムを作ってみてくださいと言われました。 そこで質問なのですが、 メインプログラムの集団項目をUSING指定で引数として、 サブプログラムで受け取り、処理をするまではいいのですが、 戻り値をどのようにして受け取ればいいのかが イメージがつかめません。 ・戻り値を受け取るための命令 ・戻り値は1つだと思うのですが、どの変数?に返ってくるのか (集団項目ごと返ってくる?) など、何かあればご助言をいただけないでしょうか? ソースは次の通りです。 よろしくお願いいたします。 ■メイン IDENTIFICATION DIVISION. PROGRAM-ID. MACHING_TEST. (省略) WORKING-STORAGE SECTION.   01 JUDGE_F.    03 KEY_F     PIC 9(01).    03 CHANGE_F     PIC X(06).    03 EXCEP_M     PIC 9(01). (省略) CALL "JUDGE_FEMALE" USING JUDGE_F ON EXCEPTION   DISPLAY N"エラーです。プログラムを終了します"   STOP RUN   NOT ON EXCEPTION    IF EXCEP_M = 9 THEN MOVE "ERRER!" TO FEMALE_OUT ELSE  IF EXCEP_M = 1 THEN MOVE CHANGE_F TO  FEMALE_OUT  END-IF    END-IF    END-CALL. (以下略) ■サブ IDENTIFICATION DIVISION. PROGRAM-ID. JUDGE_FEMALE. DATA DIVISION. LINKAGE SECTION. 01 JUDGE_F.  03 KEY_F PIC 9(01).  03 CHANGE_F PIC X(06).  03 EXCEP_M PIC 9(01). PROCEDURE DIVISION USING JUDGE_F. IF KEY_F = 1  THEN   MOVE "オトコ" TO CHANGE_F   MOVE 1 TO EXCEP_M  ELSE   IF KEY_F = 2 THEN  MOVE "オンナ" TO CHANGE_F  MOVE 1 TO EXCEP_M ELSE  MOVE 9 TO EXCEP_M END-IF END-IF. PROGRAM-END.  STOP RUN.

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

メインからは CALL "JUDGE_FEMALE" USING JUDGE_F とJUDGE_Fいう項目を使ってサブをコールしてます。 質問文では書かれてませんが、CALLする前に、KEY-Fに1、2、もしくはそれ以外がセットされてるんだと思います。 つまり、8バイトの頭1バイトだけセットしてコールするわけです。   01 JUDGE_F.    03 KEY_F     PIC 9(01).    03 CHANGE_F     PIC X(06).    03 EXCEP_M     PIC 9(01). サブの側ではコール元のプログラムが、KEY-Fに何をセットしてきたかを判定して、CHANGE-FとEXCEP-Mにデータをセットしています。 メインはサブから返されたJUDGE-Fを使って引き続き処理を行います。集団項目で渡して集団項目で帰ってくるだけです。この場合、CHANGE-FとEXCEP-Mをセットするためのサブプログラムですが、作りようによって何項目でも返せます。(必要なだけ定義して集団項目にすればよいです)

minarin2714
質問者

お礼

集団項目を渡して、集団項目で返ってくることが わからず、ずっと規則集と例題を見ながら悩んでいました。 定義したテーブルをそのまま渡せて、処理して戻されるのは 分かってしまえば便利に思えますね。 すばやい回答ありがとうございました。

その他の回答 (2)

回答No.2

>・戻り値を受け取るための命令 >・戻り値は1つだと思うのですが、どの変数?に返ってくるのか >(集団項目ごと返ってくる?) 外部サブプログラム側で、リンケージセクションに書いたデータ定義体は、 呼出側のメインプログラムの引数とデータを受け渡します。(受け取るだけでなく”戻す”) サブプログラム内の何処かで、リンケージセクションで記述しているデータ項目を 改変すれば、メインプログラム側へ引き継がれます。

minarin2714
質問者

お礼

データ項目が処理されてメインプログラム側に戻されるのですね。 Javaのイメージで何かで値を戻さないといけないのかと ずっと悩んでいたので、問題が解決したので次の問題へと 進んでいけます。 回答ありがとうございました。

  • bardfish
  • ベストアンサー率28% (5029/17766)
回答No.1

CALL文に戻り値などありません。 CALLで呼び出されたサブプログラム内で不具合が発生した場合、「ステータス値」を設定してサブプログラムを終了し、呼び出した側で「ステータス値」判定を行います。 通常は、処理結果が正常/異常を判定するためにLINKAGEには「ステータス」項目を用意しておきます。

minarin2714
質問者

お礼

すばやい回答ありがとうございます。 CALL文に戻り値はないのですね。規則集などは目を通したの ですが、いまいち理解できなかったところなので とても助かりました。 ステータス項目も付け足しておこうと思います。

関連するQ&A