据我所知,您可以从 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)
或者任何我收到编译错误的信息。
要定义返回数组的函数,请在函数内部包含函数声明,如下所示:
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 的做法,现在几乎总是不必要的。 一般来说,您要么想要对数组中的每个元素进行操作(如数组语法示例中所示),要么应该让子程序计算出它正在处理的数组的大小。
我同意之前的回复者的观点,以下方法有效:
polynomialMult = x + 1
但是,如果不知道 polynomialMult 和 x 是数组,人们可能会认为它是标量运算。 我更喜欢明显地这样做:
polynomialMult(:) = x(:) + 1
我什至坚持要求我组中的程序员这样做。 我不喜欢努力理解某人的代码——我希望他们在做什么很明显。
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 关键字存在的其他原因,例如递归,但它确实适用于任何函数声明。