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
С необязательными аргументами вы всегда должны использовать модули (или явный интерфейс). Проверьте этот ответ