Gfortran 8.1和9.1给我一个关于将两个多态组件转换为类型变量之间的固有分配的错误。使用intel编译器我没有任何问题,但在gfortran中没有任何问题。我问是否有人知道任何解决方法。 这是您可以尝试编译的示例。
Program Check
implicit none
!> Type definitions
Type :: Atm_Type
End Type Atm_Type
Type, extends (Atm_type) :: Atm_Std_Type
End Type Atm_Std_Type
Type, extends (Atm_std_type) :: Atm_Ref_Type
End Type Atm_Ref_Type
Type :: AtList_Type
integer :: Natoms
class(Atm_Type), dimension(:), allocatable :: Atom
end Type AtList_Type
!> Variables
type(AtList_Type) :: list
call sub(list)
Contains
Subroutine Sub(List)
!---- Argument ----!
type (AtList_Type), intent(in out) :: List
!---- Local Variables ----!
integer :: i
type (AtList_Type), allocatable :: local
if (List%natoms <= 0 ) return
allocate(local%atom(List%natoms))
do i=1, List%natoms
local%atom(i)=list%atom(i)
end do
End Subroutine Sub
End Program Check
答案 0 :(得分:1)
解决方法非常简单,出现在recent questions/answers之一中。只需复制整个数组
local%atom = list%atom
但是,当您确实需要访问单个元素时,并非总是可以做到这一点。如果您的实际用例是这样,请显示实际用例。
如果内部可能的类型数量有限,您也可以使用select type
类型防护,但通常也不可能。