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
声明和保存属性上的Fortran赋值已获取_Fortran - Fatal编程技术网

声明和保存属性上的Fortran赋值已获取

声明和保存属性上的Fortran赋值已获取,fortran,Fortran,在fortran 95中,如果在声明时指定变量 integer :: var = 0 相当于 integer, save :: var = 0 因此,该变量在例程执行后被保留(相当于C语言中的static),并且在再次调用时不会重新初始化。这种(危险的)行为背后的基本原理/技术问题是什么?我不认为这种行为背后有什么基本原理 但据我所知,斯蒂法诺,你用错了术语。代码中没有赋值语句,只有使用初始化表达式(0)初始化变量(var) 看来这只是委员会的设计决定。如果我们有这样的表达式(在类型声明语句

在fortran 95中,如果在声明时指定变量

integer :: var = 0
相当于

integer, save :: var = 0

因此,该变量在例程执行后被保留(相当于C语言中的
static
),并且在再次调用时不会重新初始化。这种(危险的)行为背后的基本原理/技术问题是什么?

我不认为这种行为背后有什么基本原理

但据我所知,斯蒂法诺,你用错了术语。代码中没有赋值语句,只有使用初始化表达式(0)初始化变量(var)

看来这只是委员会的设计决定。如果我们有这样的表达式(在类型声明语句中使用等号),则它是初始化而不是赋值。在程序(而不是过程)执行期间,初始化只发生一次

然而,这一决定可能有一些历史原因。看一看线程


今天,这种行为是危险的,因为许多其他广泛使用的语言遵循另一种关于初始化/赋值的约定。

许多旧FORTRAN 77和早期编译器静态分配所有变量。许多程序员依赖于这种行为——从技术上讲,这是他们程序中的一个错误,因为除非他们在声明中使用“SAVE”限定符(或在每个过程中添加一个普通SAVE语句),否则变量的值在重新进入过程时是未定义的。但是,由于在那些日子里,程序往往与特定的平台和编译器绑定多年,程序员没有受到影响。在将传统FORTRAN 77代码移植到现代FORTRAN>=90编译器时,这是一个非常常见的“问题”。大多数编译器提供编译时开关来恢复此行为,例如gfortran的fno automatic选项。委员会很可能认为声明中初始化的变量很可能需要SAVE属性——在我看来,这是一个合理的设计决策。我认为与其他语言最大的不同,也是最容易让多语言程序员感到困惑的是,初始化只进行了一次。

为了完整起见,让我提一下,在Fortran 2003标准中,您提到的一点在C1107中有介绍:“如果指定了组件初始化类型的对象(R444)出现在模块的规范部分,没有可分配或指针属性,对象应该有SAVE属性。“@Alexandros Gezerlis-对,但他问“为什么”他们这样做,现在我理解了他的问题,我也有同样的问题:)。我知道,这就是为什么我没有将此作为答案发布。如果这是一个经过深思熟虑的设计决策,我是否应该发布一个问题:“什么是Fortran委员会成员在决策会议期间允许吸烟?”:)认真地。我不认为他们把事情搞砸了,所以一定有原因,可能是源于兼容性或技术问题。这似乎太奇怪了,不可能是为了它本身的设计而做出的决定。@Stefano:也可能有一些历史原因和不吸烟。=)读这篇文章:我想你刚刚说到点子上了!请编辑您的答案以包含该链接。该链接现在已断开。这篇文章的要点是什么?Fortran 77标准没有规定是否会进行重新初始化。我使用这两种编译器;没有保存的初始化实践是不可移植的。我记得看到过一个声明,委员会认为单独的赋值显然会处理重新初始化的情况,并允许在不影响结果的情况下应用或删除SAVE限定符,而initialize once行为不会干净地与标准中的其他选择一起实现。
integer :: var = 0 ! type declaration & initialization

integer :: var ! type declaration
var = 0        ! assignment