gpt4 book ai didi

fortran - Fortran 中未调用派生类型的自定义构造函数

转载 作者:行者123 更新时间:2023-12-05 03:34:43 33 4
gpt4 key购买 nike

我正在尝试通过重载类型名称来制作自定义数据类型构造函数。但是,在进行调用时,将调用默认构造函数。我不明白我做错了什么。

这是有问题的代码片段。

    module test

type, public :: foo
character(512) :: str
logical :: flag1
logical :: flag2
end type

! overload foo data-type
interface foo
module procedure make_foo
end interface

contains

! custom constructor
function make_foo(str, flag1) result(self)
implicit none
type(foo) :: self
character(512), intent(in) :: str
logical, intent(in), optional :: flag1

self % str = str ! this needs to be passed

self % flag1 = .false. ! this needs to be optional, and is false by default
if (present(flag1)) self % flag1 = flag1

self % flag2 = .false. ! this cannot be passed and is always false by default

end function

end module

program tmp
use test
implicit none
type(foo) :: a

a = foo("hello") ! error here
end program

我想要一个需要传递 str 的自定义构造函数,允许 flag1 的可选规范并处理 flag2 总是独自一人。当使用其构造函数测试数据类型时,它使用默认构造函数并提示缺少组件。

No initializer for component 'flag1' given in the structure constructor at (1)

我正在使用 gfortran 10.2.0

最佳答案

赋值语句

a = foo("hello")

如果可能,将被视为对通用 foo 的引用,否则将被视为对类型 foo 的默认结构构造函数的引用。

在这种情况下,通用foo 有一个特定的接口(interface):make_foo。为了引用通用的 foo,我们需要 foo("hello")make_foo 保持一致。

伪参数 str 被声明为 character(512) 因此我们不允许用实际参数引用它,即文字常量 "Hello":那个常量是(很多)too short .1

编译器回退到默认结构构造函数,然后(正确地)提示有没有默认初始化的组件没有被赋予值。

可以通过以下两种方式之一修复此引用:

  • 提供长度至少为 512 的实际参数
  • 使 str 更短或更好,假定长度

为了解决关于假定长度 str 的问题:即使它的长度为 5,它仍然可以用于赋值 self%str = str 因为它将被填充末尾有空格,使其长度达到 self%str 的 512。


这是否足以认为引用“不一致”是无关紧要的:在尝试这样做时没有 Fortran 程序,因此不能要求编译器尝试该引用。

关于fortran - Fortran 中未调用派生类型的自定义构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70098522/

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