2

タイプを別のタイプで使用しようとしています。ただし、コンパイルすることはできません。それは私には奇妙です: select 型はメインプログラムでは機能しますが、型のサブルーチンでは機能しません。

module ModBuffer
    implicit none
    private
    type, abstract, public :: Buffer
    contains
        procedure, public                       :: Constructor
    endtype Buffer

    type, extends(Buffer), public :: BufferR
        real(8), allocatable, public            :: BufData(:,:,:)
    endtype BufferR

    type, extends(Buffer), public :: BufferI
        complex(8), allocatable, public         :: BufData(:,:,:)
    endtype BufferI

    contains

    subroutine Constructor(this, dim1, dim2, dim3)
        class(Buffer), intent(inout)            :: this
        integer, intent(in)                     :: dim1, dim2, dim3

        select type(this)
        type is(BufferR)
            allocate(this%BufData(dim1, dim2, dim3))
        type is(BufferI)
            allocate(this%BufData(dim1, dim2, dim3))
        endselect
    endsubroutine Constructor
endmodule ModBuffer

module ModSystem
    use ModBuffer
    implicit none
    private
    type, public :: System
        class(Buffer), allocatable, public :: WF
    contains
    endtype System

    type, extends(System) :: NewSystem
    contains
        procedure, public :: Constructor
    endtype NewSystem

    contains

    subroutine Constructor(this, Flag)
        class(NewSystem), intent(inout) :: this
        logical, intent(in) :: Flag

        if(Flag) then
            allocate(BufferR::this%WF)
        else
            allocate(BufferI::this%WF)
        endif
        select type(this%WF)
        type is(BufferR)
            print *, "Buffer is real."
        type is(BufferI)
            print *, "Buffer is complex."
        endselect
    endsubroutine Constructor
endmodule ModSystem


program test
    use ModSystem
    !use Operation
    class(System), allocatable :: s

    allocate(NewSystem::s)
    call s%Constructor(.true.)
endprogram test

行でコンパイルエラーが発生しましselect type(this%WF)た。しかし、メイン プログラムで Buffer 型を定義して同じことを行うと、エラーは発生しません。

エラーメッセージは次のとおりです。

error #8253: If selector expression in SELECT TYPE is not a named variable, associate-name=> shall appear.

このコードをコンパイルするにはどうすればよいですか?

4

2 に答える 2

6

ポインタを使用する理由はありません。関連付け部分を使用するだけですselect type(エラーメッセージは書きませんでしたが、IIRCは非常に説明的です):

   select type (twf => this%WF)
于 2014-09-27T08:19:35.730 に答える