HP Fortran Programmer's Reference (September 2007)

Program units and procedures
Procedure interface
Chapter 7188
TYPE raw_data
REAL :: x(100) ! values to be averaged
INTEGER :: n ! number of values assigned to x
END TYPE raw_data
! output data
TYPE stats_data
REAL :: sum, max, min, avg ! statistical results
END TYPE stats_data
! interface block to extend the assignment operator
INTERFACE ASSIGNMENT (=)
MODULE PROCEDURE do_stats
END INTERFACE
CONTAINS
SUBROUTINE do_stats(lside, rside)
! define the operations that are performed when
! rside is assigned (=) to lside
TYPE (raw_data), INTENT (IN) :: rside
TYPE (stats_data), INTENT (OUT) :: lside
! use a structure constructor for initialization
lside = stats_data(0, 0, 9999999.9, 0)
! find the sum, max, and min
DO i = 1, rside%n
lside%sum = lside%sum + rside%x(i)
IF (lside%max < rside%x(i)) lside%max = rside%x(i)
IF (lside%min > rside%x(i)) lside%min = rside%x(i)
END DO
lside%avg = lside%sum / rside%n ! the average
END SUBROUTINE do_stats
END MODULE def_assign_stats
PROGRAM main
! Make the defined assignment and the definitions of the
! derived-type operands in the assignment accessible to
! this program unit
USE def_assign_stats
TYPE (raw_data) :: user_data ! right-hand side of
! assignment
TYPE (stats_data) :: user_stats ! left-hand side of assignment
CALL get_data(user_data) ! collect user data
user_stats = user_data ! defined assignment statement
PRINT *, 'Maximum =', user_stats%max