如何在fortran中传递数组中的函数?

时间:2016-05-12 00:33:44

标签: arrays fortran gfortran

在fortran中处理符号变量函数的方法 我有关于将已定义的数组传递到另一个函数的问题。这是示例代码。

!file saved as test5.f08

module test5

    implicit none
    contains

    function f1 (arr1) result (sum_arr)
        real, dimension (:), allocatable, intent (in):: arr1 
        real, dimension (3):: arr2
        real :: sum_arr
        integer :: index

        sum_arr=0
        arr2 = [4,5,6]

        do index= 1,3
            arr1(index) = index  !------Q2-----------
            sum_arr = sum_arr + ( arr1(index)*arr2(index) + arr2(index))
        end do

    end function f1

end module test5

调用上述模块的主程序:

!file saved as test5_call.f08

program test5_call
    use test5
    implicit none

    integer :: n
    real,  allocatable, dimension (:) :: array1
    real::xvar, answer

    allocate (array1(3))
    array1 = [xvar,xvar*2,xvar*xvar] !---------Q1-------

    answer = f1(array1)
    print *,"Answer of array elements  = ", answer

end program test5_call

编译为 gfortran test5.f08 test5_call.f08 -o test5_call

在主程序的Q1行中,我定义了一个包含数学表达式$ [x,x ^ 2,X ^ 3]的数组$我想将这个数组传递给模块test5中的函数f1。在第Q2行(在模块test5的函数f1中),我想评估这个数组表达式。所以当index=2arr1 = [2, 2^2, 2^3]时。

基本上我想将带有(符号变量)表达式的数组传递给函数。并评估函数中的表达式,表达式将接收值。

此代码运行,但没有数组函数的影响。有什么帮助怎么做?

我试着搜索这个,但没有得到任何信息。在C中,我找到了一个链接How do you pass a function as a parameter in C?。由于我对C语言知之甚少,我不确定是否应该使用问题中的技术。

1 个答案:

答案 0 :(得分:2)

您目前的代码正在做什么:

xvar只是一个实数

array1 = [xvar,xvar*2,xvar*xvar]只是一个包含三个实数的数组,该值取决于代码中未定义的xvar的当前值。

real, dimension (:), allocatable, intent (in):: arr1再次只是几个实数的可分配数组。请注意,您根本不需要allocatable

如何做你想做的事:

首先,你应该研究如何传递函数,参见

How to pass subroutine names as arguments in Fortran?

这样你就可以传递一个功能。我建议你从那里开始宣布你的f1接受三个独立的职能

function f1 (func1, func2, func3) result (sum_arr)
  abstract interface
    real function arg_func(x)
      real, intent(in) :: x
    end function
  end interface

  procedure(arg_func) :: func1, func2, func3

只有在你了解了这项工作之后以及你对使用过程参数的信心之后,你才能开始考虑使用数组。

您必须定义一个包含过程指针的容器,并使用这些容器的数组。这是一个高级主题,留待将来Function pointer arrays in Fortran