4

在一些 Fortran 95 代码中,我有一个带有指针字段的类型。我想声明一个type(foo)在编译时初始化的模块变量。像这样的东西:

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 中完成。

4

1 回答 1

6

初始化器(在示例代码的第一个块中 bar 的声明中出现在等号之后的东西)必须是初始化(常量)表达式。Fortran 95 中的初始化表达式规则不允许在结构构造函数中使用 NULL() 以外的指针目标。

(此规则在 Fortran 2008 中被放宽,允许初始化表达式中结构构造函数中的指针目标是具有 save 属性的变量。)

请注意,您的 init 子例程可以使用结构构造函数,而不是分配给各个组件。使用该模块的客户端代码也可以使用结构构造函数直接执行对 bar 的赋值:bar = foo_type(1, bar_flag). 问题不在于结构构造函数中指针目标的使用,而是指针目标在结构构造函数中出现在必须是初始化表达式的地方。

不能为派生类型声明初始化过程。(在 Fortran 2003 中可以有一个覆盖结构构造函数的函数,但这样的函数不能在初始化表达式中使用。)

于 2012-08-10T18:18:46.780 回答