Fortran Cascading Необязательные аргументы

У меня проблема с использованием необязательных аргументов. У меня есть две процедуры num_to_str а также qry которые принимают формат fm в качестве необязательного аргумента. Когда я звоню qry ("lc"), даже еслиfm нет, рутина num_to_str думает fm настоящее.

Call qry ("lc")

Subroutine qry (lb, fm)
  Character (Len=*), Intent (In), Optional :: lb, fm
  Real :: n 
  Character (Len=65) :: s 

  n = 90.0
  Call num_to_str (n, s, fm)
End Subroutine

Subroutine num_to_str (nb, s, fm)
  Real, Intent (In) :: nb
  Character (Len=*), Intent (In) :: s
  Character (Len=*), Intent (In), Optional :: fm

  fmt = "*"
  if (Present (fm)) fmt = Trim (fm)
End Subroutine  

1 ответ

Следующее работает для меня с Intel Fortran и Gfortran,

module stuff
  implicit none

contains 

  Subroutine qry (lb, fm)
    Character (Len=*), Intent (In), Optional :: lb, fm
    Real :: n 
    Character (Len=65) :: s

    n = 90.0
    s = "test"
    Call num_to_str (n, s, fm)
  End Subroutine

  Subroutine num_to_str (nb, s, fm)
    Real, Intent (In) :: nb
    Character (Len=*), Intent (In) :: s
    Character (Len=*), Intent (In), Optional :: fm
    Character (Len=65)  :: fmt

    fmt = "*"
    if (Present (fm)) then 
        fmt = Trim (fm)
        print*, nb, s, fm
    else
        print*, nb, s
    endif
  End Subroutine  

end module stuff

program test
  use stuff, only : qry

  Call qry("lc")
  Call qry("lc","f12")

end program test

С выходом

 $ ./a.out 
 90.000000     test                                                             
 90.000000     test               f12

С необязательными аргументами вы всегда должны использовать модули (или явный интерфейс). Проверьте этот ответ

Другие вопросы по тегам