我正在将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 ++中。
答案 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 ++严格别名规则,并可能导致未定义的行为。