将 Fortran 转换为 C 或 C++

Posted

技术标签:

【中文标题】将 Fortran 转换为 C 或 C++【英文标题】:Convert Fortran to C or C++ 【发布时间】:2008-11-27 03:05:16 【问题描述】:

我有一些需要转换为 C 或 C++ 的数字代码。我尝试使用 f2c,但它不适用于 Fortran 代码。 f2c 抱怨是因为代码使用了 C 风格的预处理器指令 (#include)。 代码的自述文件指出,与 fort77 链接器一起使用的 Fortran77 将扩展这些包含。

有谁知道如何成功转换此代码?

我最后的办法是编写一个简单的预处理器来扩展这些包含,然后将代码提供给 f2c。

注意:我在这里的 Windows/Visual C++ 环境中工作,所以任何 gcc 恶作剧都可能比它们的价值更麻烦...

【问题讨论】:

老笑话是,unix 工具“rm”会将你过时的 Fortran 程序转换成空闲的磁盘块,你可以用它来正确地编写它。 这实际上是一个很好的笑话 :-) 查看此讨论:http://***.com/questions/275458/conversion-of-fortran-77-code-to-c 【参考方案1】:

我在一个工程研究小组工作了很多年。从 Fortran 到 C 的自动转换我们从来没有运气好过。代码不是特别容易理解,而且很难维护。我们最好的运气是使用 Fortran 代码作为算法的模板,并对我们希望继续使用的任何东西进行重新实现。或者,您可以更新 Fortran 以使用更现代的 Fortran 结构,并获得许多与迁移到 C/C++ 相同的价值。我们还成功地从 C 中调用 Fortran 例程,尽管调用约定的差异有时会使事情变得困难。

【讨论】:

我还发现 f2c 作为构建过程的一部分比将源代码转换为随后由人类编辑更有意义。【参考方案2】:

这个可能是有点跑题了,但是你有没有考虑过,因为也许你正在使用 C 风格的包含,你实际上可以按顺序在文件上运行 C 预处理器包括那些文件?然后,您可以获取 那个 输出并通过 f2c 运行它。

(我不是这方面的专家。如果合适,请投反对票。)

【讨论】:

Hun... 我很难接受。但是我的编译器(Visual C++ 9.0)并没有与预处理器分开......或者是否有命令行来指定它? 您可能需要结合使用 /C、/E 和 /P 选项,详情请参阅msdn.microsoft.com/en-us/library/becb7sys(VS.71).aspx。【参考方案3】:

您可能会手动转换

#include "whatsit.f90"

包括“whatsit.f90”

然后再次尝试 f2c 转换。

【讨论】:

即使是 Fortran 77 代码(因此扩展名可能是 .f77 而不是 .f90)。这当然值得一试。 当然,自动转换会更好。不是很难的脚本——可能是 Perl 单行代码。【参考方案4】:

你没有 C 预处理器吗?在 Unix 上,可能有一个单独的程序 cpp,它将使用带有 #include 指令的 Fortran 并将其转换为没有 #include 指令的 Fortran。或者,您可以将源代码从 xyz.f77 (xyz.f) 重命名为 xyz.c,然后在“仅预处理器”模式下运行 C 编译器并将输出捕获为 f2c 程序的新输入。您可能不得不担心在输出等中消除 #line 指令的选项,或者您最好通过一个简单的过滤器(sedperl 想到)运行输出。

【讨论】:

Agin,如何在 Visual C++ 9.0 中使用这种仅预处理器模式?

以上是关于将 Fortran 转换为 C 或 C++的主要内容,如果未能解决你的问题,请参考以下文章

FORTRAN里怎样把数值类型(整数,浮点数)转换为字符串

编译旧Fortran代码的语法错误

如何用 c 或 c++ 读取 FORTRAN 二进制文件?

将 Fortran 转换为 Javascript

在默认类型和 C 互操作类型之间转换 Fortran 字符和逻辑数组

在默认类型和 C 互操作类型之间转换 Fortran 字符和逻辑数组