11.2 データ宣言
- [5.3] 実体が(型宣言文もしくは成分定義文で)初期化される場合、その配列境界と文字長を初期化式で使用できます。
-
[7.0]
EQUIVALENCE
文とCOMMON
文、およびBLOCK DATA
プログラム単位は、廃止されたと見なされます(-f2018オプションが使用されている場合はそのように報告されます)。 -
[7.1]
次元数引継ぎ仮引数は任意の次元数の実引数を受け入れます。つまり実引数の次元数を引継ぎます。
ここでの次元数はゼロである可能性があります。つまり、実引数がスカラーである可能性があります。
さらに、次元数引継ぎ仮引数は
ALLOCATABLE
またはPOINTER
属性を持つことができるため、任意の次元数の割付可能変数/ポインター変数を受け入れることができます。書式は以下の通りです:
Real,Dimension(..) :: a, b Integer :: c(..)
上記は3つの変数(仮引数でなければならない)が次元数引継ぎであることを宣言します。Fortran内での次元数引継ぎ仮引数の使用は非常に制限されています。 基本的には、組込照会関数と
SELECT RANK
構文がありますが、その他の場合、別の次元数引き継ぎ引数に対応する他の手続きへの実引数でのみ利用できます。次元数引継ぎの主な用途は、高度なC相互運用性です(後のセクションを参照)。
以下は、Fortran内での非常に簡単な使用例です。
Program assumed_rank_example Real x(1,2),y(3,4,5,6,7) Call showrank(1.5) Call showrank(x) Call showrank(y) Contains Subroutine showrank(a) Real,Intent(In) :: a(..) Print *,'Rank is',Rank(a) End Subroutine End Program
上記は以下を出力します。Rank is 0 Rank is 2 Rank is 5
-
[7.1]
TYPE(*)
型指定子を使用して、スカラー、大きさ引継ぎ、および次元数引継ぎの仮引数を宣言できます。 このような引数は型引継ぎと呼ばれ、対応する実際の引数はどの型でもかまいません。 これにはALLOCATABLE
、CODIMENSION
、INTENT(OUT)
、POINTER
、またはVALUE
属性を含めることはできません。型引継ぎ変数は、Fortranで直接使用する方法が非常に制限されています。
- 実引数として別の型引継ぎ仮引数に渡すことができます。
-
組込関数
IS_CONTIGUOUS
、LBOUND
、PRESENT
、SHAPE
、SIZE
、またはUBOUND
の最初の引数として出現する場合があります。 -
関数
C_LOC
(ISO_C_BINDING
組込みモジュール内)の引数として使用できます。
主にCプログラムとの相互運用に役立ちます(後のセクションを参照)。 非総称手続き参照の場合はスカラー引数を大きさ引継ぎ配列の型引継ぎ引数に渡すことができることに注意してください。
-
[7.2]
IMPLICIT NONE
文は、現在TYPE
およびEXTERNAL
指定子を持つことができます。 その完全な構文は以下の通りです:IMPLICIT NONE
[(
[ implicit-none-specifier-list ])
]EXTERNAL
およびTYPE
のコンマ区切りリストです。 リスト内にキーワードが複数回現れることはありません。 リストが現れない場合、またはリストにTYPE
が現れる場合、その有効域内に他のIMPLICIT
文が現れることはありません。以下の意味論:
IMPLICIT NONE ()
IMPLICIT NONE (TYPE)
IMPLICIT NONE
キーワード
EXTERNAL
が現れた場合、その有効域内で参照される暗黙のインタフェースを持つ手続きは、明示的にEXTERNAL
属性を与えられなければなりません: つまり、それはEXTERNAL
文、EXTERNAL
属性を持つ型宣言文、または手続き宣言文で宣言されなければなりません。 例えば、Subroutine sub(x) Implicit None (External) Integer f Print *,f(x) End Subroutine
は、関数F
がEXTERNAL
属性を持たないため、エラーを発生させます。キーワード
EXTERNAL
が現れ、キーワードTYPE
が現れない場合、暗黙の型付けは無効にされません、 その有効域内に他のIMPLICIT
文が現れることができます。 キーワードTYPE
およびEXTERNAL
の両方が現れる場合、暗黙の型付けは無効にされ、暗黙のインタフェース手続きにはEXTERNAL
属性が必要です。 -
[7.2]
IMPORT
文はBLOCK
構築およびネストしたサブプログラムに現れることができます。 デフォルトでは、そのような有効域はホスト有効域のすべての実体にホスト結合によってアクセスできるため、これ自体は(コンパイラによってチェックされる)文書としてのみ役立ちます。 例えば、Subroutine outer(x,y) Real,Intent(InOut) :: x, y(:) … Contains Subroutine inner Import :: x, y …
-
[7.2]
親子結合の制御は、
IMPORT,NONE
、IMPORT,ALL
、及びIMPORT,ONLY
文によって提供されます。 他のIMPORT
文と同様に、これらはインタフェース本体、BLOCK
構造体、及び 含まれるサブプログラム内にのみ現れ、USE
文と他の仕様文の間に現れます。IMPORT,NONE
文は、親有効域内の要素が親子結合によってアクセス可能ではないことを指定します。 これは、別々のモジュール手続きインタフェース以外のインタフェース本体のデフォルトです。IMPORT,NONE
文が有効域に現れる場合、他のIMPORT
文は現れません。 例えば、Subroutine outer(x,y) Real,Intent(InOut) :: x, y(:) … Contains Subroutine inner Import,None Implicit Integer (a-z) Read *,x Print *,x End Subroutine End Subroutine
サブルーチンINNER
内のX
は、その親OUTER
内のX
への参照ではなく、INNER
にローカルな暗黙的に型付けされた(Integer
)変数です。IMPORT,ALL
文は、すべての親要素がアクセスされることを指定します。 つまり、親要素をアクセス不可能にする宣言(いわゆる"シャドーイング")は無効です。 例えば、Subroutine outer(x,y) Real,Intent(InOut) :: x, y(:) … Contains Subroutine inner Import,All Integer,External :: y …
INNER
内のY
の宣言は無効で、コンパイルエラーを発生させます。IMPORT,ALL
文が有効域に現れる場合、他のIMPORT
文は現れません。IMPORT,ONLY
文は、IMPORT,ONLY
文で名前が指定された親要素のみが 親子結合によってアクセス可能であることを指定します。IMPORT,ONLY
文が有効域に現れる場合、すべての他のIMPORT
文はONLY
キーワードを持たなければなりません。 例えば、Subroutine outer(x,y,z) Real,Intent(InOut) :: x, y(:),z … Contains Subroutine inner Import,Only:x,y z = x + y
INNER
内のX
とY
への参照は親(OUTER
)要素への参照ですが、INNER
内のZ
への参照はローカルな暗黙的に型付けされた変数への参照です。