如何从函数中访问父变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从函数中访问父变量相关的知识,希望对你有一定的参考价值。
我有一个pureComp_t
派生类型与组件Tc
和alpha
。 alpha
是alpha_t
派生类型。我想要在value
派生类型中定义的过程alpha_t
能够访问组件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
现在,我尝试通过编写Tc
获得变量this%Tc
,但函数的this
参数显然是指alpha_t
派生类型而不是purecomp_t
派生类型。
我可以通过最少的代码修改来获得对变量Tc
的访问权限吗?
首先,关于术语的说明:与派生类型有关的“父”通常以类型扩展而不是内容的方式理解。也就是说,在
type a
type(b) x
end type a
人们通常不会使用“父”来描述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
现在,花了很多时间来重述问题,是时候寻找解决方案了。
简单的回答是:如果我们想要访问的值不是类型绑定过程的传递伪参数类型的组件,那么我们必须以某种方式将它放在该过程的范围内。我们怎么做?
就最少修改而言,可能在模块中
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
中”的上下文之外没有意义,那么可以考虑使用类型扩展。
我不会充实这两种方法的细节。或者以下,因为它可能有点可怕。
考虑一下inner
声明
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
这需要相当多的额外“安全”和“设置”代码。
以上是关于如何从函数中访问父变量的主要内容,如果未能解决你的问题,请参考以下文章