2

假设我有两个子例程

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

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

COMMON 块用于共享变量,这是否意味着如果在子程序中更新的 ,X的值将与子程序中的相同?YS2909S2900

4

2 回答 2

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
于 2016-04-12T11:54:37.837 回答
1

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

因此,实体XY子程序是与实体和子程序S2909相关联的存储。一个实体中值的更改由另一个实体反映。XYS2900XX

不过,有几件事值得注意。

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

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

这是一个不文明的代码编写示例,但它说明了一件重要的事情。因为和子例程x中的实体属于不同类型,定义其中一个会导致另一个未定义。也就是说:更新一个的值不会更新另一个的值。使用显式键入可以看到相同的内容,或者如果使用默认规则和实体进行隐式键入,例如在一个子例程中。S2909xS2900ij

我想说的最后一件事是:没有公共块的“全球”共享数据有更好的方法

于 2016-04-12T13:12:50.913 回答