C++语言中的FORTRAN EQUIVALENCE

use*_*884 2 c++ fortran equivalence

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

DIMENSION ARRAY(513),JRRAY(2,513)
EQUIVALENCE (ARRAY(1),JRRAY(1,1))
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Bar*_*mar 5

类似的功能是union:

union {
    double array[513];
    int jrray[513][2];
} equiv;
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Quentin如果您访问的成员与您上次写入的成员不同,则只有UB.工会本身得到支持.我添加了另一个问题的链接,该问题解释了C和C++中类型惩罚的问题. (2认同)