Initialization Fortran公共块初始化
Fortran新手在这里,我被要求使用Salford/Silverfrost编译器,使用Fortran 77编写一个旧的Fortran代码库(最初的开发人员去世了) 原始开发人员广泛使用命名的Initialization Fortran公共块初始化,initialization,fortran,fortran-common-block,Initialization,Fortran,Fortran Common Block,Fortran新手在这里,我被要求使用Salford/Silverfrost编译器,使用Fortran 77编写一个旧的Fortran代码库(最初的开发人员去世了) 原始开发人员广泛使用命名的COMMON块(用于模拟全局变量,AFAIU),并在需要时使用EQUIVALENCE来(重新)初始化块,如此代码段中所示: IMPLICIT REAL*8 (A-H,O-Z) COMMON/COMMF2D/ * ASCN(0:99,0:20,0:4) *,
COMMON
块(用于模拟全局变量,AFAIU),并在需要时使用EQUIVALENCE
来(重新)初始化块,如此代码段中所示:
IMPLICIT REAL*8 (A-H,O-Z)
COMMON/COMMF2D/
* ASCN(0:99,0:20,0:4)
*,FEMPTY2(8700)
DIMENSION KLCKF2D(38400)
EQUIVALENCE (KLCKF2D,ASCN)
DO I= 1,38400
KLCKF2D(I)= 0
END DO
这是一种可接受的编程实践还是仅仅是一种黑客行为?另外,由于我正在尝试将代码移植到GFortran,它是否可移植?(我知道像
REAL*8
这样的声明只是对编译器的提示,不能保证)等价性
没有任何作用,它肯定不会初始化任何东西,等价性
是一种定义或声明。如今(以及自Fortran 90标准发布以来,其影响力一直在增长)等价性是一种攻击,应该尽可能避免
该语句声明两个变量共享存储(Fortran标准称之为存储关联)。对此的一种解释是,等价的名称只是别名,但是(ab-)语句的使用允许程序员做一些被21世纪的专业软件工程师认为是不可靠的其他事情
例如,这适用于您发布的代码段,EQUIVALENCE
可用于让不同类型的变量共享同一存储。您有一个名为ASCN
的数组,它(隐式地)是REAL*8
类型,相当于一个名为KLCKF2D
的数组,它(同样隐式地)是INTEGER
类型。这意味着,如果在一个名称下引用存储器,则位模式将被解释为REAL
s,使用另一个名称,它们是INTEGER
s——请注意,值为100.0
的实数的位模式(当然)将不会被解释为整数100
黑客还不止于此。COMMON
块声明的一个效果是将变量放在内存中,在您的例子中,ASCN
的10500(=100*21*5)
元素之后是FEMPTY2
的8700
元素。通过一点乘法和加法,您会发现38400=2*(10500+8700)
,这与此程序中默认的整数大小4字节一致,即其他变量中使用的REAL*8
s大小的一半。因此数组KLCKF2D
比ASCN
大,但是原始程序员知道下一个17400
字节将被FEMPTY2
占用
因此,是的,这可能是一种将程序内存数据中该部分的所有位设置为0
,但这(现在被认为)是一种可怕的黑客行为。但是它应该是可移植的——连续的Fortran标准对于从语言和编译器编写器中删除过时的功能非常保守——更重要的是,向后兼容性对Fortran程序员非常重要
哦,为了回答你的问题,是的,COMMON
块(注意过去时态)是FORTRAN77声明和使用全局变量的方式。如今,该语言提供了更安全的选项,通过将变量包装在模块
和使用
——关联它们,来声明要在全球共享的变量
看到这样的一行我不会感到惊讶
COMMON/COMMF2D/KLCKF2D(38400)
在代码中,COMMON
块也可以(ab-)用于重命名和重新键入存储位置
虽然我对您的旧代码进行了抨击,但隐式键入现在也不受欢迎,显式键入所有声明要好得多。等价性
没有任何作用,它肯定不会初始化任何东西,等价性
是一种定义或声明。如今(以及自Fortran 90标准发布以来,其影响力一直在增长)等价性是一种攻击,应该尽可能避免
该语句声明两个变量共享存储(Fortran标准称之为存储关联)。对此的一种解释是,等价的名称只是别名,但是(ab-)语句的使用允许程序员做一些被21世纪的专业软件工程师认为是不可靠的其他事情
例如,这适用于您发布的代码段,EQUIVALENCE
可用于让不同类型的变量共享同一存储。您有一个名为ASCN
的数组,它(隐式地)是REAL*8
类型,相当于一个名为KLCKF2D
的数组,它(同样隐式地)是INTEGER
类型。这意味着,如果在一个名称下引用存储器,则位模式将被解释为REAL
s,使用另一个名称,它们是INTEGER
s——请注意,值为100.0
的实数的位模式(当然)将不会被解释为整数100
黑客还不止于此。COMMON
块声明的一个效果是将变量放在内存中,在您的例子中,ASCN
的10500(=100*21*5)
元素之后是FEMPTY2
的8700
元素。通过一点乘法和加法,您会发现38400=2*(10500+8700)
,这与此程序中默认的整数大小4字节一致,即其他变量中使用的REAL*8
s大小的一半。因此数组KLCKF2D
比ASCN
大,但是原始程序员知道下一个17400
字节将被FEMPTY2
占用
所以是的,这可能是一种sett方法