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
Replay: real traced execution (multi-file project)
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 = 4
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 = 6
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 = 8
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
count ← 4
27count = 428length = 1.5values this step4countlength ← 1.5
27count = 428length = 1.529result_int = double_value(count)values this step1.5lengthresult_int ← 8
28length = 1.529result_int = double_value(count)30result_real = double_value(length)values this step8result_int4countresult_real ← 3.0
29result_int = double_value(count)30result_real = double_value(length)31print '(I0, A, F0.1)', result_int, " ", result_realvalues this step3.0result_real1.5lengthprint '(I0, A, F0.1)', result_int, " ", result_real
30 result_real = double_value(length)31 print '(I0, A, F0.1)', result_int, " ", result_real32end program generic_interface_demooutput8 3.0values this step8result_int3.0result_real
count ← 6
27count = 628length = 1.5values this step6countlength ← 1.5
27count = 628length = 1.529result_int = double_value(count)values this step1.5lengthresult_int ← 12
28length = 1.529result_int = double_value(count)30result_real = double_value(length)values this step12result_int6countresult_real ← 3.0
29result_int = double_value(count)30result_real = double_value(length)31print '(I0, A, F0.1)', result_int, " ", result_realvalues this step3.0result_real1.5lengthprint '(I0, A, F0.1)', result_int, " ", result_real
30 result_real = double_value(length)31 print '(I0, A, F0.1)', result_int, " ", result_real32end program generic_interface_demooutput12 3.0values this step12result_int3.0result_real
count ← 8
27count = 828length = 1.5values this step8countlength ← 1.5
27count = 828length = 1.529result_int = double_value(count)values this step1.5lengthresult_int ← 16
28length = 1.529result_int = double_value(count)30result_real = double_value(length)values this step16result_int8countresult_real ← 3.0
29result_int = double_value(count)30result_real = double_value(length)31print '(I0, A, F0.1)', result_int, " ", result_realvalues this step3.0result_real1.5lengthprint '(I0, A, F0.1)', result_int, " ", result_real
30 result_real = double_value(length)31 print '(I0, A, F0.1)', result_int, " ", result_real32end program generic_interface_demooutput16 3.0values this step16result_int3.0result_real
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.