Fortran 2003/2008: argumentos padrão elegantes?
No fortran, podemos definir argumentos padrão. No entanto, se um argumento opcional não estiver presente, ele também não poderá ser definido. Ao usar argumentos como argumentos de palavra-chave com valores padrão, isso leva a construções estranhas 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
Pessoalmente, muitas vezes encontrei o problema de digitar acidentalmenteVAL
ao invés deAVAL
, ou seja, a desconexão entre o nome da variável na interface e o valor inicial usado no código pode introduzir erros de tempo de execução - sem falar no fato de que essa maneira de inicialização é bastante detalhada.
Existe alguma maneira mais elegante de usar argumentos opcionais com um valor padrão?
Exemplo Seria mais natural escrever algo como
IF(NOT(PRESENT(VAL))) VAL = -1
porque evita oVAL
vsAVAL
confusão. Mas isso não é válido, provavelmente porque o Fortran passa argumentos por referência e, portanto, seVAL
não está presente noCALL
declaração, nenhuma memória está associada aVAL
eVAL = -1
causaria um segfault.