我正在将某个类的变量复制到同一类的另一个中。编译器很乐意编译它,但我担心在运行时动态类型可能会有所不同。我是否需要测试这两个对象是否具有相同的动态类型以防止在正方形中复制矩形,或者我可以信任编译器吗?如果一个矩形被意外复制到一个正方形中会发生什么?
我想做的是以下几点:
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 是错误的。ininit_simVars
this%svars
将被分配给 dynamic type stateVars
, inadd_to_simvars
sVars
将具有动态类型,并且将尝试stateVars1
复制 in this%sVars
(of type )。stateVars
我很惊讶编译器编译它,即使它无法确定sVars
in的动态类型add_to_simvars
。运行时会发生什么,段错误或什么?
版本 2 我认为是正确的,但是我有点不愿意相信这里的编译器,因此我认为我应该ASSERT
这样做this%sVars
并且sVars
具有相同的动态类型(ASSERT(SAME_TYPE_AS(this%sVars, sVars) )
)?这是一个真正的问题还是我太担心了?
另一个问题是当我这样做时会发生什么allocate( this%svars(n),source=sVarsIni )
。我想将数组分配this%sVars
为大小n
和动态类型sVarsIni
。然而sVarsIni
是一个标量。它会做我想做的事吗?