【发布时间】:2014-10-05 10:49:32
【问题描述】:
我正在将某个类的变量复制到同一类的另一个中。编译器很乐意编译它,但我担心在运行时动态类型可能会有所不同。我是否需要测试这两个对象是否具有相同的动态类型以防止在正方形中复制矩形,或者我可以信任编译器吗?如果一个矩形不小心复制到一个正方形中会怎样?
我想要做的是:
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,并且将尝试在this%sVars(stateVars 类型)中进行复制。即使编译器无法确定add_to_simvars 中sVars 的动态类型,我也感到非常惊讶。运行时会发生什么,是段错误还是什么?
VERSION 2 我认为是正确的,但是我有点不愿意相信这里的编译器,因此我想我应该 ASSERT 认为 this%sVars 和 sVars 具有相同的动态类型 (ASSERT(SAME_TYPE_AS(this%sVars, sVars) ))?这是一个真正的问题还是我太担心了?
另一个问题是当我执行allocate( this%svars(n),source=sVarsIni ) 时会发生什么。我想将数组this%sVars 分配为大小n 和动态类型sVarsIni。但是 sVarsIni 是一个标量。它会做我想做的事吗?
【问题讨论】:
标签: fortran fortran2003