我有一个Fortran 77应用程序,它使用Common声明来“共享”内存变量。回到白天,当记忆力昂贵且很难得到时,这就是它的方法。
受控设备设置状态标志。这些标志位于这些公共变量中。
有关如何在c ++中实现通用功能的任何建议吗?
一个类,或许,所有常见变量都是公共的。因此,任何实例化该类的程序都可以访问Common变量的内容。
是否有将Fortran转换为C或C ++的教程/指南?
由于
答案 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的地方。
他有一块硬件,可能有各种控制寄存器和状态标志,映射到一些固定的内存地址。
具有正确布局的位字段的结构(特定于编译器), 使用指向正确地址的那种类型的指针可以做到这一点。
由于场地值可能会在没有通知的情况下发生变化,因此可能需要使用违规物品。
如果提问者提供有关公共区块布局的更多信息,将会有所帮助, 以及对其中数据的解释。