Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Initialization Fortran公共块初始化_Initialization_Fortran_Fortran Common Block - Fatal编程技术网

Initialization 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) *,

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)   
     *,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方法