Fortran 2003/2008: ¿Elegantes argumentos por defecto?

En fortran, podemos definir argumentos por defecto. Sin embargo, si un argumento opcional no está presente, tampoco se puede establecer. Cuando se usan argumentos como argumentos de palabras clave con valores predeterminados, esto conduce a construcciones incómodas como

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

Personalmente, a menudo me encontré con el problema de escribir accidentalmenteVAL en lugar deAVAL, es decir, la desconexión entre el nombre de la variable en la interfaz y el valor inicializado utilizado en el código puede introducir errores de tiempo de ejecución, y mucho menos que esta forma de inicialización es bastante detallada.

¿Hay alguna forma más elegante de usar argumentos opcionales con un valor predeterminado?

Ejemplo Sería más natural escribir algo como

IF(NOT(PRESENT(VAL))) VAL = -1 

porque evita elVAL vsAVAL Confusión. Pero no es válido, presumiblemente porque Fortran pasa argumentos por referencia y por lo tanto siVAL no está presente en elCALL declaración, no hay memoria asociada conVAL yVAL = -1 Causaría una segfault.

Respuestas a la pregunta(4)

Su respuesta a la pregunta