COMMON
块中变量的顺序很重要,更改顺序后会发生坏事。在使用公共块的任何地方都应该是相同的,包括在 C++ 程序中。无关紧要的是这些变量的名称。例如,在一个子程序中,您可以:
double precision a, b
common /block1/ a, b
在另一个子程序中,您可以:
double precision c, d
common /block1/ c, d
仍然a
并且c
将共享相同的内存位置。这同样适用于b
和d
。这可能会导致混淆,通常的做法是将变量和公共块声明放在一个文件中,该文件include
由每个使用特定公共块的子例程 -d ,就像在您的情况下所做的那样。现在,如果您更改任何公共块中的某些内容,所有子例程都会看到它发生了变化,并且一切都会按预期工作。
问题是您还必须更改相应的 C 结构以使其与更改后的公共块相对应。例如
double precision a, b
common /block1/ a, b
在 C 中对应于:
struct common_block1
{
double a;
double b;
};
extern struct common_block1 block1_;
(注意:不支持bind(C)
属性的较旧的 Fortran 编译器在每个导出的标识符的末尾加上下划线,因此在 C/C++ 中,您必须引用block1
as block1_
)
如果将公共块更改为:
integer a
double precision b, c
common /block1/ a, b, c
您还应该将 C 结构更改为:
struct common_block1
{
int a;
double b;
double c;
};
给定 C 和 Fortran 编译器的所有内容都使用相同的内存对齐规则。对齐通常可以通过编译器选项 (C/C++/Fortran) 和类型属性 (C/C++) 来控制。使用ISO_C_BINDING
Fortran 模块可以保证在 Fortran 和 C 中使用相同存储大小的类型种类。建议您首先将最大的对象(例如数组、(DOUBLE) COMPLEX
变量、DOUBLE PRECISION
变量等)放在公共块的开头,然后是较小的对象等等。