【问题标题】:Are local variables in Fortran 77 static or stack dynamic?Fortran 77 中的局部变量是静态的还是堆栈动态的?
【发布时间】:2011-02-04 15:51:34
【问题描述】:

对于我的编程语言类,第一个硬件问题是:

FORTRAN 中的局部变量是静态的还是堆栈动态的?初始化为默认值的局部变量是静态的还是堆栈动态的?给我看一些带有解释的代码来支持你的答案。提示:检查这一点的最简单方法是让您的程序测试子程序的历史敏感性。看看当你将局部变量初始化为一个值时会发生什么,而当你没有初始化时会发生什么。您可能需要调用多个子程序才能自信地锁定答案。

我写了几个子程序: - 创建一个变量 - 打印变量 - 将变量初始化为一个值 - 再次打印变量

对子例程的每次连续调用都会在变量未初始化时打印出相同的随机值,然后打印出初始化值。

变量未初始化时这个随机值是多少?

这是否意味着 Fortran 对子例程的每次调用都使用相同的内存位置,还是它动态地创建空间并随机初始化变量?

我的第二个子例程也创建了一个变量,但随后调用了第一个子例程。结果是一样的,只是打印的未初始化变量的随机数不同。我很迷茫。请帮忙!

非常感谢。

【问题讨论】:

  • 在哪里教fortran?
  • 语言不是直接教授的。它只是编程语言课程的一部分。它更多地是关于学习编程语言结构并使用像 Fortran 77 这样的旧语言真的很重要。我们的课程主要围绕 Java。

标签: dynamic variables static scope fortran


【解决方案1】:

在 Fortran 77 和 90/95/2003 中,如果您希望在子程序调用中保留子程序本地变量的值,您应该将其声明为“保存”属性,例如,(使用 Fortran 90 样式):

integer, save :: counter

integer :: counter
save :: counter

。 或者,如果您希望将“保存”行为应用于所有变量,只需在子例程中包含一个简单的

save

没有任何变量的语句。 在 Fortran 90 中,声明中的变量初始化,

integer :: counter = 0

自动获取保存属性。我认为 Fortran 77 中不是这种情况。

这是一个实验可能会产生误导的领域——它们会告诉您特定编译器的功能,但可能不会告诉您 Fortran 77 语言标准是什么,也可能不会告诉您其他编译器做了什么。许多旧的 Fortran 77 编译器没有将局部变量放在堆栈上,并且所有变量都隐含地具有 save 属性,而编程没有使用该声明。例如,流行的 DEC Fortran 编译器就是这种情况。仅与这种类型的特定编译器一起使用的遗留 Fortran 77 程序在现代编译器中出现故障是很常见的,因为程序员忘记对需要它的变量使用 save 属性。最初这并没有引起问题,因为所有变量都有效地具有 save 属性。大多数现代编译器将局部变量放置在堆栈上而不保存,并且这些程序经常发生故障,因为一些需要“保存”的变量在子程序调用中“忘记”了它们的值。这可以通过识别问题变量并添加保存(工作)、向每个子例程添加保存语句(减少工作)来解决,或者许多编译器有一个选项(例如,gfortran 中的 -fno-automatic)来恢复旧行为(容易)。

这似乎是一个特殊的问题——您不会找到有关“Fortran 77”的信息,而是有关特定编译器的信息。为什么使用 Fortran 77 而不是 Fortran 95/2003?教授吗?认为 Fortran 在 1977 年就停止了?

【讨论】:

  • 补充我的答案和高性能标记:您正在探索的是“未定义”——当您在第二次调用子例程时检查没有保存属性的局部变量的值时,没有重新初始化该变量,您违反了语言标准并且行为未定义。任何事情都可能发生,这取决于特定编译器的实现。如果变量在堆栈上,您将看到一些“随机”值。如果它们被放置在一个固定的内存位置,你会看到之前的值。
【解决方案2】:

放大@MSB 所做的一点;

Fortran 标准不会告诉编译器编写者如何实现这些标准,它们关注的是程序员可见的程序行为。所以这个问题的答案是“这一切都取决于编译器”。并且 OP 并没有告诉我们他正在使用哪个编译器。

此外,如果您穿越时光的迷雾来检查所有曾经编写过的 FORTRAN77 编译器,我相信您会发现您感兴趣的功能的各种不同实现,其中许多与相当深奥的硬件架构。

【讨论】:

    猜你喜欢
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2012-05-25
    • 2013-01-10
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多