2017-07-02 81 views
0

正如我们所知道的那样,函数名称可以作为参数传入/传出其他子例程。我想知道是否有任何技巧将函数列表保存到数组中,这些数组将被传入和传出进程。如何将一组函数存储到Fortran阵列中

!-------举个例子。 在地方,我们设置任何阵列

type(Idonotknow)::Farray(N) 

然后设置值:

Farray(1)%any=>fun1 

Farray(2)%any=>fun2 

... 
Farray(N)%any=>funN 

其中FUN1,FUN2 ... funN是像

Function fun1(input) 
     implicit none 
     statements 
End Function 

最后,我们可以给他们打电话

do i = 1, N 
    Call F(i)%any(input) 
enddo 
+0

你能否澄清一点(例如) –

+0

这是函数指针的概念。 – cup

+0

似乎是这样。我在https://stackoverflow.com/questions/8612466/how-to-alias-a-function-name-in-fortran找到了一些东西。这很有帮助。但我想知道如何声明一个数组并保存一组函数。 –

回答

1

首先,你应该创建一个只包含一个不会传递任何参数的过程指针的类型。然后创建该类型的数组。

例:

program test_func_array 
    implicit none 

    type pp 
    procedure(func) ,pointer ,nopass :: f =>null() 
    end type pp 

    interface 
     function func(x) 
     real :: func 
     real, intent (in) :: x 
     end function func 
    end interface 

    type(pp) :: func_array(4) 

    func_array(1)%f => exp 
    func_array(2)%f => tan 
    func_array(3)%f => cos 
    func_array(4)%f => sin 

    print*,func_array(1)%f(1.) 
    print*,func_array(2)%f(1.) 
    print*,func_array(3)%f(0.) 
    print*,func_array(4)%f(0.) 

end program test_func_array 
+0

请注意,您需要符合F2003的编译器。只接受F95语法的人将无法构建它。 – cup

+0

就是这样。非常感谢。 –