FTN95 crashes when attempting to compile the following code, the offending statement being, WRITE (,) Buff_toStr(buffer)(1:32768).
! ---------------------------------------------------------------
! MODULE WX_Buffer
!
! This module implements a fixed size string buffer.
!
! As currently implemented the limits of this buffer are as follows.
!
! Maximum size of buffer = 1 Mbyte = 1048576 bytes (characters)
!
!
MODULE WX_Buffer
IMPLICIT NONE
PRIVATE
INTEGER(KIND=SELECTED_INT_KIND(9)), &
PARAMETER :: long = SELECTED_INT_KIND(9)
INTEGER(KIND=long), PARAMETER :: MAX_BUFF_SIZE = 1048576
TYPE :: buffer_t
PRIVATE
INTEGER(KIND=long) :: size = 0
CHARACTER(LEN=MAX_BUFF_SIZE) :: str = ''
END TYPE
INTERFACE Buff_Add
MODULE PROCEDURE Buff_AddStr
END INTERFACE
PUBLIC buffer_t, &
Buff_Reset, &
Buff_Add, &
Buff_Len, &
Buff_toStr
PUBLIC OPERATOR (.EQUAL.)
CONTAINS
!----------------------------------------------------------------
! Resets the buffer to empty.
!
SUBROUTINE Buff_Reset (buffer)
TYPE(buffer_t), INTENT(INOUT) :: buffer
buffer%size = 0
buffer%str = ''
END SUBROUTINE
!----------------------------------------------------------------
! Adds character string to buffer. Used for defining generic Buff_Add
! routine. Sets fOver to true if adding the string would overflow the
! buffer.
!
SUBROUTINE Buff_AddStr (buffer, s, fOver) !PRIVATE
TYPE(buffer_t), INTENT(INOUT) :: buffer
CHARACTER(LEN=*), INTENT(IN) :: s
LOGICAL, INTENT(out) :: fOver
INTEGER(KIND=long) :: nextSize
nextSize = buffer%size + LEN(s)
fOver = (nextSize > MAX_BUFF_SIZE)
IF (fOver) THEN
buffer%size = MAX_BUFF_SIZE
ELSE
buffer%str(buffer%size+1: nextSize) = s
buffer%size = nextSize
ENDIF
END SUBROUTINE
!----------------------------------------------------------------
! Returns current contents of buffer as a string.
!
FUNCTION Buff_toStr (buffer) result(str)
TYPE(buffer_t), INTENT(IN) :: buffer
CHARACTER(LEN=buffer%size) :: str
str = buffer%str(1: buffer%size)
END FUNCTION
!----------------------------------------------------------------
! Returns current length of buffer.
!
FUNCTION Buff_Len (buffer)
INTEGER(KIND=long) :: Buff_Len
TYPE(buffer_t), INTENT(IN) :: buffer
Buff_Len = buffer%size
END FUNCTION
!----------------------------------------------------------------
END MODULE
PROGRAM Buffy
USE WX_Buffer
LOGICAL :: fOver
TYPE(buffer_t) :: buffer
DO i = 1, 1000
CALL Buff_Add (buffer, &
'If you are out to describe the truth, leave elegance to the tailor.', fOver)
END DO
WRITE (*,*) Buff_toStr(buffer)(1:32768)
END
! =================================================================
Keith