Interoperability Concepts
Shape Metadata
Pass Array Size
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.
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
values ← [2, 4, 6, 8]
8values = [2_c_int, 4_c_int, 6_c_int, 8_c_int]9active_count = 3values this step[2, 4, 6, 8]valuesactive_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_counttotal ← 12
9active_count = 310total = sum(values(1:active_count))11print '(I0, 1X, I0)', active_count, totalvalues this step12total[2, 4, 6, 8]values3active_countprint '(I0, 1X, I0)', active_count, total
10 total = sum(values(1:active_count))11 print '(I0, 1X, I0)', active_count, total12end program shape_metadata_demooutput3 12values this step3active_count12total
values ← [2, 4, 6, 8]
8values = [2_c_int, 4_c_int, 6_c_int, 8_c_int]9active_count = 2values this step[2, 4, 6, 8]valuesactive_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_counttotal ← 6
9active_count = 210total = sum(values(1:active_count))11print '(I0, 1X, I0)', active_count, totalvalues this step6total[2, 4, 6, 8]values2active_countprint '(I0, 1X, I0)', active_count, total
10 total = sum(values(1:active_count))11 print '(I0, 1X, I0)', active_count, total12end program shape_metadata_demooutput2 6values this step2active_count6total
values ← [2, 4, 6, 8]
8values = [2_c_int, 4_c_int, 6_c_int, 8_c_int]9active_count = 4values this step[2, 4, 6, 8]valuesactive_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_counttotal ← 20
9active_count = 410total = sum(values(1:active_count))11print '(I0, 1X, I0)', active_count, totalvalues this step20total[2, 4, 6, 8]values4active_countprint '(I0, 1X, I0)', active_count, total
10 total = sum(values(1:active_count))11 print '(I0, 1X, I0)', active_count, total12end program shape_metadata_demooutput4 20values 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.