Interfaces and Optional Arguments
Optional Argument
Default Behavior
A dummy argument marked optional may be omitted by the caller. present checks whether it was supplied.
Program
Play the program to call one function with and without an optional multiplication factor.
optional_argument.f90
Replay: real traced execution (multi-file project)
program optional_argument_demo
implicit none
integer :: base, doubled, tripled
base = 6
doubled = scale(base)
tripled = scale(base, 3)
print '(I0, A, I0)', doubled, " ", tripled
contains
function scale(value, factor) result(out)
integer, intent(in) :: value
integer, intent(in), optional :: factor
integer :: out
if (present(factor)) then
out = value * factor
else
out = value * 2
end if
end function scale
end program optional_argument_demo
program optional_argument_demo
implicit none
integer :: base, doubled, tripled
base = 4
doubled = scale(base)
tripled = scale(base, 3)
print '(I0, A, I0)', doubled, " ", tripled
contains
function scale(value, factor) result(out)
integer, intent(in) :: value
integer, intent(in), optional :: factor
integer :: out
if (present(factor)) then
out = value * factor
else
out = value * 2
end if
end function scale
end program optional_argument_demo
program optional_argument_demo
implicit none
integer :: base, doubled, tripled
base = 9
doubled = scale(base)
tripled = scale(base, 3)
print '(I0, A, I0)', doubled, " ", tripled
contains
function scale(value, factor) result(out)
integer, intent(in) :: value
integer, intent(in), optional :: factor
integer :: out
if (present(factor)) then
out = value * factor
else
out = value * 2
end if
end function scale
end program optional_argument_demo
base ← 6
5base = 66doubled = scale(base)values this step6basedoubled ← 12
5base = 66doubled = scale(base)7tripled = scale(base, 3)values this step12doubled6basetripled ← 18
6doubled = scale(base)7tripled = scale(base, 3)8print '(I0, A, I0)', doubled, " ", tripledvalues this step18tripled6baseprint '(I0, A, I0)', doubled, " ", tripled
7 tripled = scale(base, 3)8 print '(I0, A, I0)', doubled, " ", tripled9containsoutput12 18values this step12doubled18tripled
base ← 4
5base = 46doubled = scale(base)values this step4basedoubled ← 8
5base = 46doubled = scale(base)7tripled = scale(base, 3)values this step8doubled4basetripled ← 12
6doubled = scale(base)7tripled = scale(base, 3)8print '(I0, A, I0)', doubled, " ", tripledvalues this step12tripled4baseprint '(I0, A, I0)', doubled, " ", tripled
7 tripled = scale(base, 3)8 print '(I0, A, I0)', doubled, " ", tripled9containsoutput8 12values this step8doubled12tripled
base ← 9
5base = 96doubled = scale(base)values this step9basedoubled ← 18
5base = 96doubled = scale(base)7tripled = scale(base, 3)values this step18doubled9basetripled ← 27
6doubled = scale(base)7tripled = scale(base, 3)8print '(I0, A, I0)', doubled, " ", tripledvalues this step27tripled9baseprint '(I0, A, I0)', doubled, " ", tripled
7 tripled = scale(base, 3)8 print '(I0, A, I0)', doubled, " ", tripled9containsoutput18 27values this step18doubled27tripled
optional
`optional` allows a dummy argument to be left out.
present
`present(factor)` is true only when the caller supplied `factor`.
result
`result(out)` names the function return variable.