在Fortran中将派生类型作为参数的函数作为参数传递
我有一个子程序,它接收一些数据和另一个函数作为参数。函数可以将此数据作为参数。子程序就在那里,用给定的数据调用这个函数。现在让我们假设数据可以是foo类型。我假设我也可以从foo派生的类型栏传递数据。显然Fortran不同意 我试着用gfortran 9编译下面的代码。它失败,并显示错误消息:在Fortran中将派生类型作为参数的函数作为参数传递,fortran,Fortran,我有一个子程序,它接收一些数据和另一个函数作为参数。函数可以将此数据作为参数。子程序就在那里,用给定的数据调用这个函数。现在让我们假设数据可以是foo类型。我假设我也可以从foo派生的类型栏传递数据。显然Fortran不同意 我试着用gfortran 9编译下面的代码。它失败,并显示错误消息: 47 | call funA(x, y, baz) | 1 Error: Interface mismatch in dum
47 | call funA(x, y, baz)
| 1
Error: Interface mismatch in dummy procedure ‘baz’ at (1): Type mismatch in argument 'y' (CLASS(foo)/CLASS(bar))
用棒子代替foo的各种其他尝试产生了类似的结果。使用pgfortran 19.4会产生相同的错误
module A
implicit none
private
type, abstract, public :: foo
end type foo
public :: funA
contains
subroutine funA(x, y, baz)
integer, intent(in) :: x
class(foo), intent(in) :: y
interface
function baz(x, y) result(z)
import foo
integer, intent(in) :: x
class(foo), intent(in) :: y
integer :: z
end function baz
end interface
write(*,*) baz(x, y)
end subroutine funA
end module
module B
use A
implicit none
private
type, extends(foo), public :: bar
integer :: ii
end type bar
public :: fiz
contains
function baz(x, y) result(z)
integer, intent(in) :: x
class(bar), intent(in) :: y
integer :: z
z = x + y%ii
end function baz
subroutine fiz(x, y)
integer, intent(in) :: x
class(bar), intent(in) :: y
call funA(x, y, baz) ! <---- This causes errors.
end subroutine fiz
end module
program meh
use B
implicit none
integer :: x
type(bar) :: y
x = 1
y%ii = 2
call fiz(x, y)
end program meh
模块A
隐式无
私有的
类型,抽象,公共::foo
端型foo
公众:福纳
包含
子程序funA(x,y,baz)
整数,意图(in)::x
类别(foo),意图(in)::y
接口
函数baz(x,y)结果(z)
进口食品
整数,意图(in)::x
类别(foo),意图(in)::y
整数::z
端函数baz
端接口
写(*,*)baz(x,y)
结束子程序funA
端模块
模块B
使用
隐式无
私有的
类型,扩展(foo),公共::bar
整数::ii
端型杆
公众:fiz
包含
函数baz(x,y)结果(z)
整数,意图(in)::x
等级(酒吧),意图(酒吧):y
整数::z
z=x+y%ii
端函数baz
子程序fiz(x,y)
整数,意图(in)::x
等级(酒吧),意图(酒吧):y
打电话给funA(x,y,baz) 这里指出的错误在过程参数的特性中。funA
的过程伪参数baz
具有与模块B
的过程实际参数baz
不匹配的特征。伪参数具有声明类型foo
的第二个参数(y
),而传递给它的过程baz
具有声明类型bar
的相应参数
不允许在伪过程参数和实际过程参数的特性中存在这种不匹配
要解决此问题,必须使伪baz
和模块过程baz
的伪参数y
具有相同的声明类型(可能是foo
)。当然,您需要在baz
(模块B
)中解决y
已声明类型foo
:这样的y
没有组件ii
。一个快速的方法是使用选择类型构造,但如果可以设计不同的流,则很可能有其他方法
正如您所看到的,如果各种参数等具有不同的名称,那么围绕这样的代码进行的讨论通常会有所帮助