长度参数化的传递对象到类型绑定过程有 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