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

Posted

技术标签:

【中文标题】长度参数化的传递对象到类型绑定过程有 gfortran 抱怨【英文标题】:Length-parameterized passed object to type-bound procedure has gfortran complain 【发布时间】: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) 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

有太多的法兰,这对我来说是一团糟。这是fosdem.org/2020/schedule/event/llvm_flang/attachments/slides/…这里的“新法兰”还是“旧法兰”? 在packages.ubuntu.com/source/focal/flang 上写着“法兰(20190329-5)”,所以应该是“旧”法兰。但不确定。【参考方案3】:

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

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

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

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

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

【讨论】:

以上是关于长度参数化的传递对象到类型绑定过程有 gfortran 抱怨的主要内容,如果未能解决你的问题,请参考以下文章

将实例化的 System.Type 作为通用方法的类型参数传递

将值从 Oracle 对象类型参数传递到 PLSQL 表类型参数

SpringMVC中,前台jsp封装参数,绑定参数,传递参数到后台controller的过程详解123

Asp.net WebService 接口中在传递参数过程中,参数是不是有长度限制?

java学习之路--继承(多态的动态绑定)

将实例化的 System.Type 作为泛型类的类型参数传递