Fortran中返回数组的函数

25

据我理解,在Fortran中可以从函数返回一个数组,但出于某种原因,我的代码只返回我要求它返回的数组的第一个值。以下是该函数:

function polynomialMult(npts,x,y)
    integer npts
    double precision x(npts), results(npts + 1), y(npts,npts)

    polynomialMult =  x(1:npts) + 1

end function

这就是我调用它的地方

 C(1:numPoints) = polynomialMult(numPoints,x,f)

print *, C(1:numPoints)`

现在它还没有执行任何有用的操作,因为我在编写逻辑之前试图理解语法。我看到有些关于为函数指定类型的东西,但是当我写

integer function polynomialMult(npts,x,y)

无论我做什么,都会出现编译错误。

2个回答

35

若要定义一个返回数组的函数,请将函数声明放置在函数内部,如下所示:

function polynomialMult(npts,x,y)
    integer npts
    double precision x(npts), results(npts + 1), y(npts,npts)

! Change the next line to whatever you want
    double precision, dimension(npts) :: polynomialMult

    polynomialMult =  x(1:npts) + 1

end function

你的声明

integer function polynomialMult(npts,x,y)

声明函数返回一个整数。不是一个整数数组。我不认为标准允许这样的函数声明:

integer, dimension(10) function polynomialMult(npts,x,y)

但我可能是错的。我总是使用我向你展示的表格。

如果您拥有最新版本的Fortran编译器,您可以执行一些聪明的操作,例如返回已分配的数组。我建议您了解数组语法。例如,您的语句:

polynomialMult =  x(1:npts) + 1

可以更简洁地写成:

polynomialMult =  x + 1

由于Fortran会将标量加法映射到您声明为仅具有npts元素的数组x的所有元素。

将数组大小传递到子例程中在FORTRAN77中非常常见,但现在几乎总是不必要的。通常,您要么希望对数组中的每个元素进行操作(如数组语法示例中的操作),要么应该让子程序计算出其正在处理的数组的大小。


1
感谢您的帮助。正如您可能已经注意到的那样,我是Fortran的新手。 - Statler

3
我同意前面回答者的观点,以下方法可行:
polynomialMult = x + 1

然而,如果不知道polynomialMult和x是数组,可能会认为它是标量操作。我更喜欢显而易见地这样做:

polynomialMult(:) = x(:) + 1

我甚至坚持我的团队中的程序员以这种方式做。 我不喜欢费力理解别人的代码 - 我希望他们在做什么方面很明显。


3
哈哈,当这个问题得到另一个赞时,我又回来了。这个答案有一个微妙的“问题”:polynomialMult是一个数组,而polynomialMult(:)是一个数组部分,它们并不总是可以互换的,尽管在这里可以。 - High Performance Mark
@HighPerformanceMark: 我会这样说:polynomialMult(1:npts) = x(1:npts) + 1。这样就没有疑问了,对吧? - jvriesem
2
@jvriesem,这取决于如何设置polynomialMult的索引。 有时使用非标准索引(例如double precision polynomialMult(0:npts-1))是有好处的。 在这种情况下,您冒着出现错误的风险polynomialMult(0:npts-1) = x(0:npts-1) + 1,因为您可能会意外地在表达式中输错索引。 - astay13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接