我在接触 Fortran 时有着深厚的 C 背景。这一切都非常简单,除了常见 block 如何工作的实际机制让我感到困惑,而且我找不到任何详细描述它们的地方。
假设我有以下公共(public) block :
COMMON/MYBLOCK/ A,B,C
据我了解,这将预留一 block 内存,其中包含三个...东西,这些东西与 block 中的名称并不真正相关,事实上,如果如果稍后在我的源代码中包含下一个代码:
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 在其他地方都是一种强类型语言,但常见的 block 就像“做你想做的事,伙计,我们在这里不做类型”...
最佳答案
您不应混淆标准语言允许您执行的操作、现有编译器中可以使用的操作以及人们在各种遗留代码中使用的操作。
公共(public) block 是静态存储的地方,可以从各种编译单元访问。使用公共(public) block 名称和公共(public) block 内变量的位置(偏移量)来访问存储在那里的变量。
公共(public) block 是否最终位于.data 段.bss 段中是特定平台的实现细节。但实际上,在当今常见的平台上,公共(public) block 将出现在其中之一中。
这里不是为了类型双关。不同类型可能不会引用相同的内存位置。它应始终作为单一类型进行访问。仅当您分开使用时,您才可以将相同的内存位置用作不同类型。您无法写入实数并读取整数。
存储在公共(public) block 中的变量当然有一个类型。该类型可以显式声明或使用隐式类型规则确定。
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
语句强加了不同的隐式类型规则。
关于memory - Fortran 公共(public) block 的内存中实际发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60836176/