如何在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)

我有以下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) :: 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%值)