出于优化原因,Fortran强制子例程或函数的伪参数不是别名,即它们不指向相同的内存位置。
我想知道相同的约束是否适用于函数的返回值。 换句话说,对于给定的myfunc函数:
function myfunc(a)
real, intent(in) :: a(:)
real :: myfunc(size(a))
myfunc = a * 2
end function myfunc
是否符合标准: a = myfunc(a) 和 b = myfunc(a)?
答案 0 :(得分:3)
函数和函数返回值的参数是不同的东西。与前面的答案相反,函数参数ARE通过引用传递,或者通过copy-in copy-out传递,除非它们被声明为具有VALUE
属性的伪参数。这是Fortran与C的主要区别。
但是,如果函数值是通过正常赋值(=)而不是通过指针赋值(=>)构造的,则它们是单独的实体。在您的代码中,通过复制a的值来获取myfunc的值。因此,a = myfunc(a)
或b = myfunc(a)
不会破坏任何标准规则。
答案 1 :(得分:0)
由于myfunc中的变量a是与父例程中作为伪参数传递的单独实体,因此完全可以这样做:
a = myfunc(a)
或
a = SQRT(a)
这里没有冲突,因为a的值被复制到函数内部的伪参数,正在评估函数,最后函数的值被复制到。
来自Fortran 2008标准草案:
12.5.3功能参考
1在表达式评估期间,通过函数引用或定义的操作(7.1.6)调用函数。 调用它时,将评估所有实际的参数表达式, 然后关联参数,然后执行该函数。 当函数执行完成时,函数的值 结果可用于导致该函数的表达式 被调用。功能结果的特征(12.3.3)是 由功能界面决定。如果引用了 元素函数(12.8)是一个元素引用,所有数组 参数应具有相同的形状。
通常,强制功能不具有副作用是良好的做法,例如,使用PURE
属性并为所有伪参数声明INTENT
。