C++语言中的 FORTRAN 等效性
FORTRAN EQUIVALENCE in C++ language
我正在将 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++这都违反了严格的别名规则,并可能导致未定义的行为。
相关文章:
- 不同语言中相同代码的不同行为
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- r语言 - C++ 类型为"const std ::?
- 通用C++/Python 多语言的存在
- 使用 VS2015 在 Windows 10 上构建 Fortran .lib x64 位并将其链接到 C++
- 为什么我的 EnumWindowProc 不能用 C 语言编译?
- 了解算法的性能差异(如果以不同的编程语言实现)
- Rextester 语言编译C++问题
- 如何将多种语言设置放在单个 .clang 格式文件中
- 不同语言中的模运算符差异
- 刚接触C++,难以理解语言的细微差别
- 为什么开发人员将C / C ++用于嵌入式系统,而不是像Python这样的高级语言与C相比?
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 将 OR 逻辑运算符从 C++ 转换为 Fortran
- 我的C++语言蛮力算法有问题
- 如何将C++17 stdc++fs库链接到混合语言(C++和Fortran)CMake项目
- C++语言中的 FORTRAN 等效性
- 从 fortran 写出二进制文件并读取 C 语言
- 如何在C语言中以函数作为参数调用Fortran dll
- 是否有这么好的C编译器使得fortran成为一种多余的语言?