如何从函数中访问父变量

时间:2017-02-28 15:24:33

标签: fortran

我有一个pureComp_t派生类型,其中包含Tcalpha成分。 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进行哪些修改?

1 个答案:

答案 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

这将需要相当多的额外"安全"和"设置"代码抽薹。