2014-12-17 19 views
5

Ich hatte den Eindruck, dass die Hauptunterschiede zwischen Unterprogrammen und Funktionen in Fortran darin bestanden, dass Funktionen Werte zurückgaben, während Unterprogramme einige oder alle Werte änderten, die als Argumente übergeben wurden. Aber dann habe ich gelernt, dass man Variablen, die an Funktionen übergeben werden, auch als Argumente modifizieren kann. Ich bin verwirrt und finde keine gute Referenz für die Unterschiede zwischen ihnen.Was sind die Unterschiede zwischen Funktionen und Subroutinen in Fortran?

Also, was sind die Unterschiede zwischen den beiden Konstrukten, und wann und warum sollte man gegenüber dem anderen bevorzugt werden?

+2

Der größte Unterschied besteht darin, dass Subroutinen über die 'CALL'-Anweisung aufgerufen werden und daher nicht Teil eines Ausdrucks sein können. –

Antwort

7

Ob das eine oder das andere zu verwenden ist mehr oder weniger eine Frage des Programmierstils. Sie dürfen die Argumente von Funktionen und Unterprogrammen als intent(in), intent(inout) oder intent(out) schreiben.

Mein persönlicher Stil ist jedoch nur die intent(in) Argumente für Funktionen zu verwenden, die auch eine Voraussetzung für pure Funktionen ist. Eine Ausnahme von dieser Regel kann gemacht werden, wenn ein Fehlercode intent(out) Argument erforderlich ist.

Es gibt eine subtile Falle, die in Funktionen versteckt ist und unterschiedliche Ergebnisse für denselben Eingabeargumentwert liefert. Betrachten wir eine hypothetische Funktion

real function rnd() 
end function 

es einmal eine Zufallszahl Rückkehr Aufruf

x = rnd() 

ist völlig in Ordnung. In einem Ausdruck mehrfach aufrufen

kann dazu führen, dass die Funktion nur einmal aufgerufen wird. Fortran-Sprachregeln erlauben ein solches Verhalten. Daher ist das Standard-Fortran-Verfahren zum Erhalten von Zufallszahlen random_number() eine Subroutine (und da alle intrinsischen Funktionen pure sind).

Wo immer Sie eine Funktion nicht verwenden können, verwenden Sie ein Unterprogramm.

Jede Funktion kann in ein Unterprogramm konvertiert werden, indem die Ergebnisvariable in ein Dummy-Argument mit intent(out) verschoben wird. Der umgekehrte Prozess könnte problematischer sein.

Verwandte Themen