ENTRY は、値がエントリ ポイントである定数または変数を宣言するデータ型属性であり、そのエントリ ポイントに対して宣言されているパラメーター (存在する場合) の属性を記述します。形式は次のとおりです。
ENTRY [([parameter-list])]
parameter-list は次のようになります。
()|parameter-descriptor[,parameter-descriptor]...
parameter-descriptor は次のようになります。
attribute[attribute] ... |*|,|structure-descriptor
structure-descriptor は次のようになります。
1 [attribute] ... ,level[attribute] ... [,level[attribute]] ...
任意の parameter-descriptor は、アスタリスク ( * ) を使用して、または空の parameter-descriptor の位置をカンマで示すことによって指定できます。次に例を示します。
ENTRY(FIXED BIN, , FLOAT /* Three parameters. The second is of any data type. */ ENTRY(FIXED BIN, * ,FLOAT)/* Three parameters. The second is of any data type. */ ENTRY(, , ,) /* Four parameters of any data type. */ ENTRY() /* No parameters allowed. */ ENTRY /* Any number of parameters is allowed. */
RETURNS オプションのない ENTRY 属性は、暗黙的な RETURNS データ型を持ちます。これは I-n 規則によって決まります。暗黙的な RETURNS を持つ外部エントリは、関数またはプロシージャとして呼び出すことができます。
Open PL/I では、複数のエントリがあるプロシージャのいずれかのエントリ文に RETURNS オプションがある場合は、すべてのエントリに RETURNS オプションが必要になります。
ENTRY は、VARIABLE 属性の有無にかかわらず使用できます。VARIABLE 属性なしで使用した場合、ENTRY 属性は、外部プロシージャの名前である定数を宣言します。この場合、各 p は、外部プロシージャの対応するパラメーターに対して指定された属性と同じ属性、または ANY である属性のリストになります。次に例を示します。
DECLARE E ENTRY(FIXED BINARY(15), POINTER);
この例では、E は、固定長バイナリおよびポインター引数を受け取るプロシージャを指します。
VARIABLE 属性とともに使用した場合、ENTRY 属性は、宣言された名前がデータ型エントリの変数であることを指定します。この変数には、任意のプロシージャ名を代入できます。このエントリ変数を呼び出す場合、エントリ変数で保持されているエントリ値は、p1, p2, などのように指定された対応する属性と同じ属性 (属性が ANY の場合を除く) が設定されたパラメーターを持つ PROCEDURE 文を示している必要があります。前の例の E の宣言を使用すると、互換性のあるプロシージャ宣言は次のようになります。
E: PROCEDURE(X,Y); DECLARE X FIXED BINARY(15); DECLARE Y POINTER;
PROCEDURE 文に構造体であるパラメーターが 1 つ以上ある場合は、次の例に示すように、プロシージャ名の宣言に使用する ENTRY 属性では、すべてのサブ構造体を含む構造体の各メンバーに対する属性のセットが必要になります。
DECLARE E ENTRY(1,2 FIXED, 2 FLOAT, POINTER);
前の例では、E は 2 つのパラメーターを持つプロシージャで、1 つ目のパラメーターは 2 つのメンバーを含む構造体であり、2 つ目のパラメーターはポインターです。ENTRY 属性で指定されたパラメーター属性には、パラメーター構造体のレベル番号および属性に加えて、すべてのメンバーのレベル番号および属性が含まれます。
ENTRY 属性で指定されているすべての文字列の長さまたは配列の範囲は、PROCEDURE 文のパラメーターで指定されているものとまったく同じである必要があります。この規則に違反するプログラムでは、予期しない結果が生じる可能性があります。
ENTRY 属性は、次の形式に従って、ANY、OPTIONS(VARIABLE)、RETURNS(returns_descriptor)、VALUE オプションとともに使用できます。
DECLARE entry_nameENTRY[(parameter_descriptor[VALUE]…)] [OPTIONS(VARIABLE)] [RETURNS(returns_descriptor)];
RETURNS 属性は、関数参照によって呼び出されるエントリ ポイントに必要であり、CALL 文によって呼び出されるプロシージャでは無効になります。ENTRY 属性が RETURNS 記述子内にある場合、パラメーター記述子は使用できません。
パラメーター記述子では、各パラメーターの属性をリストし、パラメーターのデータ型または ANY 属性のいずれかを記述する必要があります。VALUE 属性は、対応する引数が即値で渡されることを示します。OPTIONS(VARIABLE) オプションは、指定された外部プロシージャを可変個数の引数を使用して呼び出せることを示します。ENTRY を宣言する際は、OPTIONS(VARIABLE) 属性の一部として、次のオプションを指定できます。
RETURNS(retums_descriptor) オプションは、関数参照として呼び出されたエントリに対して返される関数値のデータ型属性を指定します。VARIABLE 属性は、パラメーター記述子内または RETURNS 記述子内では無効になります。
VALUE 属性は、ENTRY 宣言で、Fixed Binary、Pointer、Character、Aligned Bit、Entry、Float Binary などのデータ型と組み合わせて使用できます。詳細については、「VALUE」セクションを参照してください。
ANY 属性がパラメーター記述子として含まれている場合、そのパラメーター記述子に対応する引数は、任意のデータ型にすることができます。引数が変数の場合は、そのアドレスが呼び出し先プロシージャに渡されます。引数が定数または式の場合は、ダミー引数が作成され、そのアドレスが呼び出し先プロシージャに渡されます。ダミー引数を作成する際、次の変換が行われます。
詳細については、「ストレージ クラス」の章および『Open PL/I ユーザー ガイド』を参照してください。
OPTIONS(VARIABLE) 属性は、プロシージャの宣言に含まれるパラメーター記述子の数とプロシージャの呼び出しに使用される引数リストに含まれる引数の数との不一致を許容することを示すために使用します。
OPTIONS(VARIABLE) オプションを使用する際は、次の規則が適用されます。
次の例は、ENTRY 属性を VALUE、ANY、OPTIONS(VARIABLE)、RETURNS(retums_descriptor) オプションとともに使用する方法を示しています。これらのオプションの詳細については、この章の各オプションに関するセクションを参照してください。
次の例では、A の値が Fixed Binary(31) に変換され、即値 (25) が P5 に直接渡され、その後に A のアドレスを表す即値が渡されます。
DECLARE P5 ENTRY (FIXED BIN(31) VALUE, POINTER VALUE), A FIXED BIN(15), B POINTER; A = 25; B = ADDR (A); CALL P5(A,B);
次の例は、ENTRY 属性を OPTIONS(VARIABLE) および ANY オプションとともに使用する方法を示しています。
DECLARE P1 ENTRY (FIXED BINARY(15), ANY) OPTIONS(VARIABLE), A FIXED BINARY(15), B FLOAT BINARY(23), C CHARACTER(1); CALL P1(A, B); CALL P1(A, C, B);
前の例では、2 つ目のパラメーター記述子は ANY として宣言されています。P1 の 1 回目の呼び出しでは、Float Binary(23) 変数 B が 2 つ目の引数として渡され、P1 の 2 回目の呼び出しでは、Char(1) 変数 C が渡されます。どちらの呼び出しでも、変数は参照によって渡されます。OPTIONS(VARIABLE) 属性が指定されているため、P1 の 2 回目の呼び出しでは、2 つ目のパラメーター記述子の属性 ANY を使用して、3 つ目の引数 B が渡されます。2 回目の呼び出しでは、変数 B は参照によって渡されます。
次の例は、一部の引数を省略して呼び出されるプロシージャを示しています。
DECLARE P2 ENTRY (FIXED BINARY(15), FIXED BINARY(15), FIXED BINARY(15)) OPTIONS(VARIABLE), (A,B) FIXED BINARY(15); CALL P2(A, ,B);
前の例では、渡される引数は、A、欠落している引数、B の 3 つです。この構成では、A のアドレスが渡され、その後に NULL 値、その後に B のアドレスが渡されることになります。
次の例は、パラメーター記述子よりも多くの引数を使用して呼び出されるプロシージャを示しています。
DECLARE P3 ENTRY (FIXED BINARY(15),FIXED BINARY(15)) OPTIONS(VARIABLE), (A,B) FIXED BINARY(15), C FLOAT BINARY(31); CALL P3 (A, B, ,); CALL P3 (A, B, C);
前の例では、P3 の 1 回目の呼び出しは 2 つのパラメーター記述子を使用して宣言されていますが、4 つの引数を使用して呼び出されているため、最後の 2 つの引数は NULL になります。最後の 2 つの引数のアドレスは NULL 値で表されます。P3 の 2 回目の呼び出しでは、C は Fixed Binary(15) として渡されます。これは、C は後続の引数であり、最後のパラメーター記述子の属性で渡されるためです。この構成では、C を Float Binary から Fixed Binary に変換し、結果の一時変数のアドレスを渡す必要があります。
次の例は、ANY オプションを使用して渡される定数および式を示しています。
DECLARE P4 ENTRY (ANY,ANY), ( A, B ) FIXED BINARY(15); CALL P4( 3, 'ABC'); CALL P4( '1'B, AB );
P4 の 1 回目の呼び出しでは、定数 3 が Fixed Binary(31) に変換され、変換された値を含む一時変数のアドレスが 1 つ目の引数として渡されます。文字列定数 'ABC' は Character(3) に変換され、その一時アドレスが 2 つ目の引数として渡されます。P4 の 2 回目の呼び出しでは、ビット文字列定数 '1'B が Bit(1) Aligned に変換され、AB が Fixed Binary(31) に変換されて、一時変数の各アドレスが P4 に渡されます。
次の例は、RETURNS(retums_descriptor) オプションの使用方法を示しています。
DECLARE F ENTRY(FIXED) RETURNS(POINTER); DECLARE G ENTRY(FLOAT) RETURNS(CHARACTER(32)VARYING);
この例では、F は、ポインター値を返す関数プロシージャの名前として宣言されています。G は、最大長が 32 文字である可変長の文字列値を返す関数プロシージャの名前として宣言されています。