Я пытаюсь использовать тип в другом типе. Однако я просто не могу его скомпилировать. Мне это странно: в основной программе работает выбор типа, а в подпрограмме тип не работает.
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.
Как я могу компилировать этот код?
real(8)
, хотя это не очень разумная практика. - person Vladimir F   schedule 27.09.2014kind=8
может означать что-то другое на разных платформах. Портативные решения используютselect_real_kind
,iso_fortran_env
илиiso_c_binding
. - person Vladimir F   schedule 27.09.2014