こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

いつもお世話になっています。
WINDOWSでCOBOL85を使いながら、COBOLの勉強をしています。
JAVAを基本情報試験のために勉強したくらいの初心者です。
シーケンシャルファイルでマッチング処理を行う、
小さなプログラムを課題としている途中、
CALL文を使ってサブプログラムを作ってみてくださいと言われました。

そこで質問なのですが、
メインプログラムの集団項目をUSING指定で引数として、
サブプログラムで受け取り、処理をするまではいいのですが、
戻り値をどのようにして受け取ればいいのかが
イメージがつかめません。
・戻り値を受け取るための命令
・戻り値は1つだと思うのですが、どの変数?に返ってくるのか
(集団項目ごと返ってくる?)
など、何かあればご助言をいただけないでしょうか?

ソースは次の通りです。
よろしくお願いいたします。

■メイン
IDENTIFICATIONDIVISION.
PROGRAM-ID.MACHING_TEST.
(省略)
WORKING-STORAGESECTION.
  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.
(以下略)

■サブ
IDENTIFICATIONDIVISION.
PROGRAM-ID.JUDGE_FEMALE.

DATADIVISION.
LINKAGESECTION.
01 JUDGE_F.
 03 KEY_FPIC 9(01).
 03 CHANGE_FPIC X(06).
 03 EXCEP_MPIC 9(01).

PROCEDUREDIVISIONUSINGJUDGE_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.

投稿日時 - 2007-07-23 16:43:41

QNo.3192627

すぐに回答ほしいです

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

メインからは
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をセットするためのサブプログラムですが、作りようによって何項目でも返せます。(必要なだけ定義して集団項目にすればよいです)

投稿日時 - 2007-07-23 17:01:30

お礼

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

すばやい回答ありがとうございました。

投稿日時 - 2007-07-23 17:40:35

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

>・戻り値を受け取るための命令
>・戻り値は1つだと思うのですが、どの変数?に返ってくるのか
>(集団項目ごと返ってくる?)

外部サブプログラム側で、リンケージセクションに書いたデータ定義体は、
呼出側のメインプログラムの引数とデータを受け渡します。(受け取るだけでなく”戻す”)

サブプログラム内の何処かで、リンケージセクションで記述しているデータ項目を
改変すれば、メインプログラム側へ引き継がれます。

投稿日時 - 2007-07-23 16:53:06

お礼

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

回答ありがとうございました。

投稿日時 - 2007-07-23 17:36:37

ANo.1

CALL文に戻り値などありません。

CALLで呼び出されたサブプログラム内で不具合が発生した場合、「ステータス値」を設定してサブプログラムを終了し、呼び出した側で「ステータス値」判定を行います。

通常は、処理結果が正常/異常を判定するためにLINKAGEには「ステータス」項目を用意しておきます。

投稿日時 - 2007-07-23 16:51:21

お礼

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

投稿日時 - 2007-07-23 17:32:57

あなたにオススメの質問