C ++语言中的FORTRAN EQUIVALENCE

时间:2017-05-23 20:14:14

标签: c++ fortran equivalence

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

DIMENSION ARRAY(513),JRRAY(2,513)
EQUIVALENCE (ARRAY(1),JRRAY(1,1))

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

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

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

或者与FORTRAN中的EQUIVALENCE相同的东西,但是在C ++中。

2 个答案:

答案 0 :(得分:5)

类似的功能是union

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

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

但请注意,访问联合的不同成员而不是上次写入的成员会导致C ++中出现未定义的行为。见Unions and type-punning。如果要将数据重新解释为不同的数据类型,则应使用reinterpret_cast<>,而不是输入惩罚。

答案 1 :(得分:1)

C union通常用于此目的,如Barmar的answer。然而,您可以使用类型转换将浮点数组引用为整数数组。

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

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

我们可以通过查看指数来检查此声明是否按预期工作。我们将在array[k]的位20-30中指定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 ++严格别名规则,并可能导致未定义的行为。