gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:48:12 29 4
gpt4 key购买 nike

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

我正在尝试做的是以下内容:

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)愉快地编译了两个版本,但我强烈怀疑版本 1 是错误的。在 init_simVars this%svars将分配给动态类型 stateVars , 在 add_to_simvars sVars将有动态类型 stateVars1以及 this%sVars 中的副本(类型 stateVars )将被尝试。我很惊讶编译器编译它,即使它无法确定 sVars 的动态类型在 add_to_simvars .运行时会发生什么,段错误或什么?

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

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

最佳答案

区别在于这些行

allocate( this%svars(n) )

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

哪里 this%svarsclass(svars)可分配数组和 svarsIni 是 class(stateVars)伪论证。

这确实改变了很多。

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

如果您使用第 1 版,它应该会在 add_to_simvars 处失败,因为动态类型不匹配。

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

关于Fortran:(错误)匹配动态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25263091/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com