2014-12-17 13 views
5

Avevo l'impressione che le principali differenze tra le subroutine e le funzioni in Fortran fosse che le funzioni restituivano valori, mentre le subroutine modificano alcuni o tutti i valori passati come argomenti. Ma poi ho imparato che si potevano modificare anche le variabili passate alle funzioni come argomenti. Sono confuso e non riesco a trovare un buon riferimento per le differenze tra loro.Quali sono le differenze tra le funzioni e le subroutine in Fortran?

Quindi, quali sono le differenze tra i due costrutti, e quando e perché uno dovrebbe essere preferito rispetto all'altro?

+2

La più grande differenza è che le subroutine vengono invocate tramite l'istruzione 'CALL' e quindi non possono essere parte di un'espressione. –

risposta

7

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.