如何在Fortran中创建通用过程指针?

时间:2018-07-26 18:58:55

标签: fortran fortran90

我是一名底层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文件,将读取的名称与过程指针相关联。但是,如何?

谢谢你!

1 个答案:

答案 0 :(得分:2)

我认为您想要的是:首先定义子程序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