Fortran 2003/2008: элегантные аргументы по умолчанию?
В Фортране мы можем определить аргументы по умолчанию. Однако, если необязательный аргумент отсутствует, он также не может быть установлен. При использовании аргументов в качестве аргументов ключевых слов со значениями по умолчанию это приводит к неудобным конструкциям, таким как
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
Лично я часто сталкивался с проблемой случайного набора текстаVAL
вместоAVAL
то есть разъединение между именем переменной в интерфейсе и инициализированным значением, используемым в коде, может привести к ошибкам во время выполнения - не говоря уже о том, что этот способ инициализации довольно многословен.
Есть ли более элегантный способ использования необязательных аргументов со значением по умолчанию?
пример Было бы более естественно написать что-то вроде
IF(NOT(PRESENT(VAL))) VAL = -1
потому что это избегаетVAL
противAVAL
спутанность сознания. Но это неверно, предположительно потому, что Фортран передает аргументы по ссылке и, таким образом, еслиVAL
нет вCALL
оператор, память не связана сVAL
а такжеVAL = -1
вызовет сегфо