Interop boundaries often pass a pointer plus explicit shape metadata. This example models the metadata while keeping the data in Fortran.

Program

Play the program to choose how many values are considered active.

active_count
shape_metadata.f90
Replay: real traced execution (multi-file project)
program shape_metadata_demo
    use iso_c_binding, only: c_int
    implicit none
    integer(c_int) :: values(4)
    integer(c_int) :: active_count
    integer(c_int) :: total

    values = [2_c_int, 4_c_int, 6_c_int, 8_c_int]
    active_count = 3
    total = sum(values(1:active_count))
    print '(I0, 1X, I0)', active_count, total
end program shape_metadata_demo
program shape_metadata_demo
    use iso_c_binding, only: c_int
    implicit none
    integer(c_int) :: values(4)
    integer(c_int) :: active_count
    integer(c_int) :: total

    values = [2_c_int, 4_c_int, 6_c_int, 8_c_int]
    active_count = 2
    total = sum(values(1:active_count))
    print '(I0, 1X, I0)', active_count, total
end program shape_metadata_demo
program shape_metadata_demo
    use iso_c_binding, only: c_int
    implicit none
    integer(c_int) :: values(4)
    integer(c_int) :: active_count
    integer(c_int) :: total

    values = [2_c_int, 4_c_int, 6_c_int, 8_c_int]
    active_count = 4
    total = sum(values(1:active_count))
    print '(I0, 1X, I0)', active_count, total
end program shape_metadata_demo
  1. values ← [2, 4, 6, 8]

    8values = [2_c_int, 4_c_int, 6_c_int, 8_c_int]9active_count = 3
    values this step[2, 4, 6, 8]values
  2. active_count ← 3

    8values = [2_c_int, 4_c_int, 6_c_int, 8_c_int]9active_count = 310total = sum(values(1:active_count))
    values this step3active_count
  3. total ← 12

    9active_count = 310total = sum(values(1:active_count))11print '(I0, 1X, I0)', active_count, total
    values this step12total[2, 4, 6, 8]values3active_count
  4. print '(I0, 1X, I0)', active_count, total

    10    total = sum(values(1:active_count))11    print '(I0, 1X, I0)', active_count, total12end program shape_metadata_demo
    output3 12
    values this step3active_count12total
  1. values ← [2, 4, 6, 8]

    8values = [2_c_int, 4_c_int, 6_c_int, 8_c_int]9active_count = 2
    values this step[2, 4, 6, 8]values
  2. active_count ← 2

    8values = [2_c_int, 4_c_int, 6_c_int, 8_c_int]9active_count = 210total = sum(values(1:active_count))
    values this step2active_count
  3. total ← 6

    9active_count = 210total = sum(values(1:active_count))11print '(I0, 1X, I0)', active_count, total
    values this step6total[2, 4, 6, 8]values2active_count
  4. print '(I0, 1X, I0)', active_count, total

    10    total = sum(values(1:active_count))11    print '(I0, 1X, I0)', active_count, total12end program shape_metadata_demo
    output2 6
    values this step2active_count6total
  1. values ← [2, 4, 6, 8]

    8values = [2_c_int, 4_c_int, 6_c_int, 8_c_int]9active_count = 4
    values this step[2, 4, 6, 8]values
  2. active_count ← 4

    8values = [2_c_int, 4_c_int, 6_c_int, 8_c_int]9active_count = 410total = sum(values(1:active_count))
    values this step4active_count
  3. total ← 20

    9active_count = 410total = sum(values(1:active_count))11print '(I0, 1X, I0)', active_count, total
    values this step20total[2, 4, 6, 8]values4active_count
  4. print '(I0, 1X, I0)', active_count, total

    10    total = sum(values(1:active_count))11    print '(I0, 1X, I0)', active_count, total12end program shape_metadata_demo
    output4 20
    values this step4active_count20total
explicit count `active_count` models shape metadata that accompanies array data.
section `values(1:active_count)` selects only the active portion.
C kind array `integer(c_int)` documents the intended interoperable element type.