我要将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)
答案 0 :(得分: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
其中CMPL
被声明为复杂变量,允许您使用CMPL
和X
来识别Y
的实部和虚部。
现在不推荐使用公共块的原因之一是因为它们向编译器指示内存中变量的布局,主要是公共块中的变量应按指定的顺序相互布置。正是这个存储关联支持通过使用公共块重命名和重新声明变量。