Как записать выходные данные в строку на fortran?

#fortran #gfortran

#fortran #gfortran

Вопрос:

Мне нужно записать форматированный вывод в строку DTSTR . Он используется для работы под layhe fortran, но не 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)
  

это просто пустая строка. Если я использую следующий за ним правильный вывод. Но я хочу сохранить эту строку. Возможно ли это сделать с помощью gnu fortran.

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

Обновить

Я пытаюсь скомпилировать следующий файл. Я думаю, проблема может быть в 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
  

Ответ №1:

Хм? Для меня это работает просто отлично:

 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
  

выдает

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

как и следовало ожидать. Работает с несколькими версиями gfortran, которые у меня есть.

Обновление: Да, проблема в вашем общем блоке. Общий блок не объявлен в основной программе. Но на самом деле, намного проще и намного, намного лучше просто передавать строку в качестве аргумента:

       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
  

Комментарии:

1. Как сказано в руководстве, это должно: gcc.gnu.org/onlinedocs/gfortran /…

2. @affan: Ваша исправленная программа компилируется и запускается для меня. Тем не менее, в ответ на «Я думаю, проблема может быть в COMMON.», я бы рекомендовал отказаться от ОБЩИХ переменных, если вы можете.