Range Over Built in Fortran
Iterating over elements in a variety of built-in data structures. Let’s see how to use loops with some of the data structures we’ve already learned.
PROGRAM RangeExample
IMPLICIT NONE
INTEGER :: i, n, sum
INTEGER, DIMENSION(3) :: nums
CHARACTER(LEN=5), DIMENSION(2) :: keys = (/ 'a', 'b' /)
CHARACTER(LEN=10), DIMENSION(2) :: values = (/ 'apple', 'banana' /)
CHARACTER(LEN=2), DIMENSION(2) :: str = 'go'
! Define nums array
nums = (/ 2, 3, 4 /)
sum = 0
! Calculate sum of array elements
DO i = 1, SIZE(nums)
sum = sum + nums(i)
END DO
PRINT *, 'sum: ', sum
! Print index where element is 3
DO i = 1, SIZE(nums)
IF (nums(i) == 3) PRINT *, 'index: ', i
END DO
! Iterate over key-value pairs in parallel arrays
DO i = 1, SIZE(keys)
PRINT *, keys(i), ' -> ', values(i)
END DO
! Print keys of the map
DO i = 1, SIZE(keys)
PRINT *, 'key: ', keys(i)
END DO
! Iterate over characters of the string
DO i = 1, LEN(str)
PRINT *, 'Index: ', i-1, ' character: ', str(i:i)
END DO
END PROGRAM RangeExampleHere we use a loop to sum the numbers in an array. Arrays work like this too.
nums = (/ 2, 3, 4 /)
sum = 0
DO i = 1, SIZE(nums)
sum = sum + nums(i)
END DO
PRINT *, 'sum: ', sumLoop on arrays provides both the index and value for each entry. Above we didn’t need the index, so we didn’t use it explicitly. Sometimes we actually want the indexes though.
DO i = 1, SIZE(nums)
IF (nums(i) == 3) PRINT *, 'index: ', i
END DOLoop on arrays iterates over key-value pairs.
DO i = 1, SIZE(keys)
PRINT *, keys(i), ' -> ', values(i)
END DOA loop can also iterate over just the keys of an array.
DO i = 1, SIZE(keys)
PRINT *, 'key: ', keys(i)
END DOLoop on strings iterates over characters. The first value is the starting byte index of the character and the second the character itself.
DO i = 1, LEN(str)
PRINT *, 'Index: ', i-1, ' character: ', str(i:i)
END DOTo run the program, you can use a Fortran compiler like gfortran.
$ gfortran -o RangeExample RangeExample.f90
$ ./RangeExample
sum: 9
index: 2
a -> apple
b -> banana
key: a
key: b
Index: 0 character: g
Index: 1 character: o