COMMON块共享变量

时间:2016-04-12 10:29:32

标签: fortran fortran-common-block

假设我有两个子程序

  SUBROUTINE S2909                                                    
  COMMON X,Y
  X =2;
  Y =3;
  END

  SUBROUTINE S2900                                                    
  COMMON X,Y
   //display X and Y 
  END

COMMON块用于共享变量,这是否意味着子例程X中更新的YS2909的值与子例程{{1}中的值相同}}?

2 个答案:

答案 0 :(得分:1)

根据我的理解,是的,变量在整个程序中共享。它们的值取决于子程序的调用顺序。

以下计划

program test
real x,y
common x,y

x = 1
y = 2

write(*,*) x,y
call changevals
write(*,*) x,y

end program test


subroutine changevals
real x,y
common x,y

x = 12
y = 13

end subroutine changevals

输出

1.00000 2.00000
12.00000 13.00000

答案 1 :(得分:1)

这种共享确实是常见块的重点。特别是,common语句允许整个程序中各种实体之间的所谓存储关联

因此,子例程X中的实体YS2909是与子例程{{1}中的实体XY相关联的存储}。对一个实体S2900中的值的更改将由另一个实体X反映。

但是有一些值得注意的事情。

在问题的X语句中,这依赖于所谓的空白常用。当没有为公共块指定名称时会发生这种情况,例如在语句

common

这是值得注意的,因为尝试将此问题中的行为概括为named common blocks may be troublesome

引用公共块的各个位置中的实体不是按名称关联,而是按存储顺序中的顺序关联。这意味着必须谨慎使用

common /named/ x, y

但我的回答确实有两点要做,而上面只是一个序言,使其更像答案。

首先,我会提到一个我不希望在野外看到的病态病例。

问题在于依赖隐式输入。请考虑以下

SUBROUTINE S2909
COMMON X,Y
END

SUBROUTINE S2900
COMMON Y,X
END

这是一个不文明代码编写的例子,但它说明了一件重要的事情。由于子例程subroutine S2909 common x, y x = 2. y = 3. end subroutine S2909 implicit integer (a-z) call S2909 call S2900 contains subroutine S2900 common x, y print*, x, y end subroutine end 中的xS2909中的实体x具有不同的类型,因此定义其中一个实体会导致另一个未定义。即:更新一个值不会更新另一个的值。使用显式类型,可以看到相同的内容,或者是否存在使用默认规则和实体S2900i的隐式类型,例如,在一个子例程中。

我想说的最后一件事是:much better ways of sharing data "globally" without common blocks