BY REFERENCE は、受け取った変数にサブプログラムが加えた変更を、呼び出し側プログラムから見ることができることを意味します。
BY CONTENT は、呼び出し側プログラムがリテラル または id の内容だけを渡すことを意味します。 CALL...BY CONTENT を使用すると、呼び出し先プログラムは、 受け取ったパラメーターを変更しても、呼び出し側プログラムのリテラル または id の値は変更することができません。
BY VALUE は、呼び出し側プログラムが、 送信項目の参照ではなくリテラル または id の値を受け渡すことを意味します。 呼び出し先プログラムがパラメーターを変更できるのは、その呼び出し先プログラム内だけです。 しかし、サブプログラムは送信項目の一時的なコピーにアクセスするだけなので、 これらの変更は呼び出し側プログラムの引き数には影響を与えません。
データを渡すために BY REFERENCE、BY VALUE、または BY CONTENT のどれを使うかは、 プログラムでデータをどのように処理するかによって決まります。
CALL...BY REFERENCE identifier
サブプログラムがパラメーターに対して変更を加えると、呼び出し側プログラムの引き数も変更されます。
CALL...BY REFERENCE ADDRESS OF record-name
サブプログラムは、指定したレコード名の ADDRESS OF 特殊レジスターを受け取ります。
呼び出し側プログラムおよび呼び出し先プログラムのリンケージ・セクションに、 レコード名をレベル 01 項目またはレベル 77 項目として定義しておかなければなりません。 リンケージ・セクションのレコードごとに、それぞれ別個の ADDRESS OF 特殊レジスターが提供されます。
CALL...BY CONTENT ADDRESS OF data-item-name
CALL...BY CONTENT identifier
CALL...BY VALUE item
CALL...BY VALUE integer-1 SIZE integer-2
整数値は、長さが「整数-2」の 2 進数値として渡されます。 SIZE 句の指定はオプショナルです。 指定されない場合、「整数-1」は 4 バイトの 2 進数として渡されます。
CALL...RETURNING identifier
CALL...BY CONTENT literal呼び出し先プログラムでは、リテラルの値を変更できません。
CALL...BY CONTENT LENGTH OF identifier
CALL 'ERRPROC' USING BY REFERENCE A BY CONTENT LENGTH OF A.
CALL...BY REFERENCE OMITTED CALL...BY CONTENT OMITTED
呼び出し先プログラムでは、CEETSTA API を使用することによって、 指定されたパラメーターが OMITTED かそうでないかを判別することができます。
SPECIAL-NAMES. LINKAGE TYPE PRC FOR 'ERRPROC' USING ALL DESCRIBED.または
·
·
·
CALL 'ERRPROC' USING BY REFERENCE identifier.
SPECIAL-NAMES. LINKAGE TYPE PRC FOR 'ERRPROC' USING ALL DESCRIBED.
·
·
·
CALL 'ERRPROC' USING BY CONTENT identifier.
呼び出し側プログラムのデータ項目は、直接または間接に呼び出すすべてのプログラムのリンケージ・セクションに記述することができます。 この場合、これらの項目のストレージは、最外部の呼び出し側プログラムに割り振られます。
呼び出し側プログラムから渡されるデータを引き数といいます。 呼び出し側プログラムにおいて、データ部に引き数が記述される方法は、他のデータ項目がデータ部に記述される方法と同じです。 引き数がリンケージ・セクションにあるのでない限り、ストレージが呼び出し側プログラムのこれらの項目に割り振られます。 ファイル中のデータを参照する場合、データの参照時にそのファイルはオープンされていなければなりません。 引き数を渡すには、CALL ステートメントの USING 文節をコーディングします。
呼び出し先プログラムで受け取られるデータをパラメーターといいます。 呼び出し先プログラムでは、パラメーターはリンケージ・セクションに記述されます。 パラメーターを受け取るには、PROCEDURE-DIVISION ヘッダーの後ろに USING 文節をコーディングします。
呼び出し側プログラムから渡される内容を理解しておき、 呼び出し先プログラムがそれを受け入れることができるようリンケージ・セクションを設定することが必要です。 呼び出し先プログラムには、データを渡すために CALL ステートメントのどの文節 (BY REFERENCE、BY VALUE または BY CONTENT) を使用するかは問題ではありません。 どの場合でも、呼び出し先プログラムで、受け取ったデータを記述しなければなりません。 この記述はリンケージ・セクションで行われます。
呼び出し先プログラムの id リストのデータ名 の数は、 呼び出し側プログラムの id リストのデータ名 の数より大きくすることはできません。 それらの位置は 1 対 1 で対応しています。 すなわち、呼び出し側プログラムの最初の id は、 呼び出し先プログラムの最初の id に渡され、2 番目以降も同様になります。 ILE COBOL コンパイラーでは、引き数の数とパラメーターの数についても、 または引き数と対応するパラメーター間でのタイプとサイズについても、その整合性を強制することはありません。
引き数の数とパラメーターの数が矛盾している場合、実行時例外が生じる可能性があります。 動的プログラム呼び出しの場合、引き数の数がパラメーターの数よりも多い時に、CALL ステートメントを実行しようとすると、 呼び出し側プログラムで実行時例外が生成されます。 CALL ステートメントに ON EXCEPTION 句を指定すると、この例外を捕らえることができます。
引き数の数がパラメーターの数より小さい場合、CALL ステートメントを実行しても呼び出し側プログラムに実行時例外は生成されません。 しかし、呼び出し先プログラムで、指定されていないパラメーターにアクセスしようとすると、ポインター例外が生成されます。
引き数が BY VALUE により渡された場合、サブプログラムの PROCEDURE DIVISION ヘッダーには次のことが指定されていなければなりません。
PROCEDURE DIVISION USING BY VALUE DATA-ITEM.
引き数が BY REFERENCE または BY CONTENT により渡された場合、PROCEDURE DIVISION ヘッダーでは、 引き数がどのように渡されたかを指定する必要はありません。 ヘッダーは以下のどちらかでもかまいません。
PROCEDURE DIVISION USING DATA-ITEM
または
PROCEDURE DIVISION USING BY REFERENCE DATA-ITEM
プログラム間で渡したいデータ項目をすべてグループ化し、それらを 1 つのレベル 01 項目にまとめることができます。 これを行うと、 プログラム間で単一のレベル 01 レコードを渡すことができます。 この方法の例として、図 58 を参照してください。
レコードの不一致が発生する可能性をさらに低くするには、レベル 01 レコードをコピー・メンバーに入れて、両方のプログラムにコピーします。 (すなわち、呼び出し側プログラムの WORKING-STORAGE SECTION と、呼び出し先プログラムの LINKAGE SECTION にコピーします。)
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.