C++语言中的 FORTRAN 等效性

FORTRAN EQUIVALENCE in C++ language

本文关键字:FORTRAN 语言 C++      更新时间:2023-10-16

我正在将 FORTRAN 77 代码的一部分转换为C++

DIMENSION ARRAY(513),JRRAY(2,513)
EQUIVALENCE (ARRAY(1),JRRAY(1,1))
这是隐式

代码,其中每个以 I,J,K,L,M,N,O,P 开头的变量名称都隐式地作为整数类型。因此,这里我们有一个名为 ARRAY 的双精度数组和一个名为 JRREY 的整数数组。

等效语句将两个数组的开头指向同一内存位置。然而,不知何故,当调用 ARRAY(I( 时,字节被不同地解释为双精度或当调用 JRRAY(I,J( 时被解释为整数(至少我认为会发生什么(。

C++中是否有类似的方法可以将相同的内存位置解释为不同的类型?

或者与 FORTRAN 中的 EQUIVALENCE 相同,但在 C++ 中

类似的特征是union

union {
    double array[513];
    int jrray[513][2];
} equiv;

然后,您可以访问equiv.array[i]equiv.jrray[i][j]

但请注意,访问与上次写入的联合成员不同的成员会导致C++中出现未定义的行为。请参阅联合和类型双关语。如果要将数据重新解释为不同的数据类型,则应使用 reinterpret_cast<> ,而不是类型双关语。

C union通常用于此目的,如 Barmar 的答案。但是,您可以使用类型强制转换将浮点数组引用为整数数组。

请考虑以下array声明和jrray定义:

double array[513];
int (*jrray)[2] = reinterpret_cast<int (*)[2]>(array);

例如,我们可以通过查看指数来检查此声明是否按预期工作。我们将在 20-30 位中有 array[k] 的指数 jrray[k][1].

例如,检查我们现在是否将数组的元素初始化为

array[0] = 1.23*2; // exponent is 1
array[1] = 1.23*4; // exponent is 2
array[2] = 1.23*8; // exponent is 3

我们将有

((jrray[0][1] >> 20) & 0x7FF) - 1023 == 1
((jrray[1][1] >> 20) & 0x7FF) - 1023 == 2
((jrray[2][1] >> 20) & 0x7FF) - 1023 == 3

无论哪种方式C++这都违反了严格的别名规则,并可能导致未定义的行为。