2015-03-30 3 views
0

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

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 
+0

Являются ли явные интерфейсы доступными для обеих подпрограмм в областях, в которых они ссылаются? – IanH

+0

'num_to_str' находится в модуле' core', тогда как 'qry' находится в модуле' решетка'. 'Present (fm)' в 'qry' возвращает' T', однако, когда я пытаюсь напечатать 'fm', я получаю неверную ссылку на память. – Zeus

+0

Какие параметры компилятора/компиляции? Для показанного примера кода (примечание: для 'fmt' отсутствует объявление)' present (fm) 'не должно быть true. – IanH

ответ

0

следующие работы для меня как с интелом фортраном и 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 

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

Смежные вопросы