Memory FORTRAN公共块中的内存中实际发生了什么?
我进入FORTRAN时有很重的C语言背景。除了Memory FORTRAN公共块中的内存中实际发生了什么?,memory,fortran,fortran-common-block,Memory,Fortran,Fortran Common Block,我进入FORTRAN时有很重的C语言背景。除了COMMON块如何工作的实际机制让我困惑之外,这一切都非常简单,我找不到任何地方详细描述它们 假设我有以下FORTRAN中的COMMON块 COMMON/MYBLOCK/ A,B,C 据我所知,这将留出一块内存,其中包含三个…东西,它们与块中的名称没有真正的关联,事实上,如果我的源代码后面有以下代码: SUBROUTINE MYSUB(...) ... COMMON/MYBLOCK/ X,Y,Z ... END 现在X与A中的任何东西相关联,Y
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
,会发生什么?如果我有一个子例程,我想通过引用将一个值返回到a
(因为它是外部库的一部分),我可以说调用MYSUB2(a)
,然后指望编译器对其进行排序吗?或者我需要先对局部变量调用MYSUB2
,然后将其分配给a
奇怪的是,FORTRAN在其他任何地方都是一种强类型语言,但是
COMMON
块就像“想做什么就做什么,伙计,我们这里不做类型”…你不应该混淆标准语言允许你做什么,你可以在现有编译器中得到什么,以及人们在各种遗留代码中使用什么
公共块是一个用于静态存储的位置,可以从各种编译单元访问它。使用公共块名称和公共块内变量的位置(偏移量)访问存储在其中的变量
这里不是用来打双关语的。不同的类型不能引用相同的内存位置。应始终将其作为单一类型进行访问。只有在区分使用情况的情况下,才能使用与不同类型相同的内存位置。不能写入实数而读取整数
存储在公共块中的变量肯定有一个类型。类型可以显式声明,也可以使用隐式类型规则确定。
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
语句强制使用不同的隐式类型规则。为什么要使用common?它们不应该在新代码中使用30年。如果你真的必须拥有全局状态,并且忘记你曾经见过的公共状态,那么就使用模块——这样你会睡得更好。或者你在看旧代码?你的意思是有一些C程序员在FORTRAN上工作,除了30年前遗留的代码?说真的,我到处都有COMMON
的旧遗留代码,我正试图了解它在幕后做什么。获取Fortran 2018标准工作草案的副本(搜索N2146.pdf)。请阅读关于存储关联的第8.10节。如果您的旧代码中包含大量的公共
块,那么它可能会使用等价
语句。在任何情况下,第8.10.2.1节从COMMON语句开始,指定了可由程序中的任何作用单元访问的物理存储块,称为COMMON块。因此,COMMON语句提供了一个基于存储关联的全局数据工具(19.5.3)。如果我跟踪发生的事情,我认为我正在查看的代码中的所有COMMON
块都被用来存储REAL
s或包含REAL
s的数组,那么隐式键入就足够了吗?搜索.f文件不会产生任何等价性
语句。编辑:没关系,那里也有一些I
s,所以int和real都有。尽管如此,所有的代码都是隐式类型,这仅仅是因为具有良好实践的现代代码不使用公共块。所以那些留下来的。。。它们通常都很古老。这并没有真正回答我的问题,但谷歌搜索告诉我,IMPLICIT NONE
基本上告诉Fortran不要根据名称将没有显式类型的所有内容默认为REAL
或INT
?因此,在我上面的代码中真正发生的是A
,B
和C
在没有IMPLICIT NONE
指令的情况下被实例化为REAL
s?不。如果没有IMPLICIT NONE
,隐式类型规则就会失效<代码>A、B
和C
是默认的实数类型变量。在今天的普通硬件上,每个都可能占用4个存储单元。我已经添加了一个关于普通块实际是什么的简要说明,但从您的问题来看,您似乎知道这一点,您只是想知道为什么这些变量:没有任何类型:,您在最后进行的编辑有帮助,因为粗体部分假设了太多关于我是否意识到隐式
存在或者它如何工作的机制的知识。摆在我面前的每一个例子(包括我正在处理的代码)都是使用隐式类型,而不是调用它。谢谢