在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值的整个要点是,您可以修改参数,并且不会更改调用代码的参数。