2

次の例では、無制限のポリモーフィック ポインターを定義し、コンストラクトFortran 2003に続く変数の型に基づいてアクションを実行する機能を使用しています。select typeサブルーチンhandlePは、その型に応じて引数の値を出力します。

program example
    implicit none
    type name
        character(22) :: n
    end type

    character(len=7) :: mystring
    mystring = 'Initial'

    call handleP(mystring)
    call handleP('Initial')
    call handleP(name('Initial'))

    contains

        subroutine handleP(p)
            class(*), intent(in) :: p

            select type(p)
            type is (character(len=*))
                write(*,*) len(p), ': ', p
            class is (name)
                write(*,*) len(p%n), ': ', p%n
            class default
                write(*,*) 'Unknown type'
            end select
        end subroutine

end program example

バージョン 4.8でコンパイルすると、gfortran次の出力が得られます。

       7 : Initial
       0 :
      22 : Initial

したがって、call handleP(mystring)すべてが期待どおりに機能しますがcall handleP('Initial')、印刷は失敗します。type(name)引数を指定して呼び出すこともできます。

動作にバグがありcall handleP('Initial')ますか、gfortranそれとも何か間違っていますか? それがバグである場合、それを防ぐために何ができますか?

4

2 に答える 2

0

これはおそらくあなたが望むものです:

program example
    implicit none
    type name1
        character(22) :: n
    end type

    character(len=7) :: mystring
    mystring = 'Initial'

    call handleP(mystring)
    call handleP('Initial')
    call handleP(name1('Initial'))

    contains

        subroutine handleP(p)
            class(*), intent(in) :: p

            select type(p)
            type is (character(len=*))
                write(*,*) len(p), ': ', p
            class is (name1)
                write(*,*) len(trim(adjustl(p%n))), ': ', p%n
            class default
                write(*,*) 'Unknown type'
            end select
        end subroutine

end program example

「Initial」は変数ではないため、2 番目の呼び出しは機能しません。前の 22 は、型宣言で定義した長さだけでした。ということで長さを調整。

于 2014-06-02T14:15:15.417 に答える