-1

我对fortran很陌生,只用fortran 95和2003编写。现在我有一个主要用95编写的程序,但它完全是fortran 77语法,还包含一些77个函数。

现在我需要另一个程序中的功能,但不想重写整个程序。我的想法是更换

program my_prog

module my_mod
subroutine my_prog()

替换似乎不起作用。编译器指出,语法来自

subroutine my_prog()

是错的。有没有人对该主题有一些经验,或者知道是否可以在不重写代码的情况下实现代码?

4

2 回答 2

4

模块子例程 sub 的正确语法是

module name_of_the_module

  use whatever

  implicit none

  !some variables and interfaces

  contains

    subroutine sub
      !here is the code of your subroutine
    end subroutine sub

end module name_of_the_module

否则,应注意,您可以从较新的代码调用 FORTRAN 77 中的代码。它(除了一些例外)仍然是有效的 Fortran 2008 代码,只是采用了旧样式。唯一的例外是您不能在一个源文件中混合免费和固定源格式。这也可能是你的问题。

最好的办法是使旧函数和子例程也符合免费源格式(请参阅此处的“交叉格式” )并将它们放入我上面显示的模块中。

于 2012-12-21T17:51:32.710 回答
0

仅将子程序打包到模块中可能在某些情况下有效,但在其他情况下可能无效。Fortran 77 的某些功能现在已被宣布过时。你有几个选择。

  1. 编译器开关: 许多编译器提供编译时开关来编译遗留代码。这取决于编译器到编译器,并且将来可能会改变

  2. 使用工具: 人们编写的工具可以让您将 f77 代码转换为 f90/95。为此,请参阅: http: //www.atmos.illinois.edu/courses/atms391-sp11/Fortran-converters.html

  3. 手动更新源代码: 有些人在 do-loops 中使用了浮点变量。使用上面讨论的自动工具可能很难做到这一点。在存在像 (goto) 这样的遗留语句的情况下,您可能必须手动工作。为此,请参阅以下链接:

http://www.cisl.ucar.edu/zine/96/fall/articles/3.f90.conversion.html

http://iprc.soest.hawaii.edu/users/furue/improve-fortran.html

从长远来看,您需要手动逐行检查代码并自己进行更改。这是最便携的解决方案。

于 2014-06-02T15:36:54.483 回答