
いつもお世話になっています。
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.
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をセットするためのサブプログラムですが、作りようによって何項目でも返せます。(必要なだけ定義して集団項目にすればよいです)
集団項目を渡して、集団項目で返ってくることが
わからず、ずっと規則集と例題を見ながら悩んでいました。
定義したテーブルをそのまま渡せて、処理して戻されるのは
分かってしまえば便利に思えますね。
すばやい回答ありがとうございました。
No.2
- 回答日時:
>・戻り値を受け取るための命令
>・戻り値は1つだと思うのですが、どの変数?に返ってくるのか
>(集団項目ごと返ってくる?)
外部サブプログラム側で、リンケージセクションに書いたデータ定義体は、
呼出側のメインプログラムの引数とデータを受け渡します。(受け取るだけでなく”戻す”)
サブプログラム内の何処かで、リンケージセクションで記述しているデータ項目を
改変すれば、メインプログラム側へ引き継がれます。
データ項目が処理されてメインプログラム側に戻されるのですね。
Javaのイメージで何かで値を戻さないといけないのかと
ずっと悩んでいたので、問題が解決したので次の問題へと
進んでいけます。
回答ありがとうございました。
No.1
- 回答日時:
CALL文に戻り値などありません。
CALLで呼び出されたサブプログラム内で不具合が発生した場合、「ステータス値」を設定してサブプログラムを終了し、呼び出した側で「ステータス値」判定を行います。
通常は、処理結果が正常/異常を判定するためにLINKAGEには「ステータス」項目を用意しておきます。
すばやい回答ありがとうございます。
CALL文に戻り値はないのですね。規則集などは目を通したの
ですが、いまいち理解できなかったところなので
とても助かりました。
ステータス項目も付け足しておこうと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) COBOL数値転記をCOPY句内での仕様 6 2022/06/15 18:48
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
- Visual Basic(VBA) 実行時エラー´5854´ 文字列型パラメーターが長すぎます。 3 2023/06/08 21:17
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで仕様書は書きますか?
-
XMLでyahooのAPIを叩きローカル...
-
VBからシャットダウンさせる方法
-
クリップボードを排他的に利用...
-
C言語の質問です
-
正しい五十音順について
-
銃を発砲するならともかく、日...
-
C++ で、「)」が必要 というエ...
-
あるプログラムのコマンドライ...
-
65536は2の何乗なのでしょうか?
-
C言語のことなんですが
-
時間差を求める
-
Vba UserFormを前面に出す方法...
-
バッチファイルでUSB挿入時に実行
-
functionを含んだプログラムを...
-
読み込み中にアクセス違反が発...
-
関数がどうしても分かりません
-
VBAにてメール作成した際、一部...
-
PICマイコンのコピー(クローン...
-
フローチャートで 変数に代入す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで仕様書は書きますか?
-
空elseの有無
-
変数・オブジェクト名に漢字使用
-
C++ソースからUMLの設計書を作...
-
テキストの折り返し処理について
-
プログラミングのコード量に関...
-
Visual Basic で C++ を使いたい!
-
VBからシャットダウンさせる方法
-
C言語(gcc), Linux, FTPプログ...
-
格闘ゲームを作るのは大変なん...
-
ベンダーでBVを使って開発し...
-
VB.NETでSqlClientを利用して複...
-
きれいなコード vba vbaを勉強...
-
プログラムの勉強の仕方
-
他人が作ったプログラムのメン...
-
COBOLのCALL文がいまいちつかめ...
-
クリップボードを排他的に利用...
-
プログラミングの読み方、書き...
-
他人の作ったソースの見方(どこ...
-
ソースコード改造 msペイント
おすすめ情報