23

据我了解,您可以从 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)

或者我得到一个编译错误。

4

2 回答 2

33

要定义返回数组的函数,请在函数内包含函数声明,如下所示:

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 会将标量加法映射到您已声明只有元素的数组 x 的所有npts元素。

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

于 2010-09-30T06:46:50.237 回答
3

我同意前面的回复者的观点,即以下工作:

polynomialMult = x + 1

然而,在不知道 polynomialMult 和 x 是数组的情况下,人们可能会认为它是一种标量运算。我更喜欢显而易见并这样做:

polynomialMult(:) = x(:) + 1

我什至坚持让我组的程序员这样做。我不喜欢努力理解某人的代码——我希望他们在做什么是显而易见的。

于 2013-06-05T17:23:37.810 回答