【问题标题】:Length-parameterized passed object to type-bound procedure has gfortran complain长度参数化的传递对象到类型绑定过程有 gfortran 抱怨
【发布时间】:2020-08-20 02:18:12
【问题描述】:

我正在学习 Fortran,我想将一个数组和一个子例程封装在一个类型中。问题似乎出在自对象的类型定义中。

这是我想出的最小测试用例:

module testing
  implicit none

  type test(para)
    integer, len :: para
    real, dimension(para) :: weights

  contains
    procedure :: testing => testing_test
  end type
contains
  subroutine testing_test(self)
    class(test(*)) :: self
  end subroutine
end module

用 gfortran 编译会引发这个错误:

module_test.f08:9:23:

  procedure :: testing => testing_test
          1
Error: Argument ‘self’ of ‘testing_test’ with PASS(self) at (1) must be of the derived-type ‘test’

它在数组长度固定时起作用(因此type%para 不存在)

我正在尝试做的事情(类型可变大小和绑定过程的数组)是完全不可能的,还是我遗漏了一些关于虚拟参数定义的内容?

【问题讨论】:

  • 这可能是一个编译器错误。您使用的是什么版本的 gfortran? pdt最近被gfortran收录了,还有一些bug。
  • gfortran --version 的结果:GNU Fortran (GCC) 8.1.1 20180712 (Red Hat 8.1.1-5)

标签: fortran gfortran type-definition


【解决方案1】:

感谢@Rodrigo 的想法,我终于找到了这个错误(和补丁): https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82943

要解决此问题,请下载源代码,应用上述补丁并编译您自己的 gfortran。 (或者等到它在存储库中)

【讨论】:

    【解决方案2】:

    这并不是真正的答案,但可能会为某些人提供解决方案。 gfortran-10 仍然有同样的问题。但是 flang-7 编译了这个例子,它是 available 用于 Ubuntu 自 19.10 以来,可能还有其他操作系统:es。

    【讨论】:

    【解决方案3】:

    previous answer 指向 gfortran 的错误报告和补丁。不过,值得一提的是,这是标准的 Fortran (2003) 代码。

    我们这里有一个带有传递对象虚拟参数的类型绑定过程。这种论点的主要限制是它是:

    • 标量,
    • 不可分配,
    • 非指针对象,
    • 假定所有长度类型参数。

    此外,由于类型是可扩展的,因此传递的对象伪参数必须是多态的。

    对于问题的示例,所有条件都满足。

    【讨论】:

      猜你喜欢
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      相关资源
      最近更新 更多