バージョン 6.3.3
 —  プログラミングガイド  —

ファンクションコール

call-name ( < ( [ prototype-cast ] [intermediate-result-definition] ) [ parameter ] [ , [ parameter ] ] ... > )

このドキュメントでは、次のトピックについて説明します。

関連トピック:「DEFINE FUNCTION」、「DEFINE PROTOTYPE


ユーザー定義関数の呼び出し

ファンクションコールは、タイプ function の特殊オブジェクト内で定義されているユーザー定義関数を呼び出すために使用できます。

ファンクションコールには、以下の方法があります。

記号ファンクションコール

記号ファンクションコールを使用する場合は、ランタイムに実行する正確なファンクション名を指定します。

Natural ソース内で記号ファンクションコールのみを指定すると、適切なプロトタイプ定義がすでに指定されていない限り、対応する Natural ファンクション定義が自動的に取得されます。 Natural ファンクション定義が含まれているオブジェクトの名前は、記号論理ファンクション名に従って取得されます。 これは、FILEDIR.SAG ファイルのリンクレコードを使用して実行します。 この場合、リンクレコードを最初に生成する前に、対応するファンクション定義を Stow しておく必要があります。

この機能では、Natural ファンクションコールのすべてのパラメータ定義に対し、常にフォーマット/長さ定義の有効性チェックが行われます。

変数を使用したファンクションコール

変数を使用したファンクションコールでは、必要なファンクション定義名を英数字変数に格納します。 ランタイム時は、対応するファンクション定義、つまり変数内に格納されている名前の定義に、Natural は 処理を飛ばします。

これらの 2 種類のファンクションコールを識別するために、対応するプロトタイプ定義を指定する必要があります。 また、プロトタイプにはファンクション定義の署名全体を指定できます。 署名が指定されていない場合、署名の足りない部分を指定するために、ファンクションコールで PT 節を指定する必要があります。 したがって、PT 節内で指定されているプロトタイプの VARIABLE キーワードは効力を持ちません。 変数ファンクションコールの場合、ファンクション名を格納する英数字変数と同じ名前の有効なプロトタイプが存在する必要があります。

プロトタイプがファンクションコールに割り当てられていない場合、コンパイル時に戻り値のフォーマット/長さを定義するために、特殊な prototype-cast を指定する必要があります。 prototype-cast およびパラメータリストは、構文図に示されているように、山カッコで囲む必要があります。

変数による方法を使用する場合、キーワード VARIABLE を使用して variable-name と同じ名前でプロトタイプを定義する必要があります。

例:

DEFINE PROTOTYPE VARIABLE variable-name

注意:
オペランドを変更できない場合にのみ、ファンクションコールを使用できます。 ただし、ファンクションコールが INPUT ステートメント内で使用されている場合、戻り値は "出力専用" フィールド(AD=O)として表示されます。

Top of page

制限事項

ファンクションコールは、以下の状況には使用できません

Top of page

構文説明

ファンクションコールは、以下の構文要素によって構成されます。

call-name

function-name

prototype-variable-name

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
prototype-variable-name   S A     A                       不可

構文要素の説明:

function-name function-name 節は、記号ファンクション名です。 対応するファンクション定義は、特定のファンクションオブジェクトファイルに定義します。
prototype-variable-name prototype-variable-name は、呼び出すファンクションの実際の名前が格納されている変数名です。 同じ名前の英数字変数がすでに定義されている必要があります。

prototype-cast

PT=

prototype-name

prototype-variable-name

prototype-cast は、対応するファンクションプロトタイプに署名が指定されていないファンクションコールに対して使用する必要があります(プロトタイプ定義の signature 節UNKNOWN として定義されている場合など)。

intermediate-result-definition

IR=

format-length [/array-definition]

(

A [/array-definition]

DYNAMIC )
B
U

この節を使用すると、明示的または暗黙的にプロトタイプ定義を使用しなくても、ファンクションコールの戻り値の format-length/array-definition を指定できます。つまり、中間結果を明示的に指定できます。

さらに、プロトタイプがファンクションコールに対して有効な場合、ファンクション定義の戻り値の format-length/array-definition が中間結果と MOVE での互換性があるかどうかが確認されます。 互換性がない場合はエラーになり、 中間結果が戻り値として使用されます。

また、戻り値として配列を使用できます。つまり、配列定義を中間結果として指定できます。 array-definition には、配列定義の次元の下限と上限を定義します。 『ステートメント』ドキュメントの「配列の次元の定義」を参照してください。

format-length フィールドのフォーマットおよび長さ。 ユーザー定義変数のフォーマットおよび長さの定義については、「ユーザー定義変数のフォーマットおよび長さ」を参照してください。
A、B、U ダイナミック変数に対するデータタイプ:英数字、バイナリ、または Unicode
array-definition array-definition には、配列定義の次元の下限と上限を定義します。 『ステートメント』ドキュメントの「配列の次元の定義」を参照してください。
DYNAMIC フィールドは、DYNAMIC として定義できます。 ダイナミック変数の処理の詳細については、「ダイナミック変数およびフィールドについて」を参照してください。

parameter

各パラメータは、ファンクションコール時にオペランドとして使用できます。 サブプログラムの DEFINE DATA PARAMETER 内でキーワード OPTIONAL を使用してパラメータが定義されている場合、対応するオペランドの値をファンクションコールで省略できます。 この場合、nX 表記(n は 1 以上の整数)を使用するか、または単にこの引数を省略します。

セッションパラメータ AD は、引数ごとに指定できます。

    nX          

 

 

M

 

operand (AD= O )
    A  

オペランド定義テーブル:

オペランド 構文要素 フォーマット ステートメント参照 ダイナミック定義
operand C S A G   A N P I F B D T L C G O

ファンクションコールの適切な使用例については、DEFINE PROTOTYPE ステートメントの説明にあるを参照してください。

nX
省略されるパラメータ:

表記 nX を使用して、次の n 個のパラメータをスキップするように指定することができます(例えば、1X を使用すると次のパラメータがスキップされ、3X を使用すると次の 3 つのパラメータがスキップされます)。これは、次の n 個のパラメータでは、値がサブプログラムに渡されないことを意味します。

スキップするパラメータは、サブプログラムの DEFINE DATA PARAMETER ステートメント内のキーワード OPTIONAL を使用して定義する必要があります。 OPTIONAL は、値を呼び出し側オブジェクトからこのようなパラメータに渡すこともできるということを意味します。

AD=
属性定義:

operand が変数の場合は、次のいずれかの方法でマークすることができます。

AD=O

変更不可。セッションパラメータ AD=O を参照してください。

注意:
内部的に、AD=OBY VALUE と同様に処理されます(DEFINE DATA ステートメントの説明にある parameter-data-definition を参照)。

AD=M

変更可。セッションパラメータ AD=M を参照してください。

これはデフォルト設定です。

AD=A 入力のみ。セッションパラメータ AD=A を参照してください。
operand が定数の場合は、AD を明示的に指定することはできません。 定数には常に AD=O が適用されます。

Top of page