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.

raw_index
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
  1. values ← [10, 20, 30, 40]

    8values = [10, 20, 30, 40]9raw_index = 5
    values this step[10, 20, 30, 40]values
  2. raw_index ← 5

    8values = [10, 20, 30, 40]9raw_index = 510used_index = max(1, min(raw_index, 4))
    values this step5raw_index
  3. used_index ← 4

    9raw_index = 510used_index = max(1, min(raw_index, 4))11picked = values(used_index)
    values this step4used_index5raw_index
  4. picked ← 40

    10used_index = max(1, min(raw_index, 4))11picked = values(used_index)12print '(I0, 1X, I0, 1X, I0)', raw_index, used_index, picked
    values this step40picked4used_index
  5. print '(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_demo
    output5 4 40
    values this step5raw_index4used_index40picked
  1. values ← [10, 20, 30, 40]

    8values = [10, 20, 30, 40]9raw_index = 0
    values this step[10, 20, 30, 40]values
  2. raw_index ← 0

    8values = [10, 20, 30, 40]9raw_index = 010used_index = max(1, min(raw_index, 4))
    values this step0raw_index
  3. used_index ← 1

    9raw_index = 010used_index = max(1, min(raw_index, 4))11picked = values(used_index)
    values this step1used_index0raw_index
  4. picked ← 10

    10used_index = max(1, min(raw_index, 4))11picked = values(used_index)12print '(I0, 1X, I0, 1X, I0)', raw_index, used_index, picked
    values this step10picked1used_index
  5. print '(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_demo
    output0 1 10
    values this step0raw_index1used_index10picked
  1. values ← [10, 20, 30, 40]

    8values = [10, 20, 30, 40]9raw_index = 2
    values this step[10, 20, 30, 40]values
  2. raw_index ← 2

    8values = [10, 20, 30, 40]9raw_index = 210used_index = max(1, min(raw_index, 4))
    values this step2raw_index
  3. used_index ← 2

    9raw_index = 210used_index = max(1, min(raw_index, 4))11picked = values(used_index)
    values this step2used_index2raw_index
  4. picked ← 20

    10used_index = max(1, min(raw_index, 4))11picked = values(used_index)12print '(I0, 1X, I0, 1X, I0)', raw_index, used_index, picked
    values this step20picked2used_index
  5. print '(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_demo
    output2 2 20
    values 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.