FORTRAN 公共块的内存中实际发生了什么?

What is actually happening in memory in FORTRAN common blocks?

我在学习 FORTRAN 时有很深的 C 语言背景。这一切都非常简单,除了 COMMON 块如何工作的实际机制让我感到困惑,我找不到任何地方详细描述它们。

假设我在 FORTRAN 中有以下 COMMON 块。

COMMON/MYBLOCK/ A,B,C

据我所知,这将留出一块内存,其中包含三个...东西,它们与块中的名称并没有真正关联,实际上如果稍后有下一个代码我的消息来源:

SUBROUTINE MYSUB(...)
...
COMMON/MYBLOCK/ X,Y,Z
...
END 

那么现在 X 与 A 中曾经存在的任何内容相关联,同样的 Y 与 B 和 Z 与 C 相关联。

所以这意味着 COMMON/MYBLOCK/ 是...声明时的空指针数组?这些指针中的任何一个都没有关联的类型,所以...在分配值时分配内存?如果我在主线程中说 A='A',然后在 MYSUB 中说 A=3.141592,会发生什么情况?如果我有一个子例程,我想通过引用将一个值 return 转换为 A (因为它是外部库的一部分),我可以只说 CALL MYSUB2(A) 并指望编译器进行排序吗出来?还是我需要先在局部变量上调用 MYSUB2,然后将其分配给 A

很奇怪,FORTRAN 在其他地方都是强类型语言,但是 COMMON 块就像 "do whatever you want, man, we don't do types here"...

你不应该混淆标准语言允许你做什么,你可以在现有编译器中逃脱什么,以及人们在各种遗留代码中使用什么。

公共块是一个静态存储空间,可以从各种编译单元访问。使用公共块名称和变量在公共块内的位置(偏移量)访问存储在那里的变量。

这里不是用来打字的。一个人可能不会引用相同的内存位置作为不同的类型。它应始终作为单一类型访问。仅当您分开使用时,您才能使用与不同类型相同的内存位置。您不能写入实数并读取整数。

存储在公共块中的变量当然有类型。类型可以显式声明或使用隐式类型规则确定。

 IMPLICIT NONE

 COMMON /BLOCK1/ A, B, C

 END

会给你

> gfortran common.f90 
common.f90:3:18:

  COMMON /BLOCK1/ A, B, C
                  1
Error: Symbol ‘a’ at (1) has no IMPLICIT type
common.f90:3:21:

  COMMON /BLOCK1/ A, B, C
                     1
Error: Symbol ‘b’ at (1) has no IMPLICIT type
common.f90:3:24:

  COMMON /BLOCK1/ A, B, C
                        1
Error: Symbol ‘c’ at (1) has no IMPLICIT type

并且您必须明确声明变量的类型。

从您的代码中看不到更多内容,我们必须得出结论,根据隐式类型规则,您的变量属于 real 类型,除非显式 IMPLICIT 语句强加了不同的隐式类型规则。