nAG Fortran コンパイラ 7.2 マニュアル

 
ナビゲーション:前へ   上へ   次へ

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(*)型指定子を使用して、スカラー、大きさ引継ぎ、および次元数引継ぎの仮引数を宣言できます。 このような引数は型引継ぎと呼ばれ、対応する実際の引数はどの型でもかまいません。 これにはALLOCATABLECODIMENSIONINTENT(OUT)POINTER、またはVALUE属性を含めることはできません。

    型引継ぎ変数は、Fortranで直接使用する方法が非常に制限されています。

    • 実引数として別の型引継ぎ仮引数に渡すことができます。
    • 組込関数IS_CONTIGUOUSLBOUNDPRESENTSHAPESIZE、またはUBOUNDの最初の引数として出現する場合があります。
    • 関数C_LOCISO_C_BINDING組込みモジュール内)の引数として使用できます。
    上記以外のコンテクストでは、他の方法で使用することはできません。 配列の場合、添字を付けたり、部分配列を作成したりすることはできません。

    主にCプログラムとの相互運用に役立ちます(後のセクションを参照)。 非総称手続き参照の場合はスカラー引数を大きさ引継ぎ配列の型引継ぎ引数に渡すことができることに注意してください。

  • [7.2] IMPLICIT NONE文は、現在TYPEおよびEXTERNAL指定子を持つことができます。 その完全な構文は以下の通りです:

    IMPLICIT NONE [ ( [ implicit-none-specifier-list ] ) ]

    ここで、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
    
    は、関数FEXTERNAL属性を持たないため、エラーを発生させます。

    キーワード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,NONEIMPORT,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内のXYへの参照は親(OUTER)要素への参照ですが、 INNER内のZへの参照はローカルな暗黙的に型付けされた変数への参照です。
Privacy Policy  /  Trademarks