在Fortran 95中按值传递参数

在Fortran 95中按值传递参数,fortran,parameter-passing,fortran95,Fortran,Parameter Passing,Fortran95,调用函数参数时,如何在不创建新变量的情况下保持其值?这就是,如何通过值传递参数 在此示例代码中: program what integer :: a,b,c,d a=1 b=2 c=3 print *, a,b,c d=f(val(a),val(b),val(c)) print *, d print *, a,b,c d=f(a,b,c) print *, d contains function f(x,y,z) result(h) integer:: x,y,z int

调用函数参数时,如何在不创建新变量的情况下保持其值?这就是,如何通过值传递参数

在此示例代码中:

program what


integer :: a,b,c,d

a=1
b=2
c=3

print *, a,b,c

d=f(val(a),val(b),val(c))

print *, d

print *, a,b,c

d=f(a,b,c)

print *, d

contains

function f(x,y,z) result(h)

integer:: x,y,z
integer :: h

h=x+y+z

x=0
y=0
z=0

end function



end program

当我第二次调用该函数时,它只打印0。

在Fortran 95中,没有办法。除了一些非常非标准的扩展,但它们不是Fortran 95,也不是任何其他Fortran,只是扩展

在Fortran 2003中,使用
属性

function f(x,y,z) result(h)

integer, value :: x,y,z

属性需要显式接口,但您的示例中有它,所以这没问题。

顺便说一句,请在代码中使用一些缩进。在这里,这并不重要,但它将使您的代码更具可读性。通常我会尝试,但这段代码只是为了测试我的怀疑,所以我没有花太多精力;感谢您的建议:)在引入值(在调用方)和意图(在被调用方)规范之前,可以在函数调用中传递(x)、(y)、(z),以避免函数中的赋值返回给调用方。对于iso_c_绑定生效的情况,也有一个值规范,这是不同的(与c按值调用兼容)。@tim18此时不允许修改它,这在这里是至关重要的。是的,这些选择中的一些必须或应该抱怨或阻止修改,但在这种情况下修改参数似乎是不好的做法。修改传递值参数并没有什么不好的。这就是它的全部意义。@Holmz不,它们不是任何意图,它们是价值。实际上,可以将意图(IN)与值结合起来,但默认情况下,它不是任何意图,而是值。od pass by值的整个要点是,您可以修改参数,并且不会更改调用代码的参数。