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 vonAVALas 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.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage