Se utilizzare l'uno o l'altro è più o meno una questione di stile di programmazione. È consentito scrivere gli argomenti di entrambe le funzioni e subroutine come intent(in)
, intent(inout)
o intent(out)
.
Il mio stile personale è tuttavia di utilizzare solo gli argomenti intent(in)
per le funzioni, che è anche un requisito per le funzioni pure
. È possibile fare un'eccezione a questa regola quando è necessario un argomento di errore codice intent(out)
.
C'è una trappola sottile nascosta in funzioni che restituiscono risultati diversi per lo stesso valore di argomento di input. Si consideri una funzione di un'ipotetica che restituisce un numero a caso
real function rnd()
end function
definendola una volta
x = rnd()
è completamente OK. Chiamandolo più volte in una singola espressione
x = (rnd() + rnd())/2
può causare la chiamata alla funzione una sola volta. Le regole del linguaggio Fortran consentono tale comportamento. Pertanto, la procedura standard di Fortran per ottenere numeri casuali random_number()
è una subroutine (e poiché tutte le funzioni intrinseche sono pure
).
Dove mai non è possibile utilizzare una funzione, utilizzare una subroutine.
Qualsiasi funzione può essere convertita in una subroutine spostando la variabile risultante in un argomento fittizio con intent(out)
. Il processo opposto potrebbe essere più problematico.
fonte
2014-12-17 09:43:27
La più grande differenza è che le subroutine vengono invocate tramite l'istruzione 'CALL' e quindi non possono essere parte di un'espressione. –