Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory FORTRAN公共块中的内存中实际发生了什么?_Memory_Fortran_Fortran Common Block - Fatal编程技术网

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

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

我进入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
,会发生什么?如果我有一个子例程,我想通过引用将一个值返回到
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个存储单元。我已经添加了一个关于普通块实际是什么的简要说明,但从您的问题来看,您似乎知道这一点,您只是想知道为什么这些变量:没有任何类型:,您在最后进行的编辑有帮助,因为粗体部分假设了太多关于我是否意识到
隐式
存在或者它如何工作的机制的知识。摆在我面前的每一个例子(包括我正在处理的代码)都是使用隐式类型,而不是调用它。谢谢