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



我是带着浓重的C背景来学习Fortran的。这一切都很简单,除了常见块如何工作的实际机制让我感到困惑,而且我找不到任何地方详细描述它们。

假设我有以下公共块:

COMMON/MYBLOCK/ A,B,C

据我所知,这将留出一块内存,其中包含三个。。。与块中的名称没有真正关联的东西,事实上,如果if稍后在我的源代码中有下一个代码:

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

现在,X与过去在A中的任何东西相关联,Y与B相关联,Z与C相关联。

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

奇怪的是,Fortran在其他地方都是一种强类型语言,但常见的块就像"你想做什么就做什么,伙计,我们这里不做打字;。。。

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

公共块是静态存储的位置,可以从各种编译单元

访问这些存储公共块是否最终位于.data段.bss段是特定平台的实现细节。但在今天常见的平台上的实践中,常见的块将出现在其中一个平台上。

这里不是用来打字双关语的。可以不将同一存储器位置引用为不同类型。应始终将其作为单一类型进行访问。只有分开使用,才能将相同的内存位置用作不同类型的内存。你不能写实数,也不能读整数。

存储在公共块中的变量肯定有一个类型。该类型可以显式声明,也可以使用隐式类型规则来确定

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 /BLOCK1/ A(3)

相当于

COMMON /BLOCK1/ A, B, C

COMMON /BLOCK1/ X, Y, Z

并且编译器也可以接受

COMMON /BLOCK1/ A, B, I1, I2

其中使用隐式实数和整数类型。

当命名块在同一子例程中被引用不止一次时,可能会出现额外的混乱,但这只是变量列表的延续。请参阅英特尔Fortran编译器指南参考资料。

相关内容

最新更新