1

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

档案一:

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

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

有任何想法吗?

4

1 回答 1

2

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

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

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

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

或者

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

或者

  • 与大文件一起生活。
于 2013-10-09T05:01:41.377 回答