2016-06-20 3 views
2

派生データ構造のコンポーネントにプレゼンス属性が継承されていますか?標準によれば、対応する実引数が存在しない場合、仮引数が存在しません。しかし、私は、これは次の例のように派生データ型のコンポーネントに適用され、どのように確認していない:オプションの派生データ型コンポーネントの存在

program test 
    implicit none 

    type some_type 
    integer :: acomponent 
    end type some_type 

    type(some_type) :: testval 

    testval%acomponent = 42 

    call outer() 

    call outer(testval) 

contains 

    subroutine outer(me) 
    type(some_type), optional :: me 

    call inner(me%acomponent) 
    end subroutine outer 

    subroutine inner(simple) 
    integer, optional :: simple 

    if (present(simple)) then 
     write(*,*) 'simple present:', simple 
    else 
     write(*,*) 'simple not present...' 
    end if 
    end subroutine inner 

end program test 

上記の例では、コンパイルとのgfortran-5で細かい動作しますが、それは標準に準拠しているのですか?どういうわけか、私は標準を見てそれを理解することはできません。

+0

gfortranを使用しているので、非標準のFortranをコンパイラフラグ '-std = f2008ts'で無効にすることができます。これにより、FortranとCとのさらなる相互運用性に関する技術仕様書(TS)29113とFortranにおける追加並列機能に関するTS 18508の追加を含むFortran 2008標準が可能になります。 – jlokimlin

+0

@jlokimlinありがとう。しかし、このコードは、少なくとも私がここにあるgfortran 5.4のインストールでも、そのフラグでコンパイルされます。私は実際には、元のコードで-std = f2008を使用していますが、私は今までこの小さなサンプルコードをフラグでチェックしなかったことを認めなければなりません。 – haraldkl

答えて

3

サンプルコードは準拠していません。

Fortran 2008標準の関連する部分は、12.5.2.12p3(5)にあります - "それを持つ指定子[存在しない省略可能な仮引数]を基本オブジェクトとし、1つ以上の副オブジェクトセレクタで実際の議論として供給される」と述べた。

me%acomponentのコンポーネント参照は、サブオブジェクトセレクタです。同様に、meが配列の場合、任意のフォームの配列添字もサブオブジェクトセレクタになります。

+0

ありがとうございました。どういうわけか私は印象の下にあった、それは許されるべきではないが、標準を調べるときに失われた。 – haraldkl

関連する問題