Fortran :(错误)匹配动态类型

时间:2014-08-12 11:27:13

标签: fortran fortran2003

我正在另一个同一个类中复制某个类的变量。编译器很乐意编译它,但我担心在运行时动态类型可能会有所不同。我是否需要测试这两个对象是否具有相同的动态类型以防止在方形中复制矩形或者我是否相信编译器?如果在方形中意外复制矩形会发生什么?

我要做的是以下内容:

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将分配给动态类型stateVarsadd_to_simvars sVars将包含动态类型stateVars1和{{1}中的副本将尝试(类型为this%sVars)。我很惊讶编译器编译它,即使它无法确定stateVarssVars的动态类型。运行时会发生什么,seg故障还是什么?

版本2我认为是正确的但是我有点不愿意相信这里的编译器因此我认为我应该add_to_simvars ASSERTthis%sVars具有相同的动态类型({{ 1}})?这是一个真正的问题还是我太担心了?

另一个问题是当我sVars时会发生什么。我想将数组ASSERT(SAME_TYPE_AS(this%sVars, sVars) )分配为大小为allocate( this%svars(n),source=sVarsIni ),动态类型为this%sVars。但是n是一个标量。它会做我想要的吗?

1 个答案:

答案 0 :(得分:2)

不同之处在于这些

allocate( this%svars(n) )

VS

allocate( this%svars(n),source=sVarsIni )

其中this%svarsclass(svars)可分配数组,而svarsIni是class(stateVars)伪参数。

确实发生了很大变化。

在第一种情况下,它将它分配给声明的类型,即svars,在另一种情况下,它分配给伪参数的动态类型,至少为stateVars。< / p>

如果你做版本1,它应该在add_to_simvars失败,因为动态类型不匹配。

我不知道你是否在那里超载了作业。如果你不这样做,它甚至不应该编译,因为多态对象的内在分配。