0

我在谷歌上一无所获,所以...

我尝试使用 Fortran 90 的所有面向对象的特性,并为一些特定的工作(如 C++ 中的类)创建模块。我写了这样的东西:

module test

integer, PRIVATE :: dummy
PUBLIC :: sub

contains 

subroutine sub()
dummy = 1
end subroutine sub

end module test

但是,我有大约 10 个这样的子例程,将它们全部放在一个文件中是非常糟糕的主意。是否可以告诉编译器,即sub模块子例程,但将其放在另一个文件中?因为,看起来只有当我在sub那里定义 body 时才会编译这段代码。

4

2 回答 2

1

有可能的。我不知道这是否好,但这是可能的。你可以使用include "filename"或者如果你也使用前驱#include "filename"

这样,您可以将任何其他文件中的文本包含在include语句的位置。但这是有争议的,如果这是一件积极的事情,因为一个文件中的 10 个程序通常不会太多,如果它们不是非常长(那么你应该改变它们)。

(我必须小心,上次我提到 include 是可能的,我被不喜欢它的人强烈过度投票。)

另请注意,Fortran 2003 带来了更多面向对象,包括类型绑定过程,如果您需要更多对象实例,则可能值得考虑。

于 2012-09-14T11:41:48.333 回答
1

作为对您的问题的直接回答 - 是的 - 您可以使用INCLUDE一行来引用一个文件,该文件包含sub来自包含模块其余部分定义的文件中的定义(包含子例程代码的文件的包含行将在模块中的CONTAINS语句之后。

MODULE test
  INTEGER, PRIVATE :: dummy
  PUBLIC :: sub
CONTAINS
  INCLUDE 'sub.f90'
END MODULE test

! sub.f90
SUBROUTINE sub
  dummy = 1
END SUBROUTINE sub

然而,这是一种非典型的安排。此外,如果“将它们全部放在一个文件中”是一个“非常糟糕的主意”,那么从一个模块中获得可能不同的子例程是一个好主意(或必要)吗?

更传统的 F90 解决方案是将共享数据(虚拟)作为公共实体放置在一个“低级”模块中,将子程序定义放置到一系列“中间级”模块中,这些模块根据需要使用低级模块,然后是最终的“高级”模块,该模块使用中间模块并提供对客户端代码的集体导出。然后使用源代码约定而不是语言规则来避免客户端代码直接使用中级和低级模块。

MODULE low_level_shared
  IMPLICIT NONE
  INTEGER, PUBLIC :: dummy
END MODULE low_level_shared

MODULE intermediate_sub1
  IMPLICIT NONE
CONTAINS
   SUBROUTINE sub1
     USE low_level_shared
     dummy = 1
   END SUBROUTINE sub1
END MODULE intermediate_sub1

MODULE intermediate_sub2
  IMPLICIT NONE
CONTAINS
   SUBROUTINE sub2
     USE low_level_shared
     ...
   END SUBROUTINE sub2
END MODULE intermediate_sub2

MODULE high_level
  USE intermediate_sub1
  USE intermediate_sub2
  PRIVATE
  PUBLIC :: sub1, sub2
END MODULE high_level

PROGRAM client_code
  USE high_level
  ...
  CALL sub1
END PROGRAM client_code

Fortran 2008 允许通过子模块功能进行额外的结构和控制,其中模块过程接口可以在模块过程实现的单独程序单元中定义。

于 2012-09-14T11:53:35.463 回答