【问题标题】:OOP Fortran, Type and Procedures in different filesOOP Fortran,不同文件中的类型和过程
【发布时间】:2013-10-09 04:09:08
【问题描述】:

我想知道是否可以将实际的子例程放在类型绑定过程和不同文件中的类型定义后面。例如:

文件A:

Module TypeDef  
Type :: Test  
  Integer :: a,b,c  
contains  
  Procedure, Pass, Public :: add => SubAdd  
End Type  
Type(Test) :: Test  
  Interface  
   Subroutine SubAdd(this)  
      Import TypeDef  
      Class(TypeDef), Intent(InOut) :: this  
  End Subroutine  
  End Interface  
End Module  

文件 B:

Module TypeRoutines  
   use TypeDef  
   Private :: SubAdd
contains  
   Subroutine SubAdd(this)  
      Class(TypeDef), Intent(InOut) :: this  
      this%c=this%a+this%b  
   End Subroutine  
End Module  

这不起作用,因为当先编译文件 A 然后编译文件 B 时,ifort 会给出错误消息:

The name of the module procedure conflicts with a name in the encompassing scoping unit

这主要是因为对于某些类型,我必须编写大量类型绑定的过程,并且有些文件扩展了数百行,这使得工作非常乏味。最终目标是将每个子例程放入不同的文件中。

有什么想法吗?

【问题讨论】:

    标签: oop fortran intel-fortran type-bounds


    【解决方案1】:

    假设您的绑定有一个传递的参数(如果没有,事情就容易多了):

    简单!将过程体放入TypeDef模块的子模块中,并将过程的接口复制和编辑到模块本身规范部分的单独接口体中。唯一的问题是它需要 F2008 编译器(支持子模块的编译器),而当前的 ifort 不是其中之一...

    在现实世界中,我认为您只有以下选择:

    • 可以绑定到具有显式接口的外部过程...因此,将实现特定绑定的每个过程都设置为外部过程(而不是您尝试的模块过程),为规范中的每个外部过程创建一个接口主体模块的一部分(就像您所做的那样),然后将每个绑定与其各自的外部过程相关联。如果该类型具有外部过程需要访问的私有组件或绑定,并且需要注意确保接口主体与外部过程的实际接口匹配,则此方法将失败。

    • 将每个模块过程放在一个单独的文件中,然后在模块的 CONTAINS 语句之后包含这些单独的文件。

    • 处理大文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      相关资源
      最近更新 更多