pointers - 是否可以在 fortran 的类型构造函数中使用指针?

标签 pointers constructor fortran fortran90 fortran95

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

最佳答案

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

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

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

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

关于pointers - 是否可以在 fortran 的类型构造函数中使用指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11905169/

相关文章:

constructor - 如何检查变量是否已使用构造函数构造?

c++ - 调用类成员对象的构造函数

Java:返回用户输入

c++ - 这个双向链表代码怎么解释呢?

c - 全局修改数组/结构不起作用

c - C语言十进制转二进制

c - OpenMPI + Fortran + C 的基本测试根据奇怪的事情抛出不同的错误

c++ - 跨类的静态字符数组行为异常

r - 将数据从 Fortran 传递到 R

Java Swing 执行 gFortran 代码