Rational Developer for System z
Enterprise COBOL for z/OS バージョン 4.1 プログラミング・ガイド


データの受け渡し

プログラム間のデータの受け渡し方法には 3 つあり、それらから選択できます。BY REFERENCEBY CONTENT、または BY VALUE

BY REFERENCE
サブプログラムは、データのコピーを処理するのではなく、呼び出し側プログラムのストレージ内のデータ項目を参照して処理します。 BY REFERENCE は、パラメーターに関して 3 つの方法のどれも指定されておらず、暗黙指定されてもいない 場合の、パラメーターの想定引き渡しメカニズムです。
BY CONTENT
呼び出し側プログラムは、literal または identifier の内容だけを渡します。 呼び出し先プログラムは、呼び出し側プログラム内の literal または identifier の値を変更できません。たとえ、 literal または identifier を受け取ったデータ項目を変更する場合でも変更できません。
BY VALUE
呼び出し側プログラムまたはメソッドは、送り出しデータ項目を参照せず、literal または identifier の値を渡します。呼び出されるプログラムまたはメソッドは、その中のパラメーターを変更できます。しかし、サブプログラムまたはメソッドは送り出しデータ項目の一時コピーへのアクセス権しか持っていないので、どの変更内容も呼び出し側プログラムの引数に影響を与えません。

次の図に、BY REFERENCEBY CONTENT、および BY VALUE によって渡される値の違いを示します。

この図は、BY REFERENCE、BY CONTENT、および BY VALUE での受け渡しを比較します。 詳細へのリンク。

プログラムでどのようにデータを処理したいかに基づいて、上記のデータ受け渡し方法のどれを使用するかを決定してください。

表 1. CALL ステートメントでデータを渡す方法
コード 目的 コメント
CALL . . . BY REFERENCE identifier 呼び出し側プログラムの CALL ステートメントの 引数の定義と呼び出されるプログラムのパラメーターの定義に、同じメモリーを共用させる。 サブプログラムがパラメーターに対して行う変更は、呼び出し側プログラムの引数に影響を与えます。
CALL . . . BY REFERENCE ADDRESS OF identifier identifier のアドレスを呼び出し先プログラムに渡します。ここで、identifierLINKAGE SECTION 内の項目です。 サブプログラムがアドレスに対して行う変更は、呼び出し側プログラム内のアドレスに影響を与えます。
CALL . . . BY REFERENCE file-name データ制御ブロック (DCB) をアセンブラー・プログラムに渡す。 ファイル名は QSAM 順次ファイルを参照しなければなりません。1
CALL . . . BY CONTENT ADDRESS OF identifier identifier のアドレスのコピーを、呼び出し先プログラムに渡します。 アドレスのコピーに任意の変更を加えても identifier のアドレスには影響しませんが、アドレスのコピーを使用する identifier を変更すると identifier が変更されます。
CALL . . . BY CONTENT identifier ID のコピーをサブプログラムに渡す。 サブプログラムによってパラメーターを変更しても、呼び出し側の ID には影響しません。
CALL . . . BY CONTENT literal 呼び出し先プログラムにリテラル値のコピーを渡す。  
CALL . . . BY CONTENT LENGTH OF identifier データ項目の長さのコピーを渡す。 呼び出し側プログラムは、その LENGTH 特殊レジスターから identifier の長さを渡します。
次のような BY REFERENCEBY CONTENT の組み合わせ:
CALL 'ERRPROC'
   USING BY REFERENCE A
   BY CONTENT LENGTH OF A.
データ項目とその長さのコピーの両方をサブプログラムに渡す。  
CALL . . . BY VALUE identifier C/C++ プログラムなど、BY VALUE パラメーター・リンケージ規約を使用する プログラムにデータを渡す。 ID のコピーがパラメーター・リストとして直接渡されます。
CALL . . . BY VALUE literal C/C++ プログラムなど、BY VALUE パラメーター・リンケージ規約を使用する プログラムにデータを渡す。 リテラルのコピーがパラメーター・リストとして直接渡されます。
CALL . . . BY VALUE ADDRESS OF identifier 呼び出し先プログラムに identifier のアドレスを渡す。データに対するポインターを必要とする C/C++ プログラムにデータを渡すのに推奨される方法。 アドレスのコピーに任意の変更を加えても identifier のアドレスには影響しませんが、アドレスのコピーを使用する identifier を変更すると identifier が変更されます。
CALL . . . RETURNING 関数戻り値を使用して C/C++ 関数を呼び出す。  
  1. CALL オペランドとしてのファイル名は、COBOL への IBM 拡張部分として許可されます。拡張部分の使用は一般的に、コンパイラーの特定の内部インプリメンテーションによって異なります。制御ブロック・フィールドの設定は、今後のリリースで変更される場合があります。制御ブロックに対して行われる変更は、各自の責任であって、IBM がサポートするものではありません。

関連参照
CALL ステートメント (Enterprise COBOL 言語解説書)
USING 句 (Enterprise COBOL 言語解説書)
INVOKE ステートメント (Enterprise COBOL 言語解説書)


ご利用条件 | フィードバック

このインフォメーション・センターでは Eclipse テクノロジーが採用されています。(http://www.eclipse.org)