是否有可能在Fortran的类型构造函数中使用指针?
问题描述:
在一些Fortran 95代码中,我有一个带指针字段的类型。我想声明一个在编译时初始化的模块变量type(foo)
。类似这样的:是否有可能在Fortran的类型构造函数中使用指针?
module foo_module
implicit none
type foo_type
integer :: x
logical, pointer :: x_flag => null()
end type foo_type
logical, target :: bar_flag
! this does not compile of course:
type(foo_type) :: bar = foo_type(1, bar_flag)
end module foo_module
上面的代码片段不能编译。我知道我可以使用一个单独的子程序,像在运行时初始化bar
:
module foo_module
implicit none
type foo_type
integer :: x
logical, pointer :: x_flag => null()
end type foo_type
logical, target :: bar_flag
type(foo_type) :: bar
contains
subroutine init()
bar%x = 1
bar%x_flag => bar_flag
end subroutine init
end module foo_module
但有可能做到这一点没有初始化子程序?或者是否可以声明由编译器明确调用的初始化子例程?注意:这必须在Fortran 95中完成。
答
初始化程序(在示例代码的第一个块的bar声明中的equals之后出现的东西)必须是初始化(常量)表达式。 Fortran 95中的初始化表达式规则不允许在结构构造函数中使用NULL()以外的指针。
(这条规则是在2008年的Fortran放宽,允许在结构构造函数指针的目标在初始化表达式与保存属性变量。)
请注意,你的初始化子程序可以使用结构构造函数,而不是分配给个别组件。使用该模块的客户端代码也可以使用结构构造函数直接执行赋值来禁止:bar = foo_type(1, bar_flag)
。问题不在于在结构构造函数中使用指针目标 - 它是在结构构造函数中的地方出现的指针目标,它必须是初始化表达式。
无法为派生类型声明初始化过程。 (在Fortran 2003中可能有一个覆盖结构构造函数的函数,但是这样的函数不能用于初始化表达式中。)
感谢您的出色解释。被限制为Fortran 95语言子集确实吸收:( – abbot 2012-08-10 20:30:21