Fortran 77转换为C ++

时间:2010-11-30 00:02:20

标签: c++ c fortran fortran77

我有一个Fortran 77应用程序,它使用Common声明来“共享”内存变量。回到白天,当记忆力昂贵且很难得到时,这就是它的方法。

受控设备设置状态标志。这些标志位于这些公共变量中。

有关如何在c ++中实现通用功能的任何建议吗?

一个类,或许,所有常见变量都是公共的。因此,任何实例化该类的程序都可以访问Common变量的内容。

是否有将Fortran转换为C或C ++的教程/指南?

由于

6 个答案:

答案 0 :(得分:2)

首先,您可以使用Fortran 90模块删除公共块。

如果你想直接将公共块转换为C ++,你必须制作一大堆全局/静态变量或使用未命名的命名空间。

然而,这违反了信息隐藏,大多数人会建议你不要轻率地使用全局变量。

更一般地说,您可能有兴趣查找Barton-Nackman书籍Scientific and Engineering C++: An Introduction with Advanced Techniques and Examples。它有点过时,但这不应该太重要。假设您具有Fortran /程序背景,它教您使用C ++进行科学或工程应用。

答案 1 :(得分:2)

This Fortran to C/C++ Tutorial建议:

      FORTRAN:
           DOUBLE PRECISION X
           INTEGER A, B, C
           COMMON/ABC/ X, A, B, C

      C:
           extern struct{
               double x;
               int a, b, c;
           } abc_;

      C++:
         extern "C" {
           extern struct{
               double x;
               int a, b, c;
           } abc_;
         }

你把extern结构放到一个.h文件中,C / C ++文件用#include引用它,并且在一个.c或.cpp文件中,你准确地放了.h文件但是没有“extern” “字。

我的假设是,你必须从相对简洁和边缘化不可理解,并且你想要以一种与原始文件保持近似一一对应的方式将其翻译成C ++。

答案 2 :(得分:1)

我对Alexandros回答“自然”音译的评论是恰当的,它将common块中的所有内容都包含在c ++代码中的类静态中。结果是好的c ++代码,但它会给一个开始重构的地方。

也就是说,我通常会先尝试将c ++前端与现有的fortran后端连接起来,然后然后启动翻译过程,如果它仍然是一个好主意。

答案 3 :(得分:1)

我知道我正在评论我在评论中说的话,但是,我认为没有人知道。

短语“被控制的设备”向我发出信号,表示该程序是某种设备驱动程序,并且设备很可能期望其标志位于特定的内存区域。使用公共存储的原因是各种模块可以直接访问和更新这些区域。将这些转换为C extern should工作,但你真的需要掌握设备接口的文档,以确保你正确地完成它。

正如一些海报所暗示的那样,在某些情况下会失去共同的基础。如果您有时间和信心,最好的方法是拥有一个静态类,它处理公共存储的所有更新,并用“get”和“set”替换对新类的所有读写操作。

答案 4 :(得分:0)

根本不要这样做,普通的块在现代是一种诅咒。

答案 5 :(得分:0)

看起来很奇怪,这可能是一个像应该使用bitfield的地方。

他有一块硬件,可能有各种控制寄存器和状态标志,映射到一些固定的内存地址。

具有正确布局的位字段的结构(特定于编译器), 使用指向正确地址的那种类型的指针可以做到这一点。

由于场地值可能会在没有通知的情况下发生变化,因此可能需要使用违规物品。

如果提问者提供有关公共区块布局的更多信息,将会有所帮助, 以及对其中数据的解释。