CALL(呼出し)文

CALL(呼出し)文は、実行単位中で他の実行用プログラムに制御を移させる。

対象とする実行用プログラムの手続きを、番地を指定することによって、間接的に呼ぶことができる。データとデータへのポインタと手続きへのポインタを、パラメータとして呼ばれるプログラムに引き渡したり、呼ばれるプログラムから返してもらったりできる。パラメータ受渡し方式を制御することによって、COBOL以外の言語で書かれたプログラム手続きを呼ぶことができる。

呼ぶばれたCOBOLプログラムは、再帰属性を持っていれば、再帰的に自分を呼ぶことができる。

  1. CALL文の手続きポインタの使用例は、言語リファレンス - 追加トピック中のの章の手続きポインタの呼出しと設定節に掲載されている。

一般形式

形式 1

形式 2 (プログラムプロトタイプ)

指令

  1. 予約語リストにフラグを付けたり修正したりするコンパイラ指令に加えて、下記の指令によって、この項に記述した構文または意味が影響を受ける可能性がある。

    • ALIGN - 01レベルまたは77レベルのデータ項目を割り付けるメモリーの境界を指定する。

    • CASE - 大文字と小文字を等しいとみなすかどうかを指定する。

    • DEFAULTCALLS - 省略時の呼出し方式を指定する。

    • DYNAM - CALL定数文によって呼び出されたプログラムを取り消しできるかどうかを指定する。

    • FOLD-CALL-NAME - 呼ぶプログラムと呼ばれるプログラムの間でプログラム名に関して同じ大文字と小文字の使い方が同じでないときに、呼ばれた副プログラムが見つかるように保証するか否かを指定する。

    • IBMCOMP - 語記憶モードを設定する。

    • MAPNAME - プログラム名中の英字以外の文字の取扱いに影響する。

構文規則

星印(*)の付いている構文規則はCALL文およびCHAIN文に共通である。それらの規則を「CALL文」または「CHAIN文」に適用するさいには、「CALL文」または「CHAIN文」を読むべきである。

すべての形式
  1. * 一意名-1は英数字データ項目、

    または各国語型データ項目

    として定義しなければならない。

  2. * 定数-1、

    定数-2、

    および定数-3

    は英数字定数、

    または各国語型定数

    でなければならず、表意定数であってはならない。

  3. * 一意名-2および一意名-4はファイル節、作業場所節、

    局所記憶節、

    通信節、連絡節のいずれかにデータ項目として定義されていなければならず、レベル01またはレベル77のデータ項目、

    または基本項目

    または任意の集団項目

    でなければならない。

    一意名-2は、ファクトリオブジェクトまたはインスタンスオブジェクトの作業場所節またはファイル節で定義されてはならない。

  4. * 一意名-5、一意名-6、一意名-7、一意名-8はいずれも、関数一意名であってはならない。

  5. * GIVING句およびRETURNING句は、どちらを使用してもよい。

  6. 一意名-9 は、連絡節中の01レベルまたは77レベルのデータ項目とする。

  7. *ANY LENGTH 句を使用して、一意名-2、一意名-4、一意名-6、および一意名-8を記述してはならない。

形式 1
  1. 呼び名が必要なのは、呼び出す対象の実行用プログラムで用いられている呼出し方式と、COBOLシステムの省略時の呼出し方式とが異なる場合だけである。通常は、COBOLの省略時の呼出し方式は、COBOL以外の言語の主要な処理系のランタイム環境で使用されている方式と整合性がある。

    呼び名は特殊名段落中に定義しなければならない。その方法の詳細については、環境部の章の特殊名段落節を参照。また、ランタイム環境においてサポートされている呼出し方式の詳細については、COBOLのシステムのマニュアルを参照。

  2. * 整数-1は符合付きであってよい。

  3. * 一意名-3は連絡節、

    局所記憶節または作業場所節

    にデータ項目として定義されていなければならず、

    レベル01またはレベル77のデータ項目、

    またはその他のレベルのデータ項目

    でなければならない。

  4. CALL文に定数-1を指定し(ただし、CALL文に一意名-1または手続きポインタ-1を指定した場合を除く)、かつ現在の翻訳単位中に呼出しプロトタイプ(プログラム名段落中にEXTERNAL句があるプログラム)が含まれていてその名前が定数-1に合致する場合、構文チェックの間に下記の項目の妥当性が検査される。

    • 必要なパラメータの数

    • パラメータの型

    • 呼出し方式

  5. *一意名-2は、クラスオブジェクトまたはポインタのデータ項目であってはならない。

形式 2
  1. NESTED指定は、プログラム定義以外で使用してはならない。

  2. NESTED指定を使用した場合は、定数-1を指定しなければならない。定数-1は、COBOL言語の概念の章のプログラム名に関する表記法節で指定されたように、共通プログラムのプログラム名段落中で指定されたプログラム名と同じでなければならない。または、呼ぶプログラムの直下に含まれるプログラムのプログラム名段落中で指定されたプログラム名と同じでなければならない。

  3. プログラムプロトタイプ名-1は、リポジトリ段落中のプログラム指定子で指定しなければならない。

  4. 引数についてBY CONTENT指定またはBY REFERENCE指定を使用した場合は、手続き部見出し中の対応する仮パラメータに対して、BY REFERENCE を指定しなければならない。

  5. 一意名-4が受取り側作用対象として許可された一意名であるときに、BY CONTENTを省略してはならない。ただし、一意名-4がオブジェクトプロパティである場合は、 BY CONTENT を省略してもよい。

  6. 引数についてBY VALUE指定を使用した場合は、手続き部見出し中の対応する仮パラメータに対して、BY VALUE指定を使用しなければならない。

  7. 一意名-6の字類は、数字、オブジェクト、またはポインタでなければならない。

  8. 定数-4は数字定数でなければならない。

  9. OMITTED指定を使用した場合は、手続き部見出し中の対応する仮パラメータに対して、OPTIONAL指定を使用しなければならない。

  10. 適合規則は、手続き部の章のパラメータと戻り項目の適合節で指定されたものが適用される。

一般規則

星印(*)の付いている構文規則はCALL文およびCHAIN文に共通である。それらの規則を「CALL文」または「CHAIN文」に適用するさいには、「CALL文」または「CHAIN文」を読むべきである。

すべての形式
  1. 定数-1、または一意名-1によって参照されるデータ項目の内容は呼ばれるプログラム

    または呼ばれる手続きの名前である。

    CALL文を含むプログラムは呼ぶプログラムである。呼ばれるプログラムがCOBOLプログラムである場合、定数-1、または一意名-1によって参照されるデータ項目の内容はプログラム名であって、呼ばれるプログラムのプログラム名段落に記述されているものでなければならない(見出し部の章のプログラム名段落節を参照。特に大文字と小文字の区別について)。

    あるいは、定数-1、または一意名-1によって参照されるデータ項目の内容は入口名であって、呼ばれるプログラムのENTRY文中に記述されているものでなければならない。しかも、呼ばれるプログラムはすでに呼び出されており、その後で取り消されていてはならない。別の方法として、呼ばれるプログラムの名前はそのプログラムの実行プログラム用のコードが収められているファイルを指す名前であってもよい。2つのCALL文の間でまたはCALL文とCANCEL文の間で同じファイルを指す別の名前を指定した場合にどのような結果になるかは、オペレーティング・システムによって異なる。呼ばれたプログラム、プログラム・ファイル、あるいはライブラリ・ファイル中に保持されているプログラムと指定された名前の照合方法の詳細については、インターフェイスに関するCOBOLシステムのマニュアルを参照。

    呼ばれるプログラムがCOBOLプログラムではない場合のプログラム名または手続き名の構成に関する規則が、インターフェイスに関するCOBOLシステムのマニュアルに記載されている。

  2. 手続きポインタ-1によって参照されるデータ項目の内容は呼ばれるプログラムの番地であり、そのプログラムはすでにメモリーにロードされていなければならない。呼ばれるプログラムがCOBOLプログラムである場合は、呼ばれるプログラムの番地が当初にENTRY指定を伴うSET文を用いて導出されており、その後でそのプログラムに対してCANCEL文が実行されていてはならない。呼ばれるプログラムがCOBOLプログラムではない場合は、呼ばれるプログラムの番地が当初にCOBOL以外のプログラムまたは手続きへのCALLを通じて導出されていなければならない。番地がNULLであるプログラムをCALLしようとすると、エラーとなる。

  3. CALL文が実行されたときに、その対象のプログラムが実行可能な状態になると、そのプログラムに制御が移される。呼ばれたプログラムから制御が戻ると、ON OVERFLOW指定や

    ON EXCEPTION指定

    は、指定されていても無視され、制御はCALL文の末尾に移される。

    あるいは、NOT ON EXCEPTION指令が指定されていると、制御は無条件文-2に移される。制御が無条件文-2に移されると、その無条件文-2の中に指定されている各文に関する規則に従って、プログラムの実行が続けられる。制御の明示移行を引き起こす手続き分岐文または条件文が実行されると、その文に関する手続きに従って制御が移される。これ以外の場合は、無条件文-2の実行が終了すると制御はCALL文の末尾に移される。

  4. CALL文が実行されたときに、対象のプログラムがすでにメモリーにロードされていると、そのプログラムは実行可能な状態にされる。そのプログラムがまだメモリーにロードされていないと、そのプログラムを動的にロードする試みがなされる(インターフェイスに関するCOBOLシステム・ドキュメンテーションを参照)。対象のプログラムの所在を動的に把握でき、メモリーに連続した十分な空き領域があると、そのプログラムは動的にロードされて実行可能な状態にされる。

    CALL文に指定されたプログラムがメモリーにロードされていないか、動的なロードに利用できないか、あるいは動的なロードに利用できるがメモリーに十分な空き領域がない場合には、その時点ではそのプログラムを実行可能にすることはできない。その場合、下記の2つのうちのどちらかの措置が取られる。

    1. CALL文の中にON OVERFLOW

      またはON EXCEPTION

      指定がある場合には、無条件文-1に制御が移される。それから、無条件文-1に指定されている各文の規則に応じて、処理が続行される。制御を明示的に移す手続き分岐または条件文が実行されると、その文の規則に応じて制御が移される。それ以外の場合には、無条件文-1の実行が完了すると、CALL文の最後に制御が移され、

      NOT ON EXCEPTION指定はあっても無視される。

    2. ON OVERFLOW指定またはON EXCEPTION指定がない場合、NOT ON EXCEPTION指定はあっても無視される。

      実行単位中の開かれているファイルに関して、明示的なCLOSE文なしにプログラムの実行が停止され、ランタイム・エラーが表示される。

  5. 実行単位内の2つ以上のプログラムに、同じプログラム名をもたせることができる。呼ぶプログラム内でこのようなプログラム名を参照したとき、どちらのプログラムを指すかは、プログラム名の範囲の適用規則に従う。COBOL言語の概念の章のプログラム名の規則節を参照。たとえば、CALL文の中に指定されたプログラム名と同じ名前のプログラムが、実行単位中に2つあるとする。

    1. それらの2つのプログラムのうちの1つは、そのCALL文が含まれる独立のプログラムに直接的または間接的に含まれるか、またはそのCALL文が含まれるプログラム自体が、直接的または間接的に含まれる独立のプログラムに直接的または間接的に含まれなければならない。かつ、

    2. もう1つのプログラムは、別の独立したプログラムでなければならない。

    この例で、使用される仕組みは、下記のとおり。

    1. CALL文中に指定された名前をもつ2つのプログラムの一方が、そのCALL文が含まれるプログラム中に直接的に含まれるならば、そのプログラムが呼ばれる。

    2. CALL文中に指定された名前をもつ2つのプログラムの一方が共通属性をもち、そのCALL文が含まれるプログラムが直接的または間接的に含まれる独立のプログラムに直接的に含まれるならば、その共通プログラムが呼ばれる。ただし、呼ぶプログラムがその共通プログラムに含まれる場合は例外である。

    3. それ以外の場合は、別のプログラムが呼ばれる。

  6. 呼ばれたプログラムがCOBOLプログラムで、初期属性をもたない場合、そのプログラムおよびその中に直接的または間接的に含まれる各プログラムは、実行単位の中で最初に呼ばれたとき、および呼ばれたプログラムが取り消された後ではじめて呼ばれたときに、初期状態に置かれる。

    呼ばれたプログラムがCOBOLプログラムでない場合、実行単位の中で最初に呼ばれたときにだけ初期状態に置かれる。このようなプログラムの取り消しは効果がない。

    それ以外の場合に呼ばれたときは、呼ばれるプログラムおよびその中に直接的または間接的に含まれる各プログラムの状態は、前回に呼ばれたときのままである。COBOL以外の言語の処理系の中には、意味合いが違っているものがある。可能な場合には、インターフェイスに関するCOBOLシステムのマニュアルに、その詳細が記載されている。

  7. 呼ばれたプログラムが初期属性をもつ場合、そのプログラムおよびその中に直接的または間接的に含まれる各プログラムは、実行単位の中で呼ばれるたびに初期状態に置かれる。呼ばれたプログラムが初期状態にあるか使用され終わった状態にあるかは、DYNAMコンパイラ指令の設定に左右される。

  8. 呼ばれるプログラムの内部ファイル結合子に関連するファイルは、プログラムが初期状態にあるときは、まだオープンされていない。前述のプログラムの初期状態の節を参照。それ以外の場合に呼ばれたときは、それらのすべてのファイルの状態と位置付けは、前回に呼ばれたときのままである。

  9. プログラムを呼ぶ過程または呼んだプログラムから戻る過程で、外部ファイル結合子に関連するファイルの状態と位置付けが変えられることはない。

  10. 呼ばれるプログラムがCOBOLプログラムである場合、その手続き部の見出し

    またはENTRY文

    の中にUSING指定がある場合にのみ、CALL文にUSING指定が含められる。その場合、各USING指定内の作用対象の数は同じでなければならない。

    作用対象の数が同じである必要はない。

  11. 呼ばれるプログラムがCOBOLプログラムではない場合、そのプログラムに1つ以上のパラメータが宣言されている場合にのみ、CALL文にUSING指定が含められる。その場合、USING指定内の作用対象の数は呼ばれるプログラム中のパラメータの数と同じでなければならない(COBOL以外の言語の処理系の中には、作用対象の数が同じでなくともよいものがある)。COBOL言語では、データ項目の番地の桁寄せに制約はない。他方、COBOL以外の言語では、通常は番地について前提があり、桁寄せされていないデータ項目が参照されると何らかのエラーを起こす。桁寄せは下記の措置のうちのいくつかを用いて実現される。

    • 集団項目に無名項目を追加する

    • ALIGNコンパイラ指令を使用するとともに、USING指定中の作用対象を01レベルまたは77レベルのデータ項目にする

    • SYNCHRONIZED句とIBMCOMPコンパイラ指令を併用する

  12. * CALL文

    またはCHAIN文

    のUSING指定、および呼ばれるプログラムの手続き部の見出し

    または呼ばれるプログラムがCOBOLでない場合はENTRY文またはパラメータ・リスト

    の中の対応するUSNIG指定に中に作用対象が置かれている順序によって、

    呼ぶプログラムと呼ばれるプログラムで使用されているデータ名の対応関係が決まる。この対応は位置で決まるのであって、名前が等しいことによるのではない。CALL文

    またはCHAIN文

    USING指定の中の最初の作用対象が呼ばれるプログラムのUSNIG指定またはパラメータ・リストの最初の作用対象に対応し、それらの2番目同士が対応する、などとなる。

    両方の作用対象の数が異なるために、完全には対応がとれないことがある。その場合、対応する相手がなくて残っている作用対象がCALL文またはCHAIN文の側にある場合、それらは無視される。残っている作用対象が手続き部の見出しまたはENTRY文またはパラメータ・リストの側にある場合、それらは呼ばれるプログラムの中で参照されてはならない。位置による対応は、呼び名によって暗黙的に示される呼出し方式によって変わることがある。

    指標名の場合は、そのような対応関係は確立されない。呼ぶプログラムと呼ばれるプログラムの指標名は常に別々の指標を参照する。

  13. *CALL文のUSING指定の中で参照されるパラメータの値は、そのCALL文が実行された時点で、呼ぶプログラムにとって利用可能になる。

  14. * パラメータにBY REFERENCE 一意名-2 指定を

    明示的または

    暗黙的に指定すると、実行用プログラムは、呼ばれるプログラム中の対応するデータ項目が、呼ぶプログラム中のデータ項目と同じ記憶領域を占めるかのように動作する。 呼ばれるプログラム中のデータ項目のデータ記述には、呼ぶプログラム中の対応するデータ項目と同じ文字数を指定する。

    BY REFERENCE ADDRESS OF指定を明示的または暗黙的に指定すると、プログラムの動作は次のようになる。具体的には、USAGE POINTERを用いて追加のデータ項目が指定され、「SET データ項目 TO ADDRESS OF 一意名-3」文によって取得された値がBY REFERENCEによってそのデータ項目に渡されたかのように動作する。

    一意名-3が連絡節にあってそのレベル番号か01または77以外であるか、または作業場所節にある場合、そのデータ項目がBY CONTENTによって渡され、一意名-3の番地を呼ばれるサブプログラムによっては変更できないことに等しい。

    「BY REFERENCE 一意名-2」を明示的または暗黙的に指定すると、オブジェクト・プログラムは定数-2を定数-3のために記述されたものとして処理する。

  15. * BY CONTENT指定を明示的または暗黙的に指定すると、CALL文中のUSING句内で参照されたパラメータの値は、呼ばれたプログラム側では変更できない。しかし、呼ばれたプログラムは、その手続き部の見出しの中で、対応するデータ名によって参照しているデータ項目の値を変更できる。CALL文のBY CONTENT指定中の各パラメータに関するデータ記述は、手続き部の見出しの中のUSING句の中の対応すパラメータに関するデータ記述と同じにする。つまり、変換も拡張も切捨てもあってはならない。

    パラメータに関してBY CONTENT指定を明示的または暗黙的に指定すると、オブジェクト・プログラムの動作は次のようになる。具体的には、追加のデータ項目が宣言され、そのデータ項目がBY REFERENCE指定の中でパラメータとして使用されるかのように動作する。一意名-4を指定すると、追加データ項目の暗黙的なデータ記述とその内容の両方が、一意名-4のものと同じとなる。一意名-3を指定すると、追加データ項目の暗黙的なデータ記述は、サイズと内容が一意名-3と同じ英数字データ項目に等しくなる。「LENGTH OF 一意名-5」を指定すると、追加データ項目のデータ記述は、形式がPIC S9 (n) USAGE COMPとなる。ここで、nの値は9以上である。このデータ記述により、使用しているCOBOLシステムで処理可能なデータ項目の最大サイズが定義される。追加データ項目の内容は、一意名-5に割り当てられた記憶領域のバイト数に設定される。

  16. *BY VALUE指定を明示的または暗黙的に指定すると、CALL文のUSING指定の中で参照されているこのパラメータの値を、呼ばれるプログラムは変更できない。それにもかかわらず、呼ばれるプログラムはその手続き部の見出しの中の対応するデータ名によって参照されるデータ項目の値を変更することはできる。概念的には、システム領域(通常は「スタック」)に追加のデータ項目が宣言され、それがパラメータを渡すためにCOBOL以外の言語に利用可能であり、その記憶領域が呼ばれるプログラム中のデータ項目と同じであるかのように、オブジェクト・プログラムは動作する。

    一意名-6が指定され、BINARY、COMP-4、COMP-5、およびCOMP-Xのいずれかである場合は、追加データ項目のデータ記述とその内容の両方が、一意名-6のものと同じとなる。整数-1を指定すると、追加データ項目のデータ記述は、一意名-6のデータ記述と同じとなる。ただし、その用途はCOMP-5となる。追加データ項目の内容は、COMP-5である一意名-6の内容と同じとなる。この変換と形式により、非COBOLプログラムの呼出しが容易となる。

    上記以外で、一意名-6が指定された場合は、暗黙的に指定された追加データ項目のデータ記述とその内容が、一意名-6のものと同じとなる。

    整数-1を指定すると、追加データ項目のデータ記述は符号付き数字項目 USAGE COMP-5と同じとなる。この数字項目は、整数-2が指定された場合は、その値により示されるバイト数で記憶される。それ以外の場合は、システム領域のサイズ(典型的な例は、システム上のPOINTERのサイズ)で記憶される。

    LENGTH OF 一意名-7を指定した場合は、追加データ項目のデータ記述はPIC S9(n) USAGE COMP-5と同じとなる。ここで、n の値は 9 以上で、COBOLシステムのデータ項目の最大長を保持できるサイズのデータ項目を定義する。追加データ項目の内容は、一意名-7に割り当てられた記憶用バイト数に設定される。

    呼ばれるプログラムがCOBOLプログラムの場合、CALL文のBY VALUE指定中の各パラメータに対応するパラメータを、手続き部見出しのUSING指定で宣言しなければならない。この対応するパラメータにも、BY VALUE指定が明示的または暗黙的に指定されているものとする。

    上記の、CALL文の結果として生成された追加データ項目は、この対応するパラメータとは以下のようま関係を持つ。

    追加データ項目が、BINARY、COMP-4、COMP-5、またはCOMP-XからCOMP-5への変換の対象であった場合、呼ぶプログラム中にある対応するパラメータのデータ記述は、追加データ項目のデータ記述と同じでなければならない。ただし、対応するパラメータの用途は、BINARY、COMP-4、COMP-5、およびCOMP-Xのどれでもよい。呼ぶCOBOLプログラムへの記述の際に、追加データ項目の用途 COMP-5から、呼ぶプログラム中の対応するパラメータの用途への変換が実行される。

    追加データ項目がCOMP-5への変換の対象でなかった場合、呼ばれるプログラム中の各パラメータのデータ記述は、対応する追加データ項目のデータ記述と同じでなければならない。これは、追加データ項目に対し、呼ばれるプログラム中の対応するパラメータと一致させるための変換、拡張、および切り捨てのいずれも行われないことを意味する。

    呼ばれるプログラムがCOBOLプログラムでない場合、追加データ項目のサイズはシステム領域の最大サイズ(典型的な例は、システム上のPOINTERのサイズ)を超えないものとする。そうでない場合は、システムが壊滅的に破壊される可能性がある。

  17. 呼ばれるプログラムから呼ぶプログラムにデータを渡す手段には、呼ぶプログラムのUSING指定中に宣言されているパラメータを使用する方法と、戻り値を使用する方法とがある。呼ばれるプログラムはEXIT GIVING文またはGOBACK GIVING文によって値を戻す。呼ばれたプログラムから呼んだプログラムに制御が戻されると、戻り値がシステム領域に収められる。その領域は一般に、値を戻すために、COBOL以外のプログラムによって利用可能である。

    システム領域のサイズ(通常はシステム上のPOINTERのサイズ)は、COBOLシステムの外で決定され、戻り値が取りうる最大値の制約要因となる。ただし、戻り値がシステム領域の最大サイズに満たないことがある。制御が戻された後で、呼んだプログラムで戻り値を利用できるようになる。それは、暗黙的に特殊なレジスタであるRETURN-CODEに収められていることもあれば、GIVING指定に指定したデータ項目に明示的に収められていることもある。

  18. GIVING指定を書かず、呼出し方式に特殊レジスタのRETURN-CODE(環境部の章の特殊名段落中節を参照)を更新するように指定されている場合、オブジェクト・プログラム動作は次のようになる。具体的には、システム領域がそのサイズのままCOBOLの数字データ項目でUSAGE COPM-5が指定されているものとして定義され、そのシステム領域を送出し側とし特殊レジスタのRETURN-CODEを受取り側として、MOVE文を実行したかのように動作する。

  19. 呼ぶプログラム中にGIVING INTO指定を書いた場合には、戻り値をシステム領域に収めるのに必要なのと同じ長さを一意名-8に指定しなければならない。また、一意名-8の型と用途は、呼ばれるプログラムからの値の返され方によって暗黙的に示される型と用途に等しくなければならない。呼んだプログラムに制御が戻されると、戻り値が一意名-8に収められている。

  20. 呼ぶプログラムにGIVING ADDRESS OF指定を書いた場合、呼ばれるプログラムが返す値は明示的または暗黙的にUSAGE POINTERと指定されたものでなければならない。オブジェクト・プログラム動作は次のようになる。具体的には、システム領域がUSAGE POINTERと指定されたCOBOLのデータ項目として宣言され、そのシステム領域を最初の作用対象とし「ADDRESS OF 一意名-9」を2番目の作用対象として、SET文を実行したかのように動作する。

  21. 呼ばれるプログラムが値を返さない場合にGIVING指定を書くと、エラーとなる。

  22. 呼ばれたプログラムの中に、CALL文が含まれていてもよい。 しかし、

    呼ぶプログラムが再帰属性を持っていない限り、

    呼ばれたプログラム呼ばれたプログラムは、呼んだプログラムを直接的または間接的に呼ぶCALL文を実行しない。

  23. 宣言部分の範囲内でCALL文が実行されるとき、そのCALL文は、制御が移されたがまだ実行を終了していない呼ばれたプログラムを直接的にも間接的にも参照できない。

  24. END-CALL指定は、CALL文の範囲を区切る。

  25. USAGE POINTER 、

    またはUSAGE PROCEDURE-POINTER

    が明示的または暗黙的に指定されており、呼ばれるプログラム中のデータ項目、

    または手続き

    の番地から当初に導出された値は、その呼ばれたプログラムに対してCANCEL文が実行された後では無効になるので、使用してはならない。

  26. 使用されないパラメータをサブプログラムに渡すために、OMITTED指定を使用することができる。その場合、ダミーのデータ項目を宣言する必要はない。

  27. OMITTEDパラメータはBY REFERENCEパラメータであり、呼ばれるプログラムに空の番地を渡すことに相当する。それはBY VALUE 0 SIZE 4と指定するのと同じであるが、BY REFERENCEパラメータとして呼び出しプロトタイプの型チェックを受ける。

  28. OMITTEDの直前にBY REFERENCEを指定しないと、以降のパラメータはその前に有効であった呼出し方式に従って渡される。省いたパラメータはBY VALUE 0 SIZE 4と指定したかのように扱われる。

形式 1
  1. 呼び名は、呼ばれるプログラムを起動するときに、このプログラム使用する呼出し規則を示す。呼ばれるプログラムで設定された呼出し規則が、呼び名が示すものと違うと、COBOLシステムが動作しなくなる場合がある。

  2. 実行単位は、呼ばれたプログラムが発見され、実行可能な状態になる前は、それがCOBOLプログラムか、それ以外のプログラムか、または手続きであるかを認識していない。通常、プログラムがCOBOLプログラムかどうかは、プログラム名の形式では判定できないためである。同じプログラム名のCOBOLプログラムとCOBOL以外のプログラム、または2個のCOBOL以外のプログラムが存在していると、エラーとなる 。

  3. * BY CONTENT指定、BY REFERENCE指定、

    およびBY VALUE指定

    は、別のBY CONTENT指定、BY REFERENCE指定、

    またはBY VALUE指定

    が出現するまで、その後に続くパラメータすべてについて有効である。

    最初のパラメータの前にBY CONTENT、BY REFERENCE、

    およびBY VALUE

    のどの指定もない場合、BY REFERENCE指定が使用されているものとする。

形式 2
  1. 一意名-1、定数-1、および手続きポインタ-1のいずれも指定しない場合、プログラムプロトタイプ名-1は、環境部の章のリポジトリ段落節で指定された規則に従い、呼ばれるプログラムの外部化されたプログラム名を決定する。

  2. NESTED指定を使用すると、プログラム名段落で定数-1が指定された共通プログラムまたは含まれるプログラムが使用され、呼ばれるプログラムの特性が決定される。

  3. NESTED指定を使用しないと、プログラムプロトタイプ名-1を使用して、呼ばれるプログラムの特性が決定される。

  4. 単一の一意名または定数のみから成る引数は、算術式ではなく、一意名または定数と見なされる。

  5. キーワード、BY REFERENCE、BY CONTENT、およびBY VALUEのうち、どれも使用せずに引数を指定した場合、この引数が渡される方法は以下のように決定される。

    1. BY REFERENCE指定が明示的または暗黙的に、対応する仮パラメータに使用されていると、

      1. 引数が構文規則 3 の条件を満たす場合は、BY REFERENCEが指定されたと見なされる。

      2. 引数が構文規則 3 の条件を満たさない場合は、BY CONTENTが指定されたと見なされる。

    2. BY VALUE指定が明示的または暗黙的に、対応する仮パラメータに使用されていると、BY VALUEが指定されたと見なされる。

  6. 制御は、プログラムに対して指定された記述表記法に適合した方式で、呼ばれるプログラムに渡される。

  7. OMITTED指定を使用するか、その後の引数を省略した場合、そのパラメータの省略引数条件は、呼ばれるプログラム中で真と評価される。(手続き部の章の省略引数条件節を参照。)

  8. 呼ばれるプログラムで省略引数条件が真であるパラメータが参照されると、実行時エラー 203 となる。ただし、引数として参照される場合、および省略引数条件の中で参照される場合を除く。