2011-02-18 90 views
4

如何才能在fortran 90中實現此目標?我有一個常規的接受功能Fortran中的可選子程序90

subroutine foo(bar, mysub) 
    integer, intent(in) :: bar 
    interface 
     subroutine mysub(x) 
     integer :: x 
     end subroutine 
    end interface 

    call mysub(bar) 

end subroutine 

現在我想例程是可選現在

subroutine foo(bar, mysub) 
    integer, intent(in) :: bar 
    interface 
     subroutine mysub(x) 
     integer :: x 
     end subroutine 
    end interface 
    optional :: mysub 

    call mysub(bar) 

end subroutine 

,如果mysub是一個標準的可變var我可以做類似

if (present(var)) then 
    l_var = var 
else 
    l_var = <default value> 
endif 

但據我所知,我不能對可選的子程序執行相同的操作。在實踐中,這是不可能的

subroutine foo(bar, mysub) 
    integer, intent(in) :: bar 
    interface 
     subroutine mysub(x) 
     integer :: x 
     end subroutine 
    end interface 
    optional :: mysub 

    if (present(mysub)) then 
     l_mysub = mysub 
    else 
     l_mysub = default 
    endif 

    call mysub(bar) 

end subroutine 

因爲你不能聲明l_mysub。有沒有可能通過我不知道的一些技巧?是的,我當然可以做

if (present(mysub)) then 
     call mysub(bar) 
    else 
     call default(bar) 
    endif 

,但我的情況比較複雜,我將不得不處處把這個檢查。考慮我有三個可選的子程序可以通過。

回答

1

我的第一個想法是使用一個過程指針,但後來我注意到你指定了fortran 90,所以這不是一個選項。
如何爲原始foo製作一個包裝子程序,如果指定子程序,或者使用default,則調用該子程序?像這樣的(未經測試)的東西:

subroutine foo_wrap(bar, mysub) 
    integer, intent(in) :: bar 
    interface 
    subroutine mysub(x) 
     integer :: x 
    end subroutine mysub 
    end interface 
    optional :: mysub 

    if (present(mysub)) then 
    call foo(bar, mysub) 
    else 
    call foo(bar, default) 
    endif 
end subroutine foo_wrap 

使用多個可選的子程序它可能成爲一個有點複雜,但不是不可能的,我想。