【问题标题】:How to make a generic procedure pointer in Fortran?如何在 Fortran 中制作通用过程指针?
【发布时间】:2019-01-03 20:41:55
【问题描述】:

我是一名低级 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 文件。但是,怎么做?

提前谢谢你!

【问题讨论】:

  • 如果我理解正确你想要什么,你可以阅读虚拟程序
  • Real(8) 太丑了,在这么简单的例子中甚至不需要它。
  • 泛型在什么意义上?我不明白你的目的是什么。你能用代码而不是文字来说明吗?

标签: fortran fortran90


【解决方案1】:

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

【讨论】:

  • 非常感谢!这正是我所需要的!
猜你喜欢
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 2021-11-17
  • 2018-10-20
相关资源
最近更新 更多