我有一个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
派生类型,而不是{{} 1}}派生类型。
我可以通过对代码进行最少的修改来对变量purecomp_t
进行哪些修改?
答案 0 :(得分:1)
首先是关于术语的说明:"父母"通常以类型扩展而不是内容的方式理解与派生类型有关的内容。也就是说,
type a
type(b) x
end type a
一个人通常不会使用"父母"描述({1}}的实例与其组件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
这将需要相当多的额外"安全"和"设置"代码抽薹。