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 |
呼び出すサブプログラム:
サブプログラム名にアンパサンド(&)を含むこともできます。実行時にこの文字は、システム変数 |
|
operand2 |
Parameters:
パラメータをサブプログラムに渡す場合、パラメータリストの構成は、 デフォルトでは、パラメータは参照によって渡されます。つまり、データはアドレスパラメータを介して転送され、パラメータ値自体は移動されません。ただし、パラメータを値によって渡す、つまり実際のパラメータ値を渡すこともできます。これを行うには、サブプログラムの
注意: いずれのパラメータ引き渡し方法にも、次が適用されます。
呼び出されたサブプログラムのパラメータデータエリアでは、グループの再定義は 配列を渡す場合、サブプログラムのパラメータデータエリアの次元数とオカレンス数は 注意:
|
|
AD= |
属性定義:
|
|
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
** 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