长度参数化的传递给类型绑定过程的对象有gfortran抱怨

时间:2018-10-06 10:46:10

标签: fortran gfortran type-definition

我正在学习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不存在)时有效。

我要做的事情(带有可变大小数组和绑定过程的类型)显然是不可能的,还是我缺少有关虚拟参数定义的内容?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

这并不是真正的答案,但可以为某些人提供解决方案。 gfortran-10仍然存在相同的问题。但是flang-7编译了此示例,自19.10起,它是available(对于Ubuntu),也许还有其他操作系统:

答案 2 :(得分:0)

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

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

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

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

以问题为例,所有条件都得到满足。