M |
|||||||||||||
CALLNAT operand1 |
[USING ]
|
operand2 | (AD =
|
O |
) | ||||||||
A |
|||||||||||||
nX |
|||||||||||||
このドキュメントでは、次のトピックについて説明します。
構文図で使用されている記号については、「構文記号」を参照してください。
関連ステートメント:CALL | CALL FILE | CALL LOOP | DEFINE SUBROUTINE | ESCAPE | FETCH | PERFORM
関連機能グループ:「プログラムおよびルーチンの呼び出し」
CALLNAT
ステートメントは、Natural サブプログラムを実行するために呼び出します。 Natural サブプログラムは、CALLNAT
ステートメントによってのみ呼び出すことができます。サブプログラムを単独で実行することはできません。
CALLNAT
ステートメントを実行すると、呼び出し元オブジェクト(CALLNAT
ステートメントを含んでいるオブジェクト)は中断され、呼び出したサブプログラムが実行されます。 サブプログラムの実行は、END
ステートメントに到達するまで、または ESCAPE ROUTINE
ステートメントの実行によってサブプログラムの処理が停止されるまで続きます。 どちらの場合でも、呼び出し元オブジェクトのその後の処理は、CALLNAT
ステートメントの次にあるステートメントから継続されます。
注意:
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | ステートメント参照 | ダイナミック定義 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 | C | S | A | 可 | 不可 | |||||||||||||||
operand2 | C | S | A | G | A | U | N | P | I | F | B | D | T | L | C | G | O | 可 | 可 |
構文要素の説明:
operand1 |
サブプログラム名:
operand1 として、呼び出すサブプログラムの名前を指定します。 名前は、1~8 文字の定数または変数で指定できます。プログラムロジックによって呼び出すサブプログラムが異なる場合は、長さ 1~8 の英数字の変数として指定します。 サブプログラム名に、アンパサンド(&)を含めることができます。これは、実行時にシステム変数 |
|
---|---|---|
operand2 |
パラメータ:
パラメータをサブプログラムに渡す場合、パラメータリストの構成は、 デフォルトでは、パラメータは参照によって渡されます。つまり、データはアドレスパラメータを介して転送され、パラメータ値自体は移動されません。 ただし、パラメータを値によって渡す、つまり実際のパラメータ値を渡すこともできます。 これを行うには、サブプログラムの
注意: いずれのパラメータ引き渡し方法にも、次が適用されます。 operand2 としてグループを指定すると、グループ内にある個々のフィールドがサブプログラムに渡されます。つまり、これらの各フィールドに対応するフィールドを、サブプログラムのパラメータデータエリアに定義する必要があります。 呼び出されたサブプログラムのパラメータデータエリアでは、グループの再定義は 配列を渡す場合、サブプログラムのパラメータデータエリアの次元数とオカレンス数は 注意:
|
|
AD= |
属性定義:
operand2 が変数の場合は、次のいずれかの方法でマークすることができます。 |
|
AD=O |
変更不可。セッションパラメータ 注意: |
|
AD=M |
変更可。セッションパラメータ これはデフォルト設定です。 |
|
AD=A | 入力のみ。セッションパラメータ AD=A を参照してください。
|
|
operand2 が定数の場合は、AD を明示的に指定することはできません。 定数には常に AD=O が適用されます。
|
||
nX |
表記 スキップするパラメータは、サブプログラムの |
ダイナミック変数は、呼び出されたプログラムオブジェクト(CALLNAT
、PERFORM
)へのパラメータとして渡すことができます。 ダイナミック変数の値スペースは連続しているので、参照渡しが可能です。 値渡しを使用すると、呼び出し元の変数定義がソースオペランドとして割り当てられ、パラメータ定義が応答先オペランドとして割り当てられます。
さらに、値による呼び出しは、結果として反対方向への動作を変更します。 参照による呼び出しを使用する場合、変数定義およびパラメータ定義は DYNAMIC
である必要があります。 そのうちの 1 つだけが DYNAMIC
の場合、ランタイムエラーが発生します。 値による呼び出し(の結果)の場合は、すべての組み合わせが可能です。
次の表は、パラメータの転送に関して、呼び出し元のスタティックおよびダイナミックに定義された変数と、スタティックおよびダイナミックに定義されたパラメータの有効な組み合わせを示しています。
呼び出し元の operand2 | パラメータ定義 | |
---|---|---|
スタティック | ダイナミック | |
スタティック | ○ | × |
ダイナミック | × | ○ |
ダイナミック変数 A または B のフォーマットは一致している必要があります。
呼び出し元の operand2 | パラメータ定義 | |
---|---|---|
スタティック | ダイナミック | |
スタティック | ○ | ○ |
ダイナミック | ○ | ○ |
注意:
スタティック/ダイナミックまたはダイナミック/スタティック定義を使用する場合は、割り当ての際にデータ転送の規則によって値が切り捨てられることがあります。
** Example 'CNTEX1': CALLNAT ************************************************************************ DEFINE DATA LOCAL 1 #FIELD1 (N6) 1 #FIELD2 (A20) 1 #FIELD3 (A10) END-DEFINE * CALLNAT 'CNTEX1N' #FIELD1 (AD=M) #FIELD2 (AD=O) #FIELD3 'P4 TEXT' * WRITE '=' #FIELD1 '=' #FIELD2 '=' #FIELD3 * END
** Example 'CNTEX1N': CALLNAT (called by CNTEX1) ************************************************************************ DEFINE DATA PARAMETER 1 #FIELDA (N6) 1 #FIELDB (A20) 1 #FIELDC (A10) 1 #FIELDD (A7) END-DEFINE * * #FIELDA := 4711 * #FIELDB := 'HALLO' * #FIELDC := 'ABC' * WRITE '=' #FIELDA '=' #FIELDB '=' #FIELDC '=' #FIELDD * END
** Example 'CNTEX2': CALLNAT ************************************************************************ DEFINE DATA LOCAL 1 #ARRAY1 (N4/1:10,1:10) 1 #NUM (N2) END-DEFINE * * CALLNAT 'CNTEX2N' #ARRAY1 (2:5,*) * FOR #NUM 1 TO 10 WRITE #NUM #ARRAY1(#NUM,1:10) END-FOR * END
呼び出される側のサブプログラム CNTEX2N:
** Example 'CNTEX2N': CALLNAT (called by CNTEX2) ************************************************************************ DEFINE DATA PARAMETER 1 #ARRAY (N4/1:4,1:10) LOCAL 1 I (I2) END-DEFINE * * FOR I 1 10 #ARRAY(1,I) := I #ARRAY(2,I) := 100 + I #ARRAY(3,I) := 200 + I #ARRAY(4,I) := 300 + I END-FOR * END