如何在Fortran中抑制单个函数未使用的伪参数警告?
我有以下FORTRAN代码:如何在Fortran中抑制单个函数未使用的伪参数警告?,fortran,compiler-warnings,Fortran,Compiler Warnings,我有以下FORTRAN代码: FUNCTION inverse_deterministic_cdf(dist, p) RESULT(value) !=========== result ============ REAL(C_DOUBLE) :: value !====== input parameters ======= TYPE(deterministic), INTENT(IN) :: dist REAL(C_DOUBLE), INTENT(IN)
FUNCTION inverse_deterministic_cdf(dist, p) RESULT(value)
!=========== result ============
REAL(C_DOUBLE) :: value
!====== input parameters =======
TYPE(deterministic), INTENT(IN) :: dist
REAL(C_DOUBLE), INTENT(IN) :: p
!======= subroutine body =======
value = p ! This is only here to suppress unused dummy argument warning
value = dist%value
END FUNCTION inverse_deterministic_cdf
在这种情况下,inverse\u deterministic\u cdf
是inverse\u cdf
接口的实现,这就是为什么这里有未使用的p
。正如你所看到的,我有一种抑制未使用的伪参数的方法,但我觉得它不雅观。有没有人有什么最佳实践来处理这个问题?(我也希望这是编译器不可知的。)我知道如何普遍抑制警告,但当我有一个未使用的伪参数并且我没有预料到它时,我希望得到警告
编辑以添加(根据要求):
反向cdf接口定义如下:
INTERFACE inverse_cdf
MODULE PROCEDURE inverse_distribution_cdf, inverse_normal_cdf, inverse_lognormal_cdf, inverse_deterministic_cdf
END INTERFACE
我猜您需要定义一个通用接口 F.f90
MODULE stuff
IMPLICIT NONE
INTERFACE stuff_foo
MODULE PROCEDURE foo1
MODULE PROCEDURE foo2
END INTERFACE stuff_foo
CONTAINS
FUNCTION foo1(a) RESULT(f)
REAL :: a
REAL :: f
f = a
END FUNCTION foo1
FUNCTION foo2(a, b) RESULT(f)
REAL :: a
REAL :: b
REAL :: f
f = a + b
END FUNCTION foo2
END MODULE stuff
main.f90
PROGRAM main
USE stuff
IMPLICIT NONE
PRINT *, stuff_foo(1.0)
PRINT *, stuff_foo(1.0, 2.0)
END PROGRAM main
既然您的过程位于模块中(因此,该过程具有显式接口),为什么不使用可选参数呢?比如说
FUNCTION inverse_cdf(dist, p) RESULT(value)
!=========== result ============
REAL(C_DOUBLE) :: value
!====== input parameters =======
TYPE(deterministic), INTENT(IN) :: dist
REAL(C_DOUBLE), INTENT(IN), OPTIONAL :: p
!======= subroutine body =======
IF (PRESENT(p)) THEN
value = dist%value * p ! Some expression using p
ELSE
value = dist%value
END IF
END FUNCTION inverse_cdf
请告诉我们如何定义反向cdf接口。我有一个通用接口(
inverse\u cdf
),但它是用两个参数调用的,因此是未使用的伪参数。我想要的是,用户不必为处理确定性“随机”变量而编写与处理真正随机变量(例如,正态分布)不同的代码。。。我连你的意图都不明白。如果在函数调用中不需要第二个参数,则不需要它。对用户隐瞒这一事实是100%的误导。Fortran中的通用接口与Java接口不同。它们只是描述重载函数的特殊语法。具有相同通用标识符的任何两个程序应不同。例如,它们可以在参数计数上有所不同。这是很常见的。我同意kemiisto的观点,如果你想使用一个通用接口,如果不想,那么你就不。。。如果我明白了,你是说你想让用户调用inverse\u cdf(dist,p)
和inverse\u deterministic\u cdf(dist,p)
?@steabert:用户永远没有理由直接调用inverse\u deterministic\u cdf
,就好像他们知道自己有一个确定性变量一样,然后,逆函数总是返回该值(如本函数所示)。该函数允许用户以不可知的方式将确定性变量与随机变量相结合。我对来自C++/Java的背景感到非常内疚,这肯定会影响我对优雅的期望。你可以抑制警告,也可以使用OOP将其带到顶部。我看不到第三条路。你想要的行为在我听来完全像多态性。程序编程中没有类似的东西。或者你认为开国元勋们为什么会发明OOP?;-)对于确定性“随机”变量,无论是否指定了p
,反向cdf始终为dist%值。也就是说,pdf是一个Dirac delta函数,位于dist%值处。(更准确地说,概率分布函数是δ(x-dist%值)
)