PROGRAM MAIN
IMPLICIT NONE
CALL CALCULATE
!XWB X cannot be used here unless linked_list is called at this level
!XWB to obtain the size and extract the contents
END PROGRAM
SUBROUTINE CALCULATE
IMPLICIT NONE
INTEGER :: I, J, K
INTEGER, PARAMETER:: LLADD=1, LLGET=2, LLSIZE=3 !XWB
INTEGER, ALLOCATABLE :: X(:) !XWB
!XWB Fill up the array
CALL LINKED_LIST(LLADD, J, X)
!XWB Find out how big the array is
CALL LINKED_LIST (LLSIZE, J, X)
!XWB Allocate an array for the result
ALLOCATE (X(J))
!XWB Extract the array
CALL LINKED_LIST (LLGET, J, X)
!XWB Do whatever you want with X
!XWB Release X
DEALLOCATE (X)
END SUBROUTINE
SUBROUTINE LINKED_LIST(FUNC, K, X)
IMPLICIT NONE
TYPE NODE
INTEGER :: VALUE
TYPE (NODE), POINTER :: NEXT
END TYPE NODE
INTEGER :: NUM, J
INTEGER, SAVE:: I
INTEGER, INTENT(IN)::FUNC !!XWB - what to do
INTEGER, INTENT(OUT):: K !!XWB - integer result
INTEGER, INTENT(OUT) :: X(:) !!XWB - array result
INTEGER, PARAMETER:: LLADD=1, LLGET=2, LLSIZE=3 !! XWB
TYPE (NODE), POINTER, SAVE:: LIST, CURRENT
IF (FUNC .EQ. LLADD) THEN
! K and X not used
NULLIFY(LIST)
I=0
DO
READ *, NUM
IF (NUM == 0) EXIT
ALLOCATE(CURRENT)
CURRENT%VALUE = NUM
CURRENT%NEXT => LIST
LIST => CURRENT
I = I + 1
END DO
ELSEIF (FUNC .EQ. LLSIZE) THEN
! x not used
PRINT *, "I", I
K = I
ELSE
! FUNC .EQ. LLGET
! k not used
J = 0
CURRENT => LIST
DO J = 1, I
!PRINT *, CURRENT%VALUE
X(J) = CURRENT%VALUE
PRINT *, J, X(J)
CURRENT => CURRENT%NEXT
END DO
END IF
END SUBROUTINE LINKED_LIST