在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=2
,arr1 = [2, 2^2, 2^3]
时。
基本上我想将带有(符号变量)表达式的数组传递给函数。并评估函数中的表达式,表达式将接收值。
此代码运行,但没有数组函数的影响。有什么帮助怎么做?
我试着搜索这个,但没有得到任何信息。在C中,我找到了一个链接How do you pass a function as a parameter in C?。由于我对C语言知之甚少,我不确定是否应该使用问题中的技术。
答案 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