- ベストアンサー
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.
- みんなの回答 (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をセットするためのサブプログラムですが、作りようによって何項目でも返せます。(必要なだけ定義して集団項目にすればよいです)
その他の回答 (2)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
>・戻り値を受け取るための命令 >・戻り値は1つだと思うのですが、どの変数?に返ってくるのか >(集団項目ごと返ってくる?) 外部サブプログラム側で、リンケージセクションに書いたデータ定義体は、 呼出側のメインプログラムの引数とデータを受け渡します。(受け取るだけでなく”戻す”) サブプログラム内の何処かで、リンケージセクションで記述しているデータ項目を 改変すれば、メインプログラム側へ引き継がれます。
お礼
データ項目が処理されてメインプログラム側に戻されるのですね。 Javaのイメージで何かで値を戻さないといけないのかと ずっと悩んでいたので、問題が解決したので次の問題へと 進んでいけます。 回答ありがとうございました。
- bardfish
- ベストアンサー率28% (5029/17766)
CALL文に戻り値などありません。 CALLで呼び出されたサブプログラム内で不具合が発生した場合、「ステータス値」を設定してサブプログラムを終了し、呼び出した側で「ステータス値」判定を行います。 通常は、処理結果が正常/異常を判定するためにLINKAGEには「ステータス」項目を用意しておきます。
お礼
すばやい回答ありがとうございます。 CALL文に戻り値はないのですね。規則集などは目を通したの ですが、いまいち理解できなかったところなので とても助かりました。 ステータス項目も付け足しておこうと思います。
お礼
集団項目を渡して、集団項目で返ってくることが わからず、ずっと規則集と例題を見ながら悩んでいました。 定義したテーブルをそのまま渡せて、処理して戻されるのは 分かってしまえば便利に思えますね。 すばやい回答ありがとうございました。