gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:18:30 28 4
gpt4 key购买 nike

在一些 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com