Pass function as a parameter to another function

Hi!

I’m having problems trying to pass a function as a parameter to another function

This function

complex function f(x,y)
    real::x
    complex::y
...
end function

to the function

complex function g(f,y,x,xf)
        complex::y
        real::xf,x

        interface
            complex function f(s,t)
                real::s
                complex::t
            end function
        end interface
...
    end function

using this call

  y = (0.0,1.0)
  result = g(f,y,0.0,5.0)

I’m having this error:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

What am I doing wrong?

Thanks!

I think you may not understand the syntax of defining a function. Here is an example.

module m
contains
complex function f(x) result(y)
    real :: x 
    y = cmplx(x,x) ! sets y to a complex number whose real and imaginary
                   ! parts are both x
end function f
end module m
!
program main
use m
implicit none
real :: x
x = 3.2
print*,x,f(x)
end program main

output
3.20000005 (3.20000005,3.20000005)

The f function is ok. The problem is the way I’m trying to pass it to the g function. In a more general sense I’m just trying to pass a function to another function as a parameter and I don’t know how to do it.

A procedure can have an argument that is a procedure with an interface. Here is an example.

module integral_mod
implicit none
integer, parameter :: wp = kind(1.0d0)
contains
!
pure function integral(f,a,b,n) result(y)
!
interface
   pure function f_real_real(x) result(y)
   import wp
   implicit none
   real(kind=wp), intent(in) :: x
   real(kind=wp)             :: y
   end function f_real_real
end interface
!
procedure(f_real_real) :: f
real(kind=wp), intent(in) :: a,b
integer, intent(in) :: n
real(kind=wp)       :: y
integer             :: i
real(kind=wp)       :: x,h,fsum
h = (b-a)/(n-1)
x = a
fsum = 0.0
do i=1,n
   if (i == 1 .or. i == n) then
      fsum = fsum + f(x)/2
   else
      fsum = fsum + f(x)
   end if
   x = x + h
end do
y = h*fsum
end function integral
!
end module integral_mod
!
module funcs_mod
use integral_mod, only: wp
implicit none
contains
!
pure function square(x) result(y)
real(kind=wp), intent(in) :: x
real(kind=wp)             :: y
y = x**2
end function square
!
pure function cube(x) result(y)
real(kind=wp), intent(in) :: x
real(kind=wp)             :: y
y = x**3
end function cube
!
end module funcs_mod

program test_procedure_arg
use integral_mod, only: wp, integral
use funcs_mod   , only: square, cube
implicit none
real(kind=wp) :: a,b
integer       :: n
n = 10**6
a = 0.0_wp
b = 10.0_wp
print "(*(f12.6))", integral(square,a,b,n),integral(cube,a,b,n) 
end program test_procedure_arg

output:
333.333333 2500.000000

2 Likes

Thank you! Was what i needed.