如何在 Fortran 中制作通用过程指针?

How to make a generic procedure pointer in Fortran?

我是一名低级 Fortran 程序员。我试图使子例程尽可能通用,我想知道我是否可以发送一个信息,说明另一个子例程应该从主程序中的给定信息访问哪个子例程。例如,如果我有:

program main
use test
implicit none
real(8) X
end program main

并且:

module test

contains

subroutine A (X)
real(8) X
X = 2*X
end subroutine A

subroutine B (X)
real(8) X
X = 3*X
end subroutine B

end module test

我想,给定主程序中的子例程名称 'A' 或 'B',将其转移到模块测试中的第三个子例程 C,这反过来会进行一些计算,并使用传输的名称在计算中选择 AB

我知道如果我在主程序中构建子例程 C 的计算,我可以使用过程指针访问 AB 子例程。但是,我需要子例程 C。所以我想我会有一个带有内置过程指针的子例程 C,它将把主程序中给定的名称作为参数。但我不知道该怎么做。如果可能的话也不会。如果不行,还有其他办法吗?我不知道,也许子例程 C 读取一个 txt 文件,将读取的名称与过程指针相关联。但是,如何?

提前谢谢!

我认为你想要的是:你首先定义子例程 AB

module ab_m
  implicit none
contains

  subroutine A(X)
    real, intent(inout) :: X
    X = 2 * X
  end subroutine A

  subroutine B(X)
    real, intent(inout) :: X
    X = 3 * X
  end subroutine B

end module ab_m

然后子程序C使用一个由接口指定的虚拟程序,

module c_m
  implicit none
contains

  subroutine C(sub,y)

    interface
       subroutine sub(p)
         implicit none
         real, intent(inout) :: p
       end subroutine sub
    end interface

    real, intent(inout) :: y
    y = y + 1
    call sub(y)

  end subroutine C

end module c_m

主程序选择在C中使用什么程序:

program p

  use ab_m 
  use c_m
  implicit none
  real :: z(2)

  z = 1.0
  call C(B, z(1))        
  call C(A, z(2))
  write(*,*) z     ! writes 6.0, 4.0 [ (1+1)*3, (1+1)*2) ]

end program p