Index
CALL

【用途】
プログラム内で別のプログラム(サブプログラム)を呼び出し利用する。
共通ロジックなどを別プログラムで組むことは実際のプログラミング技法としては基本中の基本。
サブプログラムとは、Windowsなら拡張子DLLにあたるもの。
難解なプログラムを細分化し、サブプログラム化することにより、よりわかり易いプログラミングを心掛けましょう。

【使用例】
・関連性がないサブプログラムの場合  CALL  "プログラムID"
・サブプログラムの結果を利用する場合(9割方こちら)  CALL  "プログラムID"  USING  利用レコード(項目)

CALL文


機能

CALL(呼ぶ)文は,実行単位中のあるプログラムから他のプログラムヘ制御を移す.


一般形式

【書き方1】
Image

【書き方2】
Image


構文規則

(1)

定数-1は,文字定数でなければならない.定数-1は,プログラム名の構成規則に従わなければならない.
定数-1の先頭の8文字が呼ぶプログラムと呼ばれるプログラムとの対応を付けるのに使用される.

(2)

一意名-1は,プログラム名を値とすることができるような英数字データ項目として定義しなければならない.一意名-1の値は,プログラム名の構成規則に従わなければならない.
先頭の8文字が,呼ぶプログラムと呼ばれるプログラムとの対応を付けるのに使用される.

(3)

USING指定の中の各作用対象は,ファイル節,作業場所節又は連絡節の中のデータ項目として定義され,レベル番号01のデータ項目,レベル番号77のデータ項目,又は基本データ項目でなければならない.
ただし,このコンパイラでは,USING指定の作用対象のデータ項目のレベル番号は,01又は77でなくてもよい.

(4)

USING指定の作用対象に記述する内部ブール項目は,バイト境界から始まっていなければならない.


一般規則

(1)

定数-1又は一意名-1のデータ項目の内容は,呼ばれるプログラムの名前とする. CALL文を書いたプログラムは,呼ぶプログラムとする.呼ばれようとするプログラムがCOBOLプログラムならば,定数-1又は一意名-1のデータ項目の内容は,呼ばれるプログラムのプログラム名段落に書かれたプログラム名を含まなければならない.

(2)

CALL文が実行されたとき,CALL文によって指定されたプログラムが実行可能となるならば,制御は呼ばれるプログラムに移る.制御が呼ばれるプログラムから戻った後,ON OVERFLOW 指定又はON EXCEPTION指定が書かれていても無視され,制御は, CALL文の終わり又はNOT ON EXCEPTION指定が書かれていれば無条件文-2に移る.制御が無条件文-2に移ると,無条件文-2に指定された各文の規則に従って,実行が続けられる.制御の明示移行を起こす手続き分岐文又は条件文を実行すると,その文の規則に従って制御が移る.そうでなければ,無条件文-2の実行を完了し,制御はCALL文の終わりに移る.

(3)

CALL文が実行されたとき,CALL文によって指定されたプログラムが実行不可能であると判断されるならば,以下に示す二つの動作のうちの一つが起こる.
(a)

CALL文にON OVERFLOW指定又はON EXCEPTION指定を記述すると,制御は無条件文-1に移る.制御の明示移行を起こす手続き分岐文又は条件文を実行すると,その文の規則に従って制御は移る.そうでなければ,無条件文-1の実行を完了し,制御をCALL文の終わりに移し,NOT ON EXCEPTION指定を記述しても無視される.

(b)

CALL文にON OVERFLOW指定又はON EXCEPTION指定を記述しないと,NOT ON EXCEPTION指定を記述しても無視される.このときのCALL文の実行結果は異常終了となる.

(4)

実行単位の二つ以上のプログラムは,同じプログラム名をもってよい.また,そのようなプログラム名のCALL文での参照は,プログラムに対する名前の範囲の規則によって解決される.
例えば,実行単位で二つのプログラムだけが,CALL文で指定された名前と同じ名前をもつときは,以下のとおりとする.
(a)

それらの二つのプログラムの一方は,そのCALL文を含む翻訳単位の中か,又はそのCALL文を含むプログラムをそれ自身が直接又は間接に含む翻訳単位の中に,直接又は間接に含まれなければならない.さらに,

(b)

それらの二つのプログラムの他方は,異なる翻訳単位でなければならない.
この例で使用される機構は,以下のとおり.
(i)

CALL文で指定された名前と同じ名前をもつその二つのプログラムの一方が,そのCALL文を含むプログラムの中に直接含まれるならば,そのプログラムが呼び出される.

(ii)

CALL文で指定された名前と同じ名前をもつその二つのプログラムの一方が,共通属性をもち,かつそのCALL文を含むプログラムを直接又は間接に含む別のプログラムの中に直接含まれるならば,その呼ぶプログラムがその共通プログラムに含まれないかぎり,その共通プログラムが呼びだされる.

(iii)

さもなければ,他方の翻訳単位が呼び出される.

(5)

呼ばれるプログラムが初期化属性をもたないならば,それ及びその中に直接又は間接に含まれる各プログラムは,実行単位で最初に呼び出された時及びその呼ばれるプログラムの取り消し後最初に呼び出された時,その初期化状態である.
上記以外の呼出しでは,呼ばれるプログラム及びそれに直接又は間接に含まれるプログラムの状態は,最後にそのプログラムからでたときの状態のままである.

(6)

呼ばれるプログラムが初期化属性をもつならば,それ及びその中に直接又は間接に含まれる各プログラムは,実行単位の中でその呼ばれるプログラムが呼び出される時は,いつでも初期化状態に置かれる.

(7)

そのプログラムが初期状態のとき,呼ばれるプログラムの内部ファイル結合子に関連するファイルは,開かれた状態でない.
上記以外の呼出しでは,そのようなファイルの状態及び位置付けは,その呼ばれるプログラムが最後に出ていったときと同じである.

(8)

呼ぶプログラムの呼ぶ処理又は呼ばれるプログラムから戻る処理は,外部ファイル結合子に関連するファイルの状態又は位置付けを変更しない.

(9)

呼び出されようとするプログラムがCOBOLプログラムならば,そのUSING指定は,呼ばれるプログラムの手続き部の見出し又はENTRY文にUSING指定がある場合だけ, CALL文に記述できる.そのような場合,各USING指定の作用対象の数は,同一でなければならない.

(10)

CALL文のUSING指定中のデータ名及び呼ばれるプログラムの手続き部の見出しの対応するUSING指定中のデータ名又はENTRY文のUSING指定中のデータ名の出現順序は,呼ぶプログラム及び呼ばれるプログラムによって使用されるデータ名の間の対応を決める.この対応は,位置によるものであり,名前によるものではない.すなわち,一方のUSING指定の最初のデータ名が他方の最初のデータ名と,二番目のデータ名が二番目のデータ名というように対する.

(11)

CALL文のUSING指定で参照されるパラメタの値は,そのCALL文が実行された時に呼ばれるプログラムで有効となる.

(12)

BY CONTENT指定とBY REFERENCE指定の両方は,それらに続くパラメタに対して,別のBY CONTENT指定又はBY REFERENCE指定が現れるまで有効である.BY CONTENT指定及びBY REFERENCE指定の両方が,最初のパラメタの前に記述されなければ,BY REFERENCE指定が書かれたものとみなす.

(13)

BY REFERENCE指定がパラメタに対して明に暗に記述された場合,その実行用プログラムは,呼ばれるプログラムの対応するデータ項目が呼ぶプログラムのデータ項目と同じ記憶領域を占有するかのように作用する.呼ばれるプログラムでの対応するデータ項目の記述によって記述される文字位置の個数と同じに記述しなければならない.

(14)

BY CONTENT指定がパラメタに対して明に記述された場合,その呼ばれるプログラムは,そのCALL文のUSING指定で参照されるパラメタの値を変更することはできないけれども,その呼ばれるプログラムは,呼ばれるプログラムの手続き部の見出し中又はENTRY文の対応するデータ名によって参照されるデータ項目の値を変更してよい. CALL文のBY CONTENT指定での各パラメタのデータ記述は,手続き部の見出しのUSING指定での又はENTRY文の対応するパラメタのデータ記述と,変換,拡張又は切捨てがないという意味において同じでなければならない.

(15)

呼ばれるプログラムは,CALL文を含んでよい.しかしながら,呼ばれるプログラムは,呼ぶプログラムを直接又は間接に呼ぶCALL文を実行してはならない.CALL文が宣言部の並びの中で実行されるならば,そのCALL文は制御が渡されていて実行が完全に終わっていない呼ばれるプログラムを直接又は間接に参照できない.

(16)

END-CALL指定は,CALL文の範囲の区切りである.

(17)

呼ばれるプログラムの手続き部の先頭に制御を移すためには,定数-1又は一意名-1の値として呼ばれるプログラムのプログラム名を指定する.
手続き部の先頭以外の入口点に制御を移すためには,定数-1又は一意名-1の値としてENTRY文によって指定されている入口名を指定する.

(18)

USING指定の作用対象として01レベル以外の集団項目を記述する場合で,その集団項目に従属する項目に用途が計算用(COMPUTATIONAL)又は2進(BINARY)でしかもSYNCHRONIZED指定が記述されている項目があるとき,その集団項目の左端を計算機の記憶装置の固有の境界に合わせるのは利用者の責任である.

(19)

同じ大域名を参照できるプログラムを呼び出すCALL文のUSING指定に,その大域名を書いてはならない.


Index