如何使用Gfortran解决关于两个多态组件之间的内部赋值到类型变量中的问题?

时间:2019-06-21 12:00:36

标签: fortran gfortran

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

1 个答案:

答案 0 :(得分:1)

解决方法非常简单,出现在recent questions/answers之一中。只需复制整个数组

 local%atom = list%atom

但是,当您确实需要访问单个元素时,并非总是可以做到这一点。如果您的实际用例是这样,请显示实际用例。

如果内部可能的类型数量有限,您也可以使用select type类型防护,但通常也不可能。