【问题标题】:Function Returning an array in Fortran在 Fortran 中返回数组的函数
【发布时间】:2011-04-19 04:34:47
【问题描述】:

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

或任何我得到的编译错误。

【问题讨论】:

    标签: arrays function fortran fortran90


    【解决方案1】:

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

    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 的,现在几乎总是没有必要的。通常,您要么想对数组中的每个元素进行操作(如数组语法示例中所示),要么让子程序计算出它正在处理的数组的大小。

    【讨论】:

    • 感谢您的帮助。您可能会说,我是 fortran 新手。
    【解决方案2】:

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

    polynomialMult = x + 1
    

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

    polynomialMult(:) = x(:) + 1
    

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

    【讨论】:

    • 哈哈,再次获得赞成票时回到这个问题。这个答案有一个微妙的“问题”:polynomialMult 是一个数组,polynomialMult(:) 是一个数组部分,尽管它们在这里,但两者并不总是可以互换的。
    • @HighPerformanceMark:我会说类似polynomialMult(1:npts) = x(1:npts) + 1。那么毫无疑问,对吧?
    • @jvriesem,这取决于polynomialMult 的索引是如何设置的。有时有充分的理由使用非标准索引,例如double precision polynomialMult(0:npts-1)。在这种情况下,polynomialMult(0:npts-1) = x(0:npts-1) + 1 可能会出现错误,因为您可能会不小心在表达式中输入错误的索引。
    猜你喜欢
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2014-12-08
    • 1970-01-01
    • 2016-10-23
    • 2014-07-24
    • 1970-01-01
    相关资源
    最近更新 更多