将Fortran转换成C或C++

3
我有一些数字代码需要转换成C或C++。我尝试使用f2c,但它无法处理Fortran代码。f2c抱怨代码使用C风格的预处理器指令(#include)。 代码的自述文件说明它是Fortran77,可以使用fort77链接器来扩展这些包含文件。
有人知道如何成功转换此代码吗?
我的最后一招是编写一个简单的预处理器来扩展这些包含文件,然后将代码提供给f2c。
注意:我在Windows/Visual C++环境中工作,因此任何gcc的把戏可能会带来更多麻烦...

7
这个老笑话说的是Unix工具"rm"会将你过时的Fortran程序转换成可用于正确编写程序的空闲磁盘块。 - Paul Tomblin
那其实是个好笑话 :-) - David Reis
请参考以下讨论: https://dev59.com/43VC5IYBdhLWcg3wfxM8 - John D. Cook
4个回答

9

我曾在一个工程研究小组工作了多年。我们从未成功地将Fortran自动转换为C语言。代码不是特别易于理解,维护也很困难。我们最好的方法是使用Fortran代码作为算法模板,并重新实现我们预计要继续使用的任何部分。或者,您可以更新Fortran以使用更现代的Fortran结构,并获得与移至C/C++相同的价值。我们还成功地从C语言调用Fortran例程,尽管调用约定差异有时会使事情变得困难。


我也发现,与其将源代码转换为随后由人类编辑,将f2c作为构建过程的一部分更有意义。 - dmckee --- ex-moderator kitten

8

这可能有点冒险,但您是否考虑过由于您可能正在使用C风格的包含方式,因此您可以实际上运行C预处理器来包含这些文件?然后,您可以获取那个输出并通过f2c运行它。

(我不是该问题的专家。如果不合适,请给我投反对票。)


混蛋...我想到了。但是我的编译器(Visual C++ 9.0)与预处理器不是分开的...还是有命令行可以指定吗? - David Reis
您可能需要使用/C、/E和/P选项的组合,请参阅http://msdn.microsoft.com/en-us/library/becb7sys(VS.71).aspx获取详细信息。 - Robert Gamble

7

您可以尝试手动将

#include "whatsit.f90"

转换为

INCLUDE 'whatsit.f90'

然后再次尝试进行f2c转换。


即使它是Fortran 77代码(因此扩展名可能为.f77而不是.f90),也值得一试。 - Jonathan Leffler
另外,自动进行转换当然会更好。这不是一件难的脚本编写 - 可能只需要一行 Perl 代码就可以了。 - Jonathan Leffler

4

如果您没有C预处理程序,可以考虑在Unix上使用cpp作为单独的程序。该程序可以将带有 #include 指令的Fortran代码转换为不带指令的Fortran代码。另外一种方法是将源代码从xyz.f77(或xyz.f)重命名为xyz.c,然后以“预处理器模式”运行C编译器,并将输出捕获为 f2c 程序的新输入。您可能需要关注输出中消除 #line 指令等选项,或者最好将输出通过一个简单的过滤器(比如sedperl)进行处理。


请问,在Visual C++ 9.0中,如何使用预处理器专用模式? - David Reis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接