Boundary Conditions
Clamped Index
Staying Inside an Array
Boundary checks can clamp a requested index so an array access stays inside valid limits.
Program
Play the program to choose an index and see how the boundary rule protects the lookup.
clamped_index.f90
Replay: real traced execution (multi-file project)
program clamped_index_demo
implicit none
integer :: values(4)
integer :: raw_index
integer :: used_index
integer :: picked
values = [10, 20, 30, 40]
raw_index = 5
used_index = max(1, min(raw_index, 4))
picked = values(used_index)
print '(I0, 1X, I0, 1X, I0)', raw_index, used_index, picked
end program clamped_index_demo
program clamped_index_demo
implicit none
integer :: values(4)
integer :: raw_index
integer :: used_index
integer :: picked
values = [10, 20, 30, 40]
raw_index = 0
used_index = max(1, min(raw_index, 4))
picked = values(used_index)
print '(I0, 1X, I0, 1X, I0)', raw_index, used_index, picked
end program clamped_index_demo
program clamped_index_demo
implicit none
integer :: values(4)
integer :: raw_index
integer :: used_index
integer :: picked
values = [10, 20, 30, 40]
raw_index = 2
used_index = max(1, min(raw_index, 4))
picked = values(used_index)
print '(I0, 1X, I0, 1X, I0)', raw_index, used_index, picked
end program clamped_index_demo
values ← [10, 20, 30, 40]
8values = [10, 20, 30, 40]9raw_index = 5values this step[10, 20, 30, 40]valuesraw_index ← 5
8values = [10, 20, 30, 40]9raw_index = 510used_index = max(1, min(raw_index, 4))values this step5raw_indexused_index ← 4
9raw_index = 510used_index = max(1, min(raw_index, 4))11picked = values(used_index)values this step4used_index5raw_indexpicked ← 40
10used_index = max(1, min(raw_index, 4))11picked = values(used_index)12print '(I0, 1X, I0, 1X, I0)', raw_index, used_index, pickedvalues this step40picked4used_indexprint '(I0, 1X, I0, 1X, I0)', raw_index, used_index, picked
11 picked = values(used_index)12 print '(I0, 1X, I0, 1X, I0)', raw_index, used_index, picked13end program clamped_index_demooutput5 4 40values this step5raw_index4used_index40picked
values ← [10, 20, 30, 40]
8values = [10, 20, 30, 40]9raw_index = 0values this step[10, 20, 30, 40]valuesraw_index ← 0
8values = [10, 20, 30, 40]9raw_index = 010used_index = max(1, min(raw_index, 4))values this step0raw_indexused_index ← 1
9raw_index = 010used_index = max(1, min(raw_index, 4))11picked = values(used_index)values this step1used_index0raw_indexpicked ← 10
10used_index = max(1, min(raw_index, 4))11picked = values(used_index)12print '(I0, 1X, I0, 1X, I0)', raw_index, used_index, pickedvalues this step10picked1used_indexprint '(I0, 1X, I0, 1X, I0)', raw_index, used_index, picked
11 picked = values(used_index)12 print '(I0, 1X, I0, 1X, I0)', raw_index, used_index, picked13end program clamped_index_demooutput0 1 10values this step0raw_index1used_index10picked
values ← [10, 20, 30, 40]
8values = [10, 20, 30, 40]9raw_index = 2values this step[10, 20, 30, 40]valuesraw_index ← 2
8values = [10, 20, 30, 40]9raw_index = 210used_index = max(1, min(raw_index, 4))values this step2raw_indexused_index ← 2
9raw_index = 210used_index = max(1, min(raw_index, 4))11picked = values(used_index)values this step2used_index2raw_indexpicked ← 20
10used_index = max(1, min(raw_index, 4))11picked = values(used_index)12print '(I0, 1X, I0, 1X, I0)', raw_index, used_index, pickedvalues this step20picked2used_indexprint '(I0, 1X, I0, 1X, I0)', raw_index, used_index, picked
11 picked = values(used_index)12 print '(I0, 1X, I0, 1X, I0)', raw_index, used_index, picked13end program clamped_index_demooutput2 2 20values this step2raw_index2used_index20picked
boundary
Valid array positions are bounded by the first and last index.
clamp
`max(1, min(raw_index, 4))` keeps the index inside `1..4`.
safe lookup
The lookup uses `used_index`, not the unchecked requested index.