CALL name [ ( [MAT] argument [ , [MAT] argument ...] ) ]
variable = 'name'
CALL @variable [ ( [MAT] argument [ , [MAT] argument ...] ) ]
CALL ステートメントを使用すると、プログラムの制御を、呼び出し側のプログラムからコンパイルおよびカタログされている外部のサブルーチンまたはプログラムに移すことができます。
ローカルでカタログされているサブルーチンは直接呼び出すことができます。 カタログにある正確な名前を使用して、name を指定します。 詳しくは、ページ 1-15 にある「CATALOG コマンド」を参照してください。
外部サブルーチンは、直接的にも間接的にも呼び出すことができます。 サブルーチンを間接的に呼び出すには、サブルーチンをカタログしたときの名前が、変数または配列のエレメントに割り当てられている必要があります。この変数名または配列エレメントの指定子の先頭に @ を付け、CALL ステートメントのオペランドとして使用します。
CALL 文を初めて実行すると、カタログされたライブラリーからサブルーチンが検索され、サブルーチン名を格納している変数の内容が位置情報に置換されます。 この処理によって、プログラム内で同じサブルーチンが繰り返し呼び出されても、その度にカタログを検索する必要がなくなります。 間接呼び出しでは、@ 変数として CALL に指定された変数が使われます。一方、直接呼び出しでは内部変数が使われます。間接的な方式では、変数へのサブルーチン名の割り当てを、CALL ステートメントを発行するたびに行うのではなく、プログラムごとに 1 回だけ行うことをお勧めします。
arguments は、実際の値を表す、変数、配列、配列変数、式、定数です。呼び出し側のプログラムからサブルーチンへは、1 つ以上の引数を渡すことができます。CALL ステートメントに渡される引数の数は、サブルーチンを識別する SUBROUTINE ステートメントで指定された引数の数と同じにする必要があります。複数の引数を渡す場合は、引数の間をコンマで区切ります。 引数が 1 物理行に収まらない場合は、行末にコンマを入力して行が続くことを示します。
argument が配列の場合、MAT キーワードが前に来る必要があります。また、このステートメントを使用する前に、呼び出し側プログラムおよびサブルーチンの両方で、配列に名前を付けて、次元を決めておいてください。 サブルーチンで配列の次元が宣言されていない場合は、SUBROUTINE ステートメントで MAT キーワードを使用して宣言する必要があります。 そのほかの引数は、配列のサイズに関係なく、同時に渡すことができます。
arguments の実際の値は、サブルーチンに渡されません。その代わりに、各引数の位置を示すポインターが渡されます。 値ではなくポインターを渡すことで、たくさんの値も効率的に渡すことができます。 引数を渡すこの方式は、参照による 受け渡しと呼ばれます。一方、実際の値の受け渡しは、値による 受け渡しと呼ばれます。
スカラー変数およびマトリックス変数は、参照でサブルーチンに渡されます。 変数を値で渡したい場合は括弧で囲みます。 データを値で渡しても、サブルーチンでのデータの処理によってメインプログラムの変数の内容が変更されることはありません。 データを参照で渡した場合、変数のメモリー位置はメインプログラムおよびサブルーチンの両方の処理で変更されます。定数で指定した引数は、値でサブルーチンに渡されます。
外部サブルーチンへの引数として配列を渡す場合、サブルーチン側でその配列に代入された次元は無視され、呼び出し側のプログラムで宣言された次元がそのまま使われます。したがって、サブルーチン側で次元の異なる配列が宣言されていても何ら問題ありません。 例えば、サブルーチンで、次のように配列が宣言されているとします。
DIM A (1), B (1, 1), C (1, 1)
対応する配列引数が、実行時に呼び出し側プログラムからサブルーチンに渡された時、配列 A、B、C は、呼び出し側プログラム内の配列の次元を継承します。DIMENSION ステートメントの索引は無視されます。
サブルーチン側で配列引数を宣言する方法としては、サブルーチンの最初の行の SUBROUTINE ステートメントで MAT キーワードを使用する方法もあります。 次の例では、A、B、および C という配列を引数として受け取ることを宣言しています。
SUBROUTINE X(MAT A, MAT B, MAT C)
サブルーチン内で RETURN ステートメントが出現するか、RETURN ステートメントが出現することなくサブルーチンの実行が終了すると、制御が呼び出し側のプログラムに戻り、CALL ステートメントの次のステートメントが実行されます。詳しくは、RETURN ステートメントを参照してください。
次の例では、SUB というローカル・サブルーチンを呼び出しています。引数はありません。
CALL SUB
次の例では、QTY.ROUTINE というローカル・サブルーチンを 3 つの引数で呼び出しています。
CALL QTY.ROUTINE(X,Y,Z)
次の例では、*PROGRAM.1 としてカタログされたサブルーチンを 6 つの引数で呼び出しています。 引数リストを、複数行にわたって記述することもできます。
AAA="*PROGRAM.1"
CALL @AAA(QTY,SLS,ORDER,ANS,FILE.O,SEQ)
次の例では、*MA というサブルーチンを呼び出しています。 索引と 3 つの引数が渡されています。
STATE.TAX(1,2)='*MA'
CALL @STATE.TAX(1,2)(EMP.NO,GROSS,NET)
次の例では、*SUB としてカタログされているサブルーチンを呼び出しています。引数として 2 つの行列と 1 つのスカラーが渡されています。
GET.VALUE="*SUB"
DIM QTY(10)
DIM PRICE(10)
CALL @GET.VALUE( MAT QTY,MAT PRICE,COST )
次の例は、1 つ前の例で呼び出されているサブルーチン SUB の SUBROUTINE ステートメントを示しています。 配列 Q および配列 P については、サブルーチン内で次元が宣言されている必要はありません。
SUBROUTINE SUB( MAT Q,MAT P,C )