我正在另一个同一个类中复制某个类的变量。编译器很乐意编译它,但我担心在运行时动态类型可能会有所不同。我是否需要测试这两个对象是否具有相同的动态类型以防止在方形中复制矩形或者我是否相信编译器?如果在方形中意外复制矩形会发生什么?
我要做的是以下内容:
type :: simVars
class(stateVars), dimension(:), allocatable :: svars
integer :: count_
contains
procedure :: init => init_simVars
procedure :: destroy => dest_simVars
procedure :: add => add_to_simVars ! adds an observation to the time series
end type simVars
subroutine init_simVars(this,n)
!--> VERSION 1
class(simVars), intent(inout) :: this
integer, intent(in) :: n
allocate( this%svars(n) )
this%count_ = 0
end subroutine init_simVars
subroutine init_simVars(this,n,sVarsIni)
!--> VERSION 2
class(simVars), intent(inout) :: this
integer, intent(in) :: n
class(stateVars), intent(in) :: sVarsIni
allocate( this%svars(n),source=sVarsIni )
this%count_ = 0
end subroutine init_simVars
subroutine add_to_simvars(this,svars)
class(simVars), intent(inout) :: this
class(stateVars), intent(in) :: svars
this%count_ = this%count_+1
this%svars(this%count_) = svars
end subroutine add_to_simvars
subroutine doSimulation(simHist,sVarsIni)
class(simVars), intent(out) :: simHist
class(stateVars), intent(in) :: sVarsIni
!--> dynamic type 'stateVars1'
class(stateVars), allocatable :: sVars ! will be source allocated from 'iniState'
! initialize the state of the economy
allocate( sVars, source=sVarsIni ) ! "copies" 'sVarsIni' in 'sVars'
! initialize 'simHist'
!--> VERSION 1:
call simHist%init(nYears)
!--> VERSION 2:
call simHist%init(nYears,iniState)
! save today's variables
call simHist%add(sVars)
...
end subroutine doSimulation
编译器(ifort 14)愉快地编译两个版本,但我强烈怀疑VERSION 1是错误的。 init_simVars
this%svars
将分配给动态类型stateVars
,add_to_simvars
sVars
将包含动态类型stateVars1
和{{1}中的副本将尝试(类型为this%sVars
)。我很惊讶编译器编译它,即使它无法确定stateVars
中sVars
的动态类型。运行时会发生什么,seg故障还是什么?
版本2我认为是正确的但是我有点不愿意相信这里的编译器因此我认为我应该add_to_simvars
ASSERT
和this%sVars
具有相同的动态类型({{ 1}})?这是一个真正的问题还是我太担心了?
另一个问题是当我sVars
时会发生什么。我想将数组ASSERT(SAME_TYPE_AS(this%sVars, sVars) )
分配为大小为allocate( this%svars(n),source=sVarsIni )
,动态类型为this%sVars
。但是n
是一个标量。它会做我想要的吗?
答案 0 :(得分:2)
不同之处在于这些
allocate( this%svars(n) )
VS
allocate( this%svars(n),source=sVarsIni )
其中this%svars
是class(svars)
可分配数组,而svarsIni是class(stateVars)
伪参数。
确实发生了很大变化。
在第一种情况下,它将它分配给声明的类型,即svars
,在另一种情况下,它分配给伪参数的动态类型,至少为stateVars
。< / p>
如果你做版本1,它应该在add_to_simvars
失败,因为动态类型不匹配。
我不知道你是否在那里超载了作业。如果你不这样做,它甚至不应该编译,因为多态对象的内在分配。