2

我带着沉重的 C 背景进入 FORTRAN。这一切都非常简单,除了COMMON块如何工作的实际机制让我感到困惑,而且我找不到任何详细描述它们的地方。

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

COMMON/MYBLOCK/ A,B,C

据我了解,这将留出一块内存,其中包含三个...事物,这些事物与块中的名称并没有真正关联,实际上如果如果稍后在我的源代码中有下一个代码:

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

那么现在 X 与以前在 A 中的任何东西相关联,同样的 Y 与 B 和 Z 与 C 相关联。

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

很奇怪,FORTRAN 在其他任何地方都是一种强类型语言,但是COMMON块就像“做任何你想做的事,伙计,我们不在这里做类型”......

4

1 回答 1

3

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

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

它不是用于类型双关语的。人们可能不会将相同的内存位置引用为不同的类型。它应始终作为单一类型访问。仅当您分开使用时,您才能使用与不同类型相同的内存位置。您不能写入实数并读取整数。

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

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

于 2020-03-24T18:27:03.420 回答