実引き数は、関数またはサブルーチンが参照されると、仮引き数に関連付けられます。プロシージャー参照では、実引き数リストが、そのリストにある実引き数とサブプログラムの仮引き数との間の対応を識別します。
引き数キーワードがない場合、実引き数は仮引き数リスト内で対応する位置を占める仮引き数に関連付けられます。最初の実引き数が最初の仮引き数と、2 番目の実引き数が 2 番目の仮引き数といったように、以下同様に関連付けられます。各実引き数は、仮引き数に関連付ける必要があります。
キーワードがある場合、実引き数は引き数キーワードと同じ名前の仮引き数に関連付けられます。プロシージャー参照が入っている有効範囲単位において、仮引き数の名前はアクセス可能な明示的インターフェース内にある必要があります。
サブプログラム内の引き数関連付けは、そのプログラム内で RETURN または END ステートメント実行時に終了します。 サブプログラムが参照されたときの引き数関連付けが、次のサブプログラムの参照時まで持ち越されることはありません。ただし、-qxlf77 コンパイラー・オプションの persistent サブオプションが指定され、サブプログラムに 1 つ以上のエントリー・プロシージャーが指定されている場合には、引き数関連付けは次の参照時まで持ち越されます。
+----------------------------------IBM 拡張----------------------------------+
%VAL が使用される場合を除いて、サブプログラムでは仮引き数のためにストレージが予約されることはありません。サブプログラムの計算用には、対応する実引き数が使用されます。したがって、仮引き数が変わると、実引き数の値も変わります。対応する実引き数が式またはベクトル添え字付きの配列セクションである場合、呼び出し側のプロシージャーは実引き数のためにストレージを予約し、サブプログラムは仮引き数を定義、再定義、または定義解除することはできません。
実引き数が %VAL で指定されるか、または対応する仮引き数に VALUE 属性がある場合、サブプログラムには、実引き数のストレージ域へのアクセス権がありません。
+--------------------------------IBM 拡張の終り-------------------------------+
実引き数は、対応する仮引き数で指定したタイプおよび型付きパラメーター (仮引き数がポインターまたは想定形状のいずれかの場合は、形状) と一致することが必要です。ただし、サブルーチン名にタイプがなく、サブルーチンである仮プロシージャー名と関連付ける必要がある場合、および選択戻り指定子にタイプがなく、アスタリスクと関連付ける必要がある場合を除きます。
引き数関連付けは、複数レベルにわたるプロシージャー参照まで、持ち越される場合があります。
サブプログラムの参照によって、参照されたサブプログラム内の仮引き数が、参照されたサブプログラム内の別の仮引き数に関連付けられる場合、そのサブプログラムの実行時にどちらの仮引き数も定義、再定義、または未定義状態にすることはできません。たとえば、次のようなサブルーチンの定義があるとします。
SUBROUTINE XYZ (A,B)
このサブルーチンを、次の方法で参照すると、
CALL XYZ (C,C)
仮引き数 A および B がそれぞれ同じ引き数 C に関連付けられます。その結果、A と B が互いに関連することになります。この場合、A も B も、サブルーチン XYZ の実行時または XYZ によって参照されるいずれのプロシージャーによっても定義、再定義、または未定義状態にすることはできません。
共通ブロック内のエンティティーまたは使用関連付けやホスト関連付けを介してアクセス可能なエンティティーによって、仮引き数が関連する場合、エンティティーが仮引き数に関連している間に、エンティティーの値は仮引き数名の使用によってのみ変更することができます。データ・オブジェクトのいずれかの部分が仮引き数によって定義される場合、そのデータ・オブジェクトは、定義が発生する前か後かにかかわらず、その仮引き数によってのみ参照することができます。この制限は、ポインター・ターゲットについても適用されます。
+----------------------------------IBM 拡張----------------------------------+
この制限に従わないプログラムがある場合、コンパイラー・オプション -qalias=nostd を使用するのが適切です。詳細については、「ユーザーズ・ガイド」の『-qalias オプション』を参照してください。
+--------------------------------IBM 拡張の終り-------------------------------+
+----------------------------------IBM 拡張----------------------------------+
Fortran 以外の言語で書かれたサブプログラム (たとえば、ユーザー作成の C プログラム、 AIX オペレーティング・システム・ルーチン) を呼び出すには、 XL Fortran で使用されているデフォルトの方法とは異なる方法で実引き数を渡さなければならない場合があります。デフォルトの方法では、実引き数のアドレスを渡し、実引き数が文字タイプの場合は長さを渡します。 (-qnullterm コンパイラー・オプションを使用して、スカラー文字初期化式が終端ヌル・ストリングとともに渡されるようにしてください。詳細については、「ユーザーズ・ガイド」の -qnullterm を参照してください。)
CALL ステートメントまたは関数参照ステートメントの引き数リスト内で、%VAL および %REF 組み込み関数を使用することによって、またはインターフェース本体内で仮引き数を使うことによって、デフォルトの引き渡し方法を変更することができます。これらの組み込み関数は、外部サブプログラムに実引き数を渡す方法を指定します。
%VAL および %REF 組み込み関数は、Fortran プロシージャー参照の引き数リスト内で使用することはできません。また、選択戻り指定子とともに使用することもできません。
引き数リストの組み込み関数には、次のものがあります。
%VAL は、配列、プロシージャー名、または 1 バイトより長い文字式である実引き数と一緒に使用することはできません。
%VAL が実行されると、実引き数が、32 ビットまたは 64 ビットの中間値として渡されます。実引き数が実数タイプまたは複素数タイプである場合、その実引き数は 1 つまたは複数の 64 ビット中間値として渡されます。実引き数が整数タイプ、論理タイプ、または順序派生型である場合、その実引き数は 1 つ以上の 32 ビット中間値として渡されます。 32 ビットより短い整数実引き数は、32 ビット値になるまで符号が拡張され、 32 ビットより短い論理実引き数は、32 ビット値になるまでゼロで埋められます。
名前付きバイト定数および変数は、INTEGER(1) であるかのように渡されます。実引き数が CHARACTER(1) であるとき、 -qctyplss コンパイラー・オプションが指定されたか否かにかかわらず、その左側が 32 ビット値になるまでゼロで埋められます。
EXTERNAL FUNC CALL RIGHT2(%REF(FUNC)) ! procedure name passed by reference REAL XVAR CALL RIGHT3(%VAL(XVAR)) ! real argument passed by value IVARB=6 CALL TPROG(%VAL(IVARB)) ! integer argument passed by value
%VAL の標準準拠代替については、VALUEを参照してください。
詳細については、「ユーザーズ・ガイド」の『言語間呼び出し』を参照してください。
+--------------------------------IBM 拡張の終り-------------------------------+
INTENT 属性により、仮引き数の意図的な使用を明示的に指定することができます。明示的インターフェースがある場合、この属性を使用してプログラムの呼び出しプロシージャーの最適化を改善させることもできます。また、引き数の意図が明らかになることにより、エラーを検査する機会が多くなります。構文の詳細については、INTENTを参照してください。
+----------------------------------IBM 拡張----------------------------------+
次の表は、内部プロシージャーについて XL Fortran の引き数を渡す方法を概略します (想定形状仮引き数およびポインター仮引き数は含まれません)。
引き数タイプ | Intent(IN) | Intent(OUT) | Intent(INOUT) | No Intent |
---|---|---|---|---|
非 CHARACTER Scalar | VALUE | デフォルト | デフォルト | デフォルト |
CHARACTER*1 Scalar | VALUE | REFERENCE | REFERENCE | REFERENCE |
CHARACTER*n Scalar | REFERENCE | REFERENCE | REFERENCE | REFERENCE |
CHARACTER*(*) Scalar | デフォルト | デフォルト | デフォルト | デフォルト |
派生型 1 Scalar | VALUE | デフォルト | デフォルト | デフォルト |
派生型 2 Scalar | デフォルト | デフォルト | デフォルト | デフォルト |
非 CHARACTER Array | デフォルト | デフォルト | デフォルト | デフォルト |
CHARACTER*1 Array | REFERENCE | REFERENCE | REFERENCE | REFERENCE |
CHARACTER*n Array | REFERENCE | REFERENCE | REFERENCE | REFERENCE |
CHARACTER*(*) Array | デフォルト | デフォルト | デフォルト | デフォルト |
派生型 3 Array | デフォルト | デフォルト | デフォルト | デフォルト |
+--------------------------------IBM 拡張の終り-------------------------------+
OPTIONAL 属性を指定すると、プロシージャーへの参照で、仮引き数を実引き数に関連付ける必要はなくなります。 OPTIONAL 属性の利点には、次のようなものがあります。
構文および規則に関する詳細については、OPTIONALを参照してください。
ある仮引き数が実引き数と関連しており、かつ、この実引き数が呼び出しサブプログラム内にオプションでない仮引き数として指定されている場合、または呼び出しサブプログラム内に仮引き数として指定されていない場合、その仮引き数はサブプログラムのインスタンス内に指定されています。仮引き数のうちオプションでないものは、必ず指定しなければなりません。
オプションの仮引き数のうち指定されていないものは、以下の規則に従う必要があります。
文字仮引き数の長さが非定数の宣言式と同じである場合、オブジェクトは実行時の長さを持つ仮引き数です。仮引き数ではないオブジェクトが実行時の長さを持つ場合、自動オブジェクトです。詳細については、自動オブジェクトを参照してください。
仮引き数の長さ指定子が括弧で囲まれたアスタリスクの場合、仮引き数の長さは実引き数から「継承され」ます。仮引き数を含んでいるプログラム単位外で長さが指定されているため、その長さを継承することになるわけです。関連した実引き数が配列名である場合、仮引き数が継承する長さは、関連した実引き数配列における配列エレメントの長さです。継承された長さで %REF を文字仮引き数に指定することはできません。
変数である仮引き数は、同じタイプおよび kind 型付きパラメーターを持つ変数である実引き数に関連付ける必要があります。
実引き数がスカラーである場合、対応する仮引き数もスカラーでなければなりません。ただし、実引き数が想定形状配列またはポインター配列 (あるいはこのようなエレメントのサブストリング) でない配列のエレメントの場合を除きます。実引き数が割り振り可能な場合は、対応する仮引き数も割り振り可能でなければなりません。プロシージャーが総称名によって参照されるか、定義済み演算子または定義済み割り当てとして参照される場合、実引き数および対応する仮引き数のランクは一致する必要があります。スカラー仮引き数は、スカラー実引き数にのみ関連付けることができます。
+---------------------------------Fortran 95---------------------------------+
エレメント型サブプログラム内で使用される仮引き数には以下が適用されます。
+------------------------------Fortran 95 の終り------------------------------+
スカラー仮引き数が文字タイプである場合、その長さは実引き数の長さ以下になります。仮引き数は、実引き数の左端の文字に関連付けられます。文字タイプの仮引き数が配列である場合、長さの制限は各配列エレメントにではなく配列全体に適用されます。つまり、仮引き数配列全体の長さを実引き数配列全体より長くすることはできませんが、関連した配列エレメントの長さを変更することはできます。
仮引き数が想定形状配列である場合、実引き数は想定サイズ配列またはスカラー (配列エレメントまたは配列エレメント・サブストリング用の指定子を含む) にしてはなりません。
仮引き数が明示的形状配列または想定サイズ配列で、実引き数が文字以外の配列である場合、仮引き数のサイズは実引き数配列のサイズを超えてはなりません。各実配列エレメントは、対応する仮配列エレメントに関連させられます。実引き数が as という添え字値を持つ文字以外の配列エレメントである場合、仮引き数配列のサイズは、実引き数配列のサイズ + 1 - as を超えてはなりません。 ds という添え字値を持つ仮引き数配列エレメントは、as + ds - 1 という添え字値を持つ実引き数配列エレメントに関連付けられます。
実引き数が文字配列、文字配列エレメント、または文字サブストリングのいずれかで、配列の文字記憶単位 acu で始まる場合、関連した仮引き数配列の文字記憶単位 dcu は、実配列引き数の文字記憶単位 acu+dcu-1 に関連付けられます。
関連した実引き数が変数の場合、変数名である仮引き数をサブプログラム内で定義することができます。関連した実引き数が定義可能ではない場合、変数名である仮引き数をサブプログラム内で再定義してはなりません。
実引き数がベクトル添え字を持つ配列セクションの場合、関連付けられる仮引き数を定義することができません。
ポインター以外の仮引き数がポインター実引き数に関連付けられる場合、その実引き数は、仮引き数が引き数と関連するターゲットに現在関連付けられている必要があります。実引き数を渡す方法に関する制限はすべて、実引き数のターゲットに適用されます。
仮引き数がターゲットでもポインターでもない場合は、実引き数に関連したポインターは、プロシージャー呼び出し時に対応する仮引き数に関連付けられません。
仮引き数と実引き数の両方がターゲットであり、その仮引き数がスカラーまたは想定形状配列の場合 (しかも、実引き数がベクトル添え字を持つ配列セクションでない場合) は、次のようになります。
仮引き数と実引き数の両方がターゲットであり、その仮引き数が明示的形状配列または想定サイズ配列のいずれかで、一方の実引き数がベクトル添え字を持つ配列セクションでない場合は、次のようになります。
仮引き数がターゲットであり、それに対応する実引き数がターゲットではないか、またはベクトル添え字を持つ配列セクションである場合、仮引き数に関連付けられたポインターは、プロシージャーの実行完了時に未定義になります。
割り振り可能な仮引き数は、それに関連付けられた、割り振り可能な実引き数を持ちます。割り振り可能な仮引き数が配列の場合、関連付けられた実引き数も配列でなければなりません。
プロシージャーに入るときには、割り振り可能な仮引き数の割り振り状況は、関連付けられた実引き数の割り振り状況になります。仮引き数が INTENT(OUT) で、関連付けられた実引き数が現在割り振られている場合は、仮引き数の割り振り状況が、現在割り振られていないという割り振り状況になるように、プロシージャー呼び出しでその実引き数が割り振り解除されます。仮引き数が INTENT(OUT) ではなく、実引き数が現在割り振られている場合は、仮引き数の値は関連付けられた実引き数の値になります。
プロシージャーがアクティブの間に、INTENT(IN) を持たない割り振り可能な仮引き数の割り振り、割り振り解除、定義、または定義解除を行うことができます。これらのイベントのいずれかが発生した場合、別名を介して関連した実引き数を参照することは許されません。
ルーチンの終了時には、実引き数は割り振り可能な仮引き数の割り振り状況を持ちます (割り振り可能な仮引き数が INTENT(IN) を持つ場合も、当然、変更はありません)。仮引き数から実引き数への値の伝搬のために、通常の規則が適用されます。
割り振り可能な仮引き数の自動割り振り解除は、仮引き数のプロシージャー内の RETURN または END ステートメントの実行結果として発生しません。
SUBROUTINE LOAD(ARRAY, FILE) REAL, ALLOCATABLE, INTENT(OUT) :: ARRAY(:, :, :) CHARACTER(LEN=*), INTENT(IN) :: FILE INTEGER UNIT, N1, N2, N3 INTEGER, EXTERNAL :: GET_LUN UNIT = GET_LUN() ! Returns an unused unit number OPEN(UNIT, FILE=FILE, FORM='UNFORMATTED') READ(UNIT) N1, N2, N3 ALLOCATE(ARRAY(N1, N2, N3)) READ(UNIT) ARRAY CLOSE(UNIT) END SUBROUTINE LOAD
仮引き数がポインターの場合、実引き数もポインターになります。また、そのタイプ、型付きパラメーター、およびランクも一致する必要があります。実引き数参照は、ポインター自体に対するもので、ターゲットに対するものではありません。プロシージャーが呼び出されると、次のようになります。
関連付け状況は、プロシージャーの実行中に変更が可能です。プロシージャーの実行が完了すると、仮引き数の関連付け状況は、関連付けられている場合、未定義になります。
+----------------------------------IBM 拡張----------------------------------+
引き渡しは参照によって行います。つまり、%VAL または VALUE をポインター実引き数に指定することはできません。
+--------------------------------IBM 拡張の終り-------------------------------+
プロシージャーとして識別される仮引き数を仮プロシージャーと呼びます。仮プロシージャーは、特定の組み込みプロシージャー、モジュール・プロシージャー、外部プロシージャー、または別の仮プロシージャーである実引き数にのみ関連付けられます。組み込みプロシージャーを実引き数として渡す方法の詳細については、第 12 章, 組み込みプロシージャーを参照してください。
仮プロシージャーおよび対応する実引き数は、両方が関数になるか、または両方がサブルーチンになります。実プロシージャー引き数の仮引き数は、仮プロシージャー引き数の仮引き数と一致していなければなりません。仮引き数が関数である場合、タイプ、型付きパラメーター、ランク、形状 (ポインター以外の配列の場合)、およびポインターであるかどうかが一致しなければなりません。関数の結果の長さが想定される場合、これは結果の特性となります。関数の結果が、定数式でない型付きパラメーターまたは配列の境界を指定する場合、式のエンティティーの依存性は結果の特性です。
サブルーチンである仮プロシージャーは、組み込みデータ型、派生型、および選択戻り指定子とは異なるタイプのように扱われます。このような仮引き数は、サブルーチンまたは仮プロシージャーである実引き数とだけ一致します。
内部サブプログラムを、仮プロシージャー引き数に関連付けることはできません。プロシージャーの参照の規則および制約事項は、プロシージャー参照で説明しています。
Fortran 95 では、非組み込みエレメント型プロシージャーを実引き数として使用することはできません。
PROGRAM MYPROG INTERFACE SUBROUTINE SUB (ARG1) EXTERNAL ARG1 INTEGER ARG1 END SUBROUTINE SUB END INTERFACE EXTERNAL IFUNC, RFUNC REAL RFUNC CALL SUB (IFUNC) ! Valid reference CALL SUB (RFUNC) ! Invalid reference ! ! The first reference to SUB is valid because IFUNC becomes an ! implicitly declared integer, which then matches the explicit ! interface. The second reference is invalid because RFUNC is ! explicitly declared real, which does not match the explicit ! interface. END PROGRAM
SUBROUTINE ROOTS EXTERNAL NEG X = QUAD(A,B,C,NEG) RETURN END FUNCTION QUAD(A,B,C,FUNCT) INTEGER FUNCT VAL = FUNCT(A,B,C) RETURN END FUNCTION NEG(A,B,C) RETURN END
アスタリスクの形で指定されている仮引き数は、サブルーチン・サブプログラム内の SUBROUTINE ステートメントまたは ENTRY ステートメントの仮引き数リストにしか指定できません。対応する実引き数は、選択戻り指定子でなければなりません。この指定子は、CALL ステートメントと同じ有効範囲にある分岐ターゲット・ステートメントのステートメント・ラベルを示します。
CALL SUB(*10) STOP ! STOP is never executed 10 PRINT *, 'RETURN 1' CONTAINS SUBROUTINE SUB(*) ... RETURN 1 ! Control returns to statement with label 10 END SUBROUTINE END
プロシージャー参照内のサブプログラム名は、総称名として確立されるか、特定名としてのみ確立されるか、あるいは確立されないかのいずれかです。
以下の条件のうちの 1 つまたは複数が当てはまる場合、サブプログラム名は有効範囲単位内で総称名として確立されます。
サブプログラム名が総称名として確立されておらず、かつ次のいずれかの条件の 1 つがあてはまる場合、サブプログラム名は有効範囲単位内で特定名としてのみ確立されます。
総称名または特定名のいずれでもない場合、サブプログラム名は確立されません。
次の規則を使用して、総称名として確立された名前に対するプロシージャー参照を解決します。
次の規則を使用して、特定名として確立された名前に対するプロシージャー参照を解決します。
次の規則を使用して、確立されない名前に対するプロシージャー参照を解決します。
総称名へのプロシージャー参照を解決する場合、以下の規則に従います。