Fortran 中返回数组的函数

问题描述 投票:0回答:3

据我所知,您可以从 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
3个回答
34
投票

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

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


3
投票

我同意之前的回复者的观点,以下方法有效:

polynomialMult = x + 1

但是,如果不知道 polynomialMult 和 x 是数组,人们可能会认为它是标量运算。 我更喜欢明显地这样做:

polynomialMult(:) = x(:) + 1

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


0
投票

Fortran 有一个 RESULT 关键字,它确实有助于声明函数返回值的类型。

这是一个示例程序,其中包含一个使用 RESULT 关键字来声明返回数组的函数 - 在本例中是一个包含 3 个字符串的数组。

blah_3_strings
函数返回数组
return_val
作为其结果,因为这是使用 result 关键字声明的变量名。

program fsyntax
    character*20 message1
    character*50 threemessages(3)
    integer i

    message1 = blah_1_string("test1")
    write(*,'(A)') message1
    write(*,*)
    threemessages = blah_3_strings("testA","testB","testC")
    do i=1,3
        write(*,'(A)') threemessages(i)
    enddo
    call exit(0)

contains
    ! ===== traditional style function declaration =====
    character*50 function blah_1_string(str1)
        character*(*), intent(in) :: str1

        blah_1_string = "blah-" // str1
        return
    endfunction

    ! ===== function declaration using RESULT keyword =====
    function blah_3_strings(str1,str2,str3) result(return_val)
        character*(*), intent(in) :: str1
        character*(*), intent(in) :: str2
        character*(*), intent(in) :: str3
        character*50 :: return_val(3)

        return_val(1) = "blah-" // str1
        return_val(2) = "blah-" // str2
        return_val(3) = "blah-" // str3
        return
    endfunction

endprogram

重点关注代码中的 result 关键字和

return_val
声明。

这是程序输出:

blah-test1

blah-testA
blah-testB
blah-testC

注意:使用旧的传统函数语法的函数返回类型显然仅限于内在类型。很难确定所有的限制和变化,但与将所有函数类型信息塞进一行有关。此外,大多数文档都侧重于 RESULT 关键字存在的其他原因,例如递归,但它确实适用于任何函数声明。

© www.soinside.com 2019 - 2024. All rights reserved.