2014-12-04 216 views
1

在Nyhoff的Fortran书中, 51,声明变量可以通过“常量表达式”来初始化。然而,Nyhoff似乎没有说明一个常数表达式究竟是什么。Fortran中的变量初始化

问题1:变量是否可以由用户定义的函数初始化?例如:real :: myreal=myrealfunc(4.0)(这是可能的的变量由本征函数被初始化。)

问题2:这是不直接相关的问题1考虑的情况下,当主节目不use的特定模块,但其中一个子程序use这个模块。如果一个变量是这个模块的一部分,它是在主程序执行开始时初始化的,还是直到子程序(模块use)被调用?

参考文献(如果有的话)也有帮助。

回答

2

答案1:不,用户定义的函数不能初始化变量。 R505(在我面前的Fortran 2008草案标准中)指出,变量只能由常数表达式初始化。同一文件的段落7.1.12.1定义了恒定表达式并且包括词语它是其中每个操作是固有的表达式

答案2:use -d变量只能在use -d的范围内访问。实际初始化时,这是一个有争议的问题。我怀疑它是依赖于处理器的(因为该术语在标准的第1.3.114条中定义)。

我还怀疑编译器会在程序启动时初始化。尽管标准并不要求它,但几乎没有提示它,初始化表达式实际上可能是编译器可以计算的。我想你可以通过检查初始化一个大变量的程序的内存消耗来找出处​​理器的行为。当变量不在范围内时,您将无法简单地打印或以其他方式检查变量。

当然,初始化的变量会获得save属性,这意味着它们的值将在其封闭范围的调用中保存。

标准中的引用来验证此答案,现在就逃脱我。

+0

对于1:谢谢。我习惯于MATLAB类,它们允许您使用用户定义的函数来初始化类变量。所以对于Fortran我想我会创建一个独立的setter函数来调用来设置模块变量的值。对于2:是的,考虑到Q1的答案,当这些变量初始化并且Q2现在没有实际意义时,这并不重要。 – boxofchalk1 2014-12-05 17:25:09

+0

只是为了记录,因为这个问题是用fortran90标记的,所以我应该提到引用的材料也出现在Fortran 90标准中,并且gfortran(我使用的编译器)完全符合标准。 – boxofchalk1 2014-12-05 17:32:12

2

对于第一个问题,我将采用与High Performance Mark's answer第7.1.12.1段相同的起点,但对其略有不同解释。我会得出同样的结论。

是的,在常量表达式中的每个操作都必须是内在的,但是对用户定义的函数的引用不是一个操作。相反,它是主要的,并且在该段落中包含允许的原色列表。

也就是说,从下面的子段落(4-8)中允许的主要事例中可以看出,每个函数的引用必须是一个内部函数。