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
语句强加了不同的隐式类型规则。
我在学习 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
语句强加了不同的隐式类型规则。