在Fortran中将派生类型作为参数的函数作为参数传递

在Fortran中将派生类型作为参数的函数作为参数传递,fortran,Fortran,我有一个子程序,它接收一些数据和另一个函数作为参数。函数可以将此数据作为参数。子程序就在那里,用给定的数据调用这个函数。现在让我们假设数据可以是foo类型。我假设我也可以从foo派生的类型栏传递数据。显然Fortran不同意 我试着用gfortran 9编译下面的代码。它失败,并显示错误消息: 47 | call funA(x, y, baz) | 1 Error: Interface mismatch in dum

我有一个子程序,它接收一些数据和另一个函数作为参数。函数可以将此数据作为参数。子程序就在那里,用给定的数据调用这个函数。现在让我们假设数据可以是foo类型。我假设我也可以从foo派生的类型栏传递数据。显然Fortran不同意

我试着用gfortran 9编译下面的代码。它失败,并显示错误消息:

   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
。一个快速的方法是使用
选择类型
构造,但如果可以设计不同的流,则很可能有其他方法


正如您所看到的,如果各种参数等具有不同的名称,那么围绕这样的代码进行的讨论通常会有所帮助