我必须将 Fortran 程序翻译成 C++,并且 Fortran 程序包括一个包含许多行的头文件,如下所示:
这里 NX、NY 和 NZ 是整数我不知道这些行是做什么的
COMMON/TDD/IDONE(NX,NY,NZ),IDTWO(NX,NY,NZ),IDTHRE(NX,NY,NZ)
COMMON/ESCAT/EXS(NX,NY,NZ),EYS(NX,NY,NZ),EZS(NX,NY,NZ)
COMMON/HSCAT/HXS(NX,NY,NZ),HYS(NX,NY,NZ),HZS(NX,NY,NZ)
问问题
213 次
1 回答
2
这些行中的每一行都声明了一个公共块,这是一种在 Fortran 程序中的编译单元(或范围)之间共享变量的现在过时且已弃用的方法。
以第一个为例,行
COMMON/TDD/IDONE(NX,NY,NZ),IDTWO(NX,NY,NZ),IDTHRE(NX,NY,NZ)
声明了一个命名的公共块,该块调用TDD
了该行其余部分列出的变量。鉴于NX
,NY
和NZ
是整数,IDONE
, IDTWO
, 和IDTHRE
都是 rank-3 数组。
包含定义公共块的行的所有编译单元都可以访问公共块和其中命名的变量。您可能想知道为什么在编译单元中包含公共块时必须列出变量名称。这是因为在公共块中重命名变量是合法的,这样同一个变量在一个范围内具有一个名称,而在另一个范围内具有另一个名称。您可能想留意一条线,例如
COMMON/TDD/ENODI(NX,NY,NZ),IDTWO(NX,NY,NZ),IDTHRE(NX,NY,NZ)
这意味着IDONE
在一个范围内调用的变量在另一个范围内被调用ENODI
。
更有趣的是,可以使用通用块来完全重新定义变量。想象一个常见的块声明,例如
COMMON/BADEX/X,Y,Z
其中X
, Y
, 和Z
都是实数,然后是(重新)声明
COMMON/BADEX/CMPL,Z
whereCMPL
被声明为复变量,允许您识别CMPL
withX
和的实部和虚部Y
。
现在不推荐使用公共块的原因之一是因为它们向编译器规定了内存中变量的布局,本质上是公共块中的变量应该按照指定的顺序彼此相邻布置。正是这种存储关联支持通过使用公共块来重命名和重新声明变量。
于 2013-06-25T16:59:56.607 回答