长度参数化的传递对象到类型绑定过程有 gfortran 抱怨
Length-parameterized passed object to type-bound procedure has gfortran complain
我正在学习 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
不存在)
我正在尝试做的事情(使用可变大小数组和绑定过程键入)是不可能的,还是我遗漏了有关虚拟参数定义的内容?
感谢@Rodrigo 的想法,我终于找到了这个错误(和补丁):
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82943
要解决此问题,请下载源代码,应用上述补丁并编译您自己的 gfortran。 (或者等到它在存储库中)
A 指向 gfortran 的错误报告和补丁。不过,值得一提的是,这是标准的 Fortran (2003) 代码。
我们这里有一个带有传递对象伪参数的类型绑定过程。这种论证的主要限制是它是:
- 标量,
- 不可分配,
- 非指针对象,
- 假定所有长度类型参数。
此外,由于类型是可扩展的,因此传递的对象伪参数必须是多态的。
题例,条件都满足
这不是真正的答案,但可能会为某些人提供解决方案。 gfortran-10
还是一样的问题。但是 flang-7
编译了这个例子,它是 available for Ubuntu since 19.10, and maybe other OS:es.
我正在学习 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
不存在)
我正在尝试做的事情(使用可变大小数组和绑定过程键入)是不可能的,还是我遗漏了有关虚拟参数定义的内容?
感谢@Rodrigo 的想法,我终于找到了这个错误(和补丁): https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82943
要解决此问题,请下载源代码,应用上述补丁并编译您自己的 gfortran。 (或者等到它在存储库中)
A
我们这里有一个带有传递对象伪参数的类型绑定过程。这种论证的主要限制是它是:
- 标量,
- 不可分配,
- 非指针对象,
- 假定所有长度类型参数。
此外,由于类型是可扩展的,因此传递的对象伪参数必须是多态的。
题例,条件都满足
这不是真正的答案,但可能会为某些人提供解决方案。 gfortran-10
还是一样的问题。但是 flang-7
编译了这个例子,它是 available for Ubuntu since 19.10, and maybe other OS:es.