2012-12-21 73 views
-1

我是fortran的新手,只能在fortran 95和2003中编写。现在我有一个程序,主要是用95编写的,但它完全是fortran 77的语法,还包含一些77种功能。fortran 77在95程序中的接口

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

program my_prog 

module my_mod 
subroutine my_prog() 

更换似乎并没有工作。编译器声明,从

subroutine my_prog() 

的语法是错误的。有没有人对这个主题有过尝试,或者知道是否可以在不重写的情况下实现代码?

+0

当你说接口你期望与你转换成子程序的前一个程序交换信息?简单地为它子程序()标记无参数可能不会完成你所期望的。 – agentp

回答

4

一个模块子程序子的正确语法是

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代码,只是旧式的。唯一的例外是你不能在一个源文件中混合自由和固定的源格式。这也可能是你的问题。

要做的最好的事情是使旧功能和子程序也符合自由源格式(请参阅“交叉格式”here),并将它们放到模块中,如上所示。

+0

不能说我同意转换工作的固定格式代码只是为了它的乐趣。除非你想将它粘贴到同一个文件中,否则免费的表单代码转换是不必要的工作,可能会引入错误。 – agentp

+0

我没有看到任何错误的可能性,因为它可以并且应该自动完成。但答案的重点在其他地方。 –

0

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

  1. 编译器开关:许多编译器提供的编译时间开关编译旧代码。这取决于编译器和编译器,并可能在未来发生变化

  2. 使用工具:有一些工具可以让人们将f77代码转换为f90/95。对于此看到: http://www.atmos.illinois.edu/courses/atms391-sp11/Fortran-converters.html

  3. 手动更新来源:有人曾用浮在DO-循环点变量。使用上面讨论的自动工具可能会很困难。在出现像(goto)这样的遗留声明的情况下,您可能需要手动操作。对于这个请访问以下链接:

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

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

从长远来看,将支付你去通过代码手动行由行和自行更改。这是最便携的解决方案。

+1

您正在提供OP想要避免的内容。更改所有遗留代码。 –