【发布时间】:2016-10-09 23:44:30
【问题描述】:
在 fortran 中,我们可以定义默认参数。但是,如果不存在可选参数,则也不能设置它。当使用参数作为具有默认值的关键字参数时,这会导致像
这样的尴尬结构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 的混淆。但它是无效的,大概是因为 Fortran 通过引用传递参数,因此如果 VAL 不存在于 CALL 语句中,则没有内存与 VAL 和 VAL = -1 相关联会导致段错误。
【问题讨论】:
-
好奇的细节:当使用一个可选参数而没有受到
present()的保护时,GFortran 和 Intel Fortran 都没有提供任何类型的编译时间警告。两者都只会在运行时因段错误而失败。
标签: fortran optional-parameters default-parameters default-arguments optional-arguments