我是一名底层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
,依次进行一些计算并使用转移名称,以便在计算中在A
和B
之间进行选择。
我知道如果我在主程序中构建该子例程C
的计算,则可以使用过程指针访问A
或B
子例程。但是,我需要有子例程C
。因此,我想我将有一个带有内置过程指针的子例程C
,它将使用主程序中给出的名称作为参数。但是我不知道该怎么做。如果可能的话,两者都不可行。如果不是,还有其他方法吗?我不知道,也许子例程C
正在读取txt文件,将读取的名称与过程指针相关联。但是,如何?
谢谢你!
答案 0 :(得分:2)
我认为您想要的是:首先定义子程序A
和B
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