Как я могу решить проблему внутреннего присваивания между двумя полиморфными компонентами в переменные типа, используя Gfortran? - PullRequest
1 голос
/ 21 июня 2019

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 Ответ

1 голос
/ 21 июня 2019

Здесь обходной путь очень прост и появился в одном из недавних вопросов / ответов .Просто скопируйте весь массив

 local%atom = list%atom

Однако это не всегда возможно сделать, когда вам действительно нужен доступ к отдельным элементам.Если ваш реальный вариант использования такой, покажите реальный вариант использования.

Если число возможных типов внутри ограничено, вы также можете использовать защиту типа select type, но часто это также невозможно.

...