0

我有一个关于在运行时分配 Fortran90 派生类型和指针的问题。我想在代码读取输入文件后将派生变量类型传递给子例程。因此,根据输入,我传递适当的数据类型。让我解释:

我有两个模块:

模块 A_mod模块 B_mod。每个都有自己独特的数据类型和子例程。例如:

Module A_mod

type A
real :: x, y
end type

contains

subroutine FunA(me)
type (A), intent(in) :: me
<do stuff>
end subroutine

End module A_mod

模块 B_mod是上述 B 替换 A 的镜像(数据类型 B 也将 x 和 y 定义为整数)。

我还有第三个具有此接口的模块:

interface fun
modular procedure funA, funB
end interface

这是我的问题。用户通过输入文件确定使用哪个模块子程序。如何制作在运行时关联的通用指针?或者类似的不需要指针的东西。

例如:

type (?) :: pt
Call fun(pt)

在程序读取输入文件后,它会选择正确的数据类型以发送到接口子例程“fun”。所以类型在运行前是未知的。

如果 Fortran 让我在代码的执行部分中声明一个变量,它看起来像这样

IF(input.EQ."A") THEN
type(A) :: pt
ELSE
type(B) :: pt
END IF

CALL fun(pt)

任何建议将不胜感激!

谢谢

4

1 回答 1

2

这在 Fortran 90 中很难干净地完成。在 Fortran 2003 中是直截了当的。

fun遇到泛型引用时(在)中调用的过程的解析CALL fun(pt)是在编译时完成的,基于声明的类型pt

如果您仅限于 Fortran 90,那么实际上您将需要维护某种标志,该标志在运行时指示您要使用的特定派生类型,为 A 类型和 B 类型中的每一个都有一个命名对象,并且每次您想要引用fun具有选择正确命名参数的 IF 构造。

(如果对象的大小很大,您可以安排它们有共同的存储空间。)

就像是:

TYPE(A) :: pt_A
TYPE(B) :: pt_B
...
IF (input .EQ. 'A') THEN
  CALL fun(pt_A)
ELSE
  CALL fun(pt_B)
END IF

在 F2003 中,您将定义一个公共父类型,该类型具有名为 fun 的特定绑定。 pt然后将是一个多态可分配对象,根据适当的类型 A 或类型 B 的输入分配。

TYPE :: Parent
CONTAINS
  PROCEDURE(parent_Fun), DEFERRED :: Fun
END TYPE Parent

ABSTRACT INTERFACE
  SUBROUTINE parent_Fun(obj)
    IMPORT :: Parent
    IMPLICIT NONE
    CLASS(Parent), INTENT(IN) :: obj
  END SUBROUTINE parent_Fun
END INTERFACE

TYPE, EXTENDS(Parent) :: A
  REAL :: x, y
CONTAINS
  PROCEDURE :: A => A_Fun
END TYPE A

TYPE, EXTENDS(Parent) :: B
  INTEGER :: x, y
CONTAINS
  PROCEDURE :: B => B_Fun
END TYPE B

CLASS(Parent), ALLOCATABLE :: pt
...
IF (input .EQ. 'A') THEN
  ALLOCATE(A:: pt)
ELSE
  ALLOCATE(B:: pt)
END IF
...
CALL pt%Fun()
于 2013-05-24T03:22:09.480 回答