Question

I need to write a formated output to a string DTSTR. It use to work under layhe fortran but not gfortran

   INTEGER*2    MON,DAY,YEAR,HR,MINUTE,SEC,HUND
   CHARACTER    DY*2
   CHARACTER    DTSTR*24
   COMMON   /RD/ DTSTR
   ...
   ...
   WRITE(DTSTR,10)MON,DAY,YEAR,HR,MINUTE,DY,' ]'
  10 FORMAT('[ ',I2,'-',I2.2,'-',I4,2X,I2,':',I2.2,1X,2A2)

it empty just a empty line. If i use following it correctly output. But i want to store this string. Is it possible to do that with gnu fortran.

   WRITE(*,10)MON,DAY,YEAR,HR,MINUTE,DY,' ]'

update

I am trying to compile following file. I think the problem might be with the COMMON.

      PROGRAM HELO

      CALL DOTIME

      WRITE(*,5700)DTSTR

 5700 FORMAT(24X,A24/)

      END


      SUBROUTINE DOTIME
C
      IMPLICIT NONE
      INTEGER*2    MON,DAY,YEAR,HR,MINUTE,SEC,HUND
      CHARACTER    DY*2
      CHARACTER    DTSTR*24
      COMMON   /RD/ DTSTR

      integer values(8)
      call date_and_time(VALUES=values)

        YEAR   = values(1)
        MON    = values(2)
        DAY    = values(3)
        HR     = values(5)
        MINUTE = values(6)
        SEC    = values(7)
        HUND   = values(8)
C     =================================================
C
C     Incompitable function => CALL GETDAT(YEAR,MON,DAY)
C     Incompitable function => GETTIM(HR,MINUTE,SEC,HUND)
      IF(HR .GE. 12)THEN
           IF(HR .NE. 12)HR=HR-12
           DY='PM'
      ELSE
           DY='AM'
      ENDIF
      WRITE(DTSTR,10)MON,DAY,YEAR,HR,MINUTE,DY,' ]'
   10 FORMAT('[ ',I2,'-',I2.2,'-',I4,2X,I2,':',I2.2,1X,2A2)
      RETURN
      END
Was it helpful?

Solution

Hmm? It works just fine for me:

program testwrite
    implicit none
    INTEGER :: MON,DAY,YEAR,HR,MINUTE,SEC,HUND
    CHARACTER(LEN=2)  :: DY
    CHARACTER(LEN=24) :: DTSTR

    MON = 4
    DAY = 27
    YEAR= 2010
    HR  = 13
    MINUTE = 27
    SEC  = 0
    HUND = 0
    DY   ='WE'

    WRITE(DTSTR,10)MON,DAY,YEAR,HR,MINUTE,DY,' ]'
 10 FORMAT('[ ',I2,'-',I2.2,'-',I4,2X,I2,':',I2.2,1X,2A2)

    print *,'<',trim(DTSTR),'>'

end program testwrite

gives

 <[  4-27-2010  13:27 WE ]>

just as one would expect. Works with several versions of gfortran I have kicking around.

Update: Yes, the problem is in your common block. The common block isn't declared in the main program. But really, it's much simpler and much, much better practice just to pass the string as an argument:

      PROGRAM HELO
      IMPLICIT NONE
      CHARACTER(LEN=24) :: DTSTR

      CALL DOTIME(DTSTR)

      WRITE(*,5700)DTSTR

 5700 FORMAT(24X,A24/)

      END


      SUBROUTINE DOTIME(DTSTR)
C
      IMPLICIT NONE
      INTEGER*2    MON,DAY,YEAR,HR,MINUTE,SEC,HUND
      CHARACTER    DY*2
      CHARACTER(LEN=24), INTENT(OUT) ::   DTSTR
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top