Interfaces and Optional Arguments
Generic Interface
One Name, Several Procedures
A generic interface lets one public name dispatch to different module procedures based on argument types.
Program
Play the program to call double_value with an integer and with a real value.
generic_interface.f90
module generic_math
implicit none
interface double_value
module procedure double_integer
module procedure double_real
end interface
contains
function double_integer(value) result(out)
integer, intent(in) :: value
integer :: out
out = value * 2
end function double_integer
function double_real(value) result(out)
real, intent(in) :: value
real :: out
out = value * 2.0
end function double_real
end module generic_math
program generic_interface_demo
use generic_math
implicit none
integer :: count
real :: length, result_real
integer :: result_int
count =
length = 1.5
result_int = double_value(count)
result_real = double_value(length)
print '(I0, A, F0.1)', result_int, " ", result_real
end program generic_interface_demo
module generic_math
implicit none
interface double_value
module procedure double_integer
module procedure double_real
end interface
contains
function double_integer(value) result(out)
integer, intent(in) :: value
integer :: out
out = value * 2
end function double_integer
function double_real(value) result(out)
real, intent(in) :: value
real :: out
out = value * 2.0
end function double_real
end module generic_math
program generic_interface_demo
use generic_math
implicit none
integer :: count
real :: length, result_real
integer :: result_int
count =
length = 1.5
result_int = double_value(count)
result_real = double_value(length)
print '(I0, A, F0.1)', result_int, " ", result_real
end program generic_interface_demo
module generic_math
implicit none
interface double_value
module procedure double_integer
module procedure double_real
end interface
contains
function double_integer(value) result(out)
integer, intent(in) :: value
integer :: out
out = value * 2
end function double_integer
function double_real(value) result(out)
real, intent(in) :: value
real :: out
out = value * 2.0
end function double_real
end module generic_math
program generic_interface_demo
use generic_math
implicit none
integer :: count
real :: length, result_real
integer :: result_int
count =
length = 1.5
result_int = double_value(count)
result_real = double_value(length)
print '(I0, A, F0.1)', result_int, " ", result_real
end program generic_interface_demo
generic interface
`interface double_value` groups procedures under one callable name.
module procedure
`module procedure` lists the concrete procedures behind the generic name.
type dispatch
The argument type selects the integer or real procedure.