Fortran 函数中的别名

发布于 2024-12-20 07:40:11 字数 311 浏览 1 评论 0原文

出于优化原因,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) ?

For optimisation reasons, Fortran enforces that the dummy arguments of a subroutine or function are not alias, i.e., they do not point the the same memory place.

I am wondering if the same constraint applies to the returned value of a function.
In other words, for a given myfunc function:

function myfunc(a)
    real, intent(in) :: a(:)
    real             :: myfunc(size(a))
    myfunc = a * 2
end function myfunc

is it standard-compliant to write:
a = myfunc(a)
and
b = myfunc(a) ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

谎言 2024-12-27 07:40:11

函数的参数和函数的返回值是不同的东西。与前面的答案相反,函数参数是通过引用或通过复制输入复制输出传递的,除非它们使用 VALUE 属性声明为虚拟参数。这是 Fortran 与 C 的主要区别。

但是,如果函数值是通过正常赋值 (=) 而不是通过指针赋值 (=>) 构造的,则它们是单独的实体。在您的代码中,myfunc 的值是通过复制 a 的值获得的。因此,a = myfunc(a)b = myfunc(a) 不会违反任何标准规则。

The arguments of a function and function return value are different things. Contrary the previous answer, the functional arguments ARE passed by reference, or by copy-in copy-out, unless they are declared as dummy arguments with the VALUE attribute. This is a major difference of Fortran vs. C.

However, if the function value is constructed by normal assignment (=) and not by pointer assignment (=>) they are separate entities. In your code, the value of myfunc is got by copying the value of a. Therefore no standard rules are broken by a = myfunc(a) or b = myfunc(a).

中二柚 2024-12-27 07:40:11

由于 myfunc 中的变量 a 是与从父例程作为虚拟参数传递的 a 分开的实体,因此完全可以这样做:

a = myfunc(a)

or

a = SQRT(a)

这里没有冲突,因为 a 的值被复制到内部的虚拟参数函数,函数被求值,最后函数的值被复制到a。

来自 Fortran 2008 标准草案:

12.5.3 函数参考

1 在表达式求值期间,函数由函数引用或定义的操作调用 (7.1.6)。
当它被调用时,所有实际参数表达式都会被计算,
然后将参数关联起来,然后执行函数。
当函数执行完成时,函数的值
结果可用于引发该函数的表达式
被调用。函数结果(12.3.3)的特征是
由函数的接口决定。如果引用一个
基本函数(12.8)是基本引用,所有数组
参数应具有相同的形状。

一般来说,最好强制函数不产生副作用,例如使用 PURE 属性并为所有虚拟参数声明 INTENT

Since the variable a in myfunc is a separate entity from a that is being passes as a dummy argument from the parent routine, it is perfectly fine to do:

a = myfunc(a)

or

a = SQRT(a)

There is no conflict here because value of a is being copied to the dummy argument inside the function, the function is being evaluated, and in the end the value of the function is being copied to a.

From Fortran 2008 Standard draft:

12.5.3 Function reference

1 A function is invoked during expression evaluation by a function-reference or by a defined operation (7.1.6).
When it is invoked, all actual argument expressions are evaluated,
then the arguments are associated, and then the function is executed.
When execution of the function is complete, the value of the function
result is available for use in the expression that caused the function
to be invoked. The characteristics of the function result (12.3.3) are
determined by the interface of the function. If a reference to an
elemental function (12.8) is an elemental reference, all array
arguments shall have the same shape.

In general, it is good practice to force functions to not have side-effects, e.g. use PURE attribute and declare INTENT for all dummy arguments.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文