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

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

我想要做的是以下内容:

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中,此%svars将分配给动态类型stateVars,在add_to_simvars中,sVars将具有动态类型stateVars1,并且将尝试在此%sVars(类型为stateVars)中创建副本.我很惊讶编译器编译它,即使它无法确定add_to_simvars中sVars的动态类型.运行时会发生什么,seg故障还是什么?

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

另一个问题是当我分配时会发生什么(这个%svars(n),source = sVarsIni).我想将这个%sVars的数组分配为n和动态类型sVarsIni.然而,sVarsIni是一个标量.它会做我想要的吗?

最佳答案 不同之处在于这些方面

allocate( this%svars(n) )

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

这个%svars是class(s​​vars)可分配数组,而svarsIni是一个类(stateVars)伪参数.

这确实发生了很大的变化.

在第一种情况下,它将它分配给声明的类型,即svars,在另一种情况下,它分配给伪参数的动态类型,至少是stateVars.

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

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

点赞