gpt4 book ai didi

fortran - 如何从函数访问父变量

转载 作者:行者123 更新时间:2023-12-04 17:53:23 25 4
gpt4 key购买 nike

我有一个 pureComp_t 派生类型,其中包含组件 Tcalphaalphaalpha_t 派生类型。我希望在 alpha_t 派生类型中定义的过程 value 能够访问组件 Tc 以进行一些额外的计算。

module alpha_m

type :: alpha_t
contains
procedure :: value
end type

type pureComp_t
real(8) :: Tc
type(alpha_t) :: alpha
end type

contains

function value(this,T)
implicit none

class(alpha_t) :: this
real(8) :: T
real(8) :: value

value = T / this%Tc

end function

end module

program regression_alpha

use alpha_m
implicit none

type(pureComp_t) :: pureComp

pureComp%Tc = 620.d0
write(*,*)pureComp%alpha%value(610.d0)

end program

现在,我尝试通过编写 this%Tc 来获取变量 Tc 但函数的 this 参数显然指的是 alpha_t 派生类型,而不是 purecomp_t 派生类型。

我可以做哪些修改来访问变量 Tc,同时对代码进行最少的修改?

最佳答案

首先注意术语:与派生类型相关的“父”通常以类型扩展的方式而不是内容的方式来理解。也就是说,在

type a
type(b) x
end type a

通常不会使用“parent”来描述a(的实例)及其组件x 之间的关系。

话虽如此,让我们继续讨论真正的问题。考虑模块

module m
type inner
contains
procedure :: inner=>inner_value
end type inner

type outer
type(inner) x
real :: y=1.
end type outer

contains

real function inner_value(this)
type(inner), intent(in) :: this
inner_value = ...
end function

end module m

考虑一下我们想要的程序

use m
type(outer) a
print *, a%x%value()
end

以及 inner_value 可以访问 a 的组件的事情。只是为了确认那没有意义,程序呢

use m
type(inner) b
print *, b%value() ! There's nothing containing b...
end

现在,已经花了很多行来重申问题,是时候寻找解决方案了。

简短的回答是:如果我们想要访问的值不是类型绑定(bind)过程传递的伪参数类型的组成部分,那么我们必须以某种方式将它放在该过程的范围内。我们怎样才能做到这一点?

就最少修改而言,可能在模块中

real function inner_value(this, outer_x)
type(inner), intent(in) :: this
real, intent(in) :: outer_y
inner_value = ...
end function

所以在程序中

print *, a%x%value(a%y)

现在,这可能会变得乏味且容易出错。怎么样

print *, a%value_of_inner()

对于 value_of_inner() 适本地做感兴趣的事情。

或者,如果组件 alpha_t 从不考虑“包含在 pureComp_t 中”的上下文之外,则可以考虑使用类型扩展。

我不会详述最后两种方法的细节。或以下内容,因为它可能有点可怕。

考虑内部声明

type inner
type(outer), pointer :: container=>null()
end type inner

然后 container 需要简单地(并且正确地...)与 outer 类型的相关实例相关联并引用

real function inner_value(this)
type(inner), intent(in) :: this
inner_value = this%container%y
end function

这将需要大量额外的“安全”和“设置”代码。

关于fortran - 如何从函数访问父变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42512630/

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