如何在 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
,这反过来会进行一些计算,并使用传输的名称在计算中选择 A
和 B
。
我知道如果我在主程序中构建子例程 C
的计算,我可以使用过程指针访问 A
或 B
子例程。但是,我需要子例程 C
。所以我想我会有一个带有内置过程指针的子例程 C
,它将把主程序中给定的名称作为参数。但我不知道该怎么做。如果可能的话也不会。如果不行,还有其他办法吗?我不知道,也许子例程 C
读取一个 txt 文件,将读取的名称与过程指针相关联。但是,如何?
提前谢谢!
我认为你想要的是:你首先定义子例程 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
我是一名低级 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 文件,将读取的名称与过程指针相关联。但是,如何?
提前谢谢!
我认为你想要的是:你首先定义子例程 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