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.