Fortran 2003/2008: Elegante Standardargumente?
n fortran können wir Standardargumente definieren. Wenn jedoch kein optionales Argument vorhanden ist, kann es auch nicht festgelegt werden. Wenn Sie Argumente als Schlüsselwortargumente mit Standardwerten verwenden, führt dies zu umständlichen Konstrukten wie
PROGRAM PDEFAULT
CALL SUB
CALL SUB(3)
CONTAINS
SUBROUTINE SUB(VAL)
INTEGER, OPTIONAL :: VAL
INTEGER :: AVAL ! short for "actual val"
IF(PRESENT(VAL)) THEN
AVAL = VAL
ELSE
AVAL = -1 ! default value
END IF
WRITE(*,'("AVAL is ", I0)') AVAL
END SUBROUTINE SUB
END PROGRAM PDEFAULT
Persönlich stieß ich oft auf das Problem der versehentlichen Eingabe vonVAL
Anstatt vonAVAL
as heißt, die Trennung zwischen dem Variablennamen in der Schnittstelle und dem im Code verwendeten initialisierten Wert kann Laufzeitfehler hervorrufen - geschweige denn, dass diese Art der Initialisierung ziemlich ausführlich is
Gibt es eine elegantere Möglichkeit, optionale Argumente mit einem Standardwert zu verwenden?
Beispie Es würde sich natürlicher anfühlen, so etwas wie @ zu schreib
IF(NOT(PRESENT(VAL))) VAL = -1
weil es das @ vermeidVAL
vsAVAL
Verwechslung. Aber es ist nicht gültig, vermutlich, weil Fortran Argumente als Referenz übergibt und somit, wennVAL
ist im @ nicht vorhandCALL
-Anweisung, mit @ ist kein Speicher verknüpVAL
undVAL = -1
würde einen Segfault verursachen.