如何在Fortran界面中使用用户定义的类型

时间:2012-12-13 10:28:34

标签: interface fortran user-defined-types

在Fortran 2003模块中,我定义了一个名为t_savepoint的类型,稍后,我想为一个名为fs_initializesavepoint的子例程定义一个接口,该子程序接受{{1}类型的对象仅作为参数。

以下是整个模块的代码:

t_savepoint

我之所以需要这样的接口,是因为稍后我将使这个fortran模块与C互操作。

如果我尝试编译它(gfortran-4.7.0),我会收到以下错误消息:

module m_serialization

    implicit none

    type :: t_savepoint
        integer :: savepoint_index
        real    :: savepoint_value
    end type t_savepoint

    interface

        subroutine fs_initializesavepoint(savepoint)
            type(t_savepoint) :: savepoint
        end subroutine fs_initializesavepoint


    end interface

end module m_serialization

如果我在子程序中移动类型的定义,则错误消失;但如果那时我想在许多子程序中使用相同的类型,我应该在所有子程序中重复这个定义吗?

提前谢谢。

编辑:解决方案是将类型的定义移动到另一个模块,然后在每个子例程中移动到 type(t_savepoint) :: savepoint 1 Error: The type of 'savepoint' at (1) has not been declared within the interface 。但是我不太喜欢这个解决方案,因为类型use和子例程是同一个概念主题的一部分。

2 个答案:

答案 0 :(得分:7)

接口块中的正确或错误,您无法通过主机关联访问环境。要解决此问题,您需要显式导入数据类型:

[luser@cromer stackoverflow]$ cat type.f90
module m_serialization

  implicit none

  type :: t_savepoint
     integer :: savepoint_index
     real    :: savepoint_value
  end type t_savepoint

  interface

     subroutine fs_initializesavepoint(savepoint)
       Import :: t_savepoint
       type(t_savepoint) :: savepoint
     end subroutine fs_initializesavepoint


  end interface

end module m_serialization
[luser@cromer stackoverflow]$ gfortran -c type.f90

这是f2003。

但是我怀疑你的方式这表明你不打算以最好的方式编码。更好的只是将例程本身放在模块中。然后你根本不需要打扰界面:

module m_serialization

  implicit none

  type :: t_savepoint
     integer :: savepoint_index
     real    :: savepoint_value
  end type t_savepoint

Contains

  Subroutine fs_initializesavepoint(savepoint)

    type(t_savepoint) :: savepoint 

    Write( *, * ) savepoint%savepoint_index, savepoint%savepoint_value

  End Subroutine fs_initializesavepoint

end module m_serialization
[luser@cromer stackoverflow]$ gfortran -c type.f90

鉴于模块实际上是为处理连接的实体而设计的,这实际上是在Fortran中实现它的方法。它还具有仅需要f95编译器的优点,因此普遍可用(尽管通常认为导入是通用的)

答案 1 :(得分:-1)

在定义抽象数据类型/类时,IMPORT语句可能是相关的。根据定义的数据类型,可能需要抽象接口,并且必须使用IMPORT语句来访问抽象接口块内的派生类型。