2014-07-23 22 views
4

我有以下代碼:定義函數返回一個數組的

Program function_as_an_array 
    implicit none 
    integer:: i 
    integer, parameter:: N=10 
    real*8:: x(N),y(N),f(N) 

    do i=1,N 
     x(i)=float(i) 
    end do 

    call func(f,N,x) 

    open(unit=20, file='test.dat') 
    do i=1,N 
     y(i)=f(i) 
     write(20,*) x(i),y(i) 
    end do 
    close(20) 
    Stop 
    End Program function_as_an_array 


    Subroutine func(f,N,x) 
    implicit none 
    integer i,N 
    real*8:: x(N),f(N) 

    do i=1,N 
     f(i)=x(i)**2 
    end do 

    end Subroutine func 

我想使程序的確可以意味着 「功能作爲arrray」,也就是我想通過更換Subroutine funcfunction f並得到相同的結果(在主程序中,我希望保留一個如y=f(x,N)的聲明)。我怎樣才能做到這一點?

謝謝。

回答

8

有有一個函數返回一個數組,與this question and answer沒有出現問題,主要問題是,你需要的功能,是一個模塊(或程序中contain ED)中,這樣有一個自動顯式接口:(編輯補充:或明確定義的界面與亞歷山大·沃格特的答案)

module functions 
contains 

    function func(N,x) 
    implicit none 
    integer, intent(in) :: N 
    double precision, intent(in) :: x(N) 
    double precision, dimension(N) :: func 

    integer :: i 

    do i=1,N 
     func(i)=x(i)**2 
    end do 

end function func 

end module functions 

Program function_as_an_array 
use functions 
implicit none 
integer:: i 
integer, parameter:: N=10 
double precision:: x(N),y(N) 

do i=1,N 
    x(i)=float(i) 
end do 

y = func(N,x) 

open(unit=20, file='test.dat') 
do i=1,N 
    write(20,*) x(i),y(i) 
end do 
close(20) 
Stop 
End Program function_as_an_array 

但要注意,這種功能 - 在陣列應用相同的操作,每一個元素 - 有些更精美,一個Fortran elemental完成函數,定義爲簡單地在標量上工作,Fortran將自動將其映射到所有元素上s的陣列爲你:

module functions 
contains 

    elemental double precision function f(x) 
    implicit none 
    double precision, intent(in) :: x 

    f = x**2 

    end function f 

end module functions 

Program function_as_an_array 
    use functions 
    implicit none 
    integer:: i 
    integer, parameter:: N=10 
    double precision:: x(N),y(N) 

    do i=1,N 
     x(i)=float(i) 
    end do 

    y = f(x) 

    open(unit=20, file='test.dat') 
    do i=1,N 
     write(20,*) x(i),y(i) 
    end do 
    close(20) 
    Stop 
End Program function_as_an_array 

好的事情是,它現在將工作在標量和任何排名的陣列自動。只要有可能,讓編譯器爲你做你的工作是很好的。

+0

元素函數...不錯;-) –

2

這是爲我工作:

Program function_as_an_array 
implicit none 
integer:: i 
integer, parameter:: N=10 
real*8 :: x(N),y(N),f(N) 
interface func 
    function func(x,N) result(f) 
    implicit none 
    integer N 
    real*8:: x(N),f(N) 
    end function 
end interface 

do i=1,N 
    x(i)=float(i) 
end do 

f = func(x,N) 

open(unit=20, file='test.dat') 
do i=1,N 
    y(i)=f(i) 
    write(20,*) x(i),y(i) 
end do 
close(20) 
Stop 
End Program function_as_an_array 


function func(x,N) result(f) 
implicit none 
integer i, N 
real*8:: x(N),f(N) 

do i=1,N 
    f(i)=x(i)**2 
end do 

end function 

您需要:一個數組值

  • 使用result返回變量[編輯]或指定FUNC爲real*8:: func(N)。詳情請參閱評論。
  • 使用顯式接口外部函數(或其中有一個隱含的接口模塊,見喬納森·德西的答案)

然後,您可以直接分配功能的陣列的返回值。

+0

在這種情況下,你正式需要使用'result'嗎?我通常沒有,而且它對我來說一直工作 - 但僅僅因爲gfortran/ifort允許它並不意味着它不是標準所要求的,而且我從來沒有理由認真對待它。 –

+0

我前段時間遇到了問題,但前一段時間沒有定義它......我有種習慣這樣做。 –

+0

嗯 - 我應該看一看,看看標準說的是什麼。我注意到這個方法也被推薦[在此](http://www.fortran90.org/src/best-practices.html)。無論如何,我喜歡結果語法,我從來沒有習慣使用它。 –

相關問題