【问题标题】:How do I suppress an unused dummy argument warning for a single function in Fortran?如何抑制 Fortran 中单个函数的未使用虚拟参数警告?
【发布时间】:2011-03-21 17:22:01
【问题描述】:

我有以下 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_deterministic_cdfinverse_cdf 接口的实现,这就是为什么这里有未使用的p。如您所见,我有一种方法可以抑制未使用的虚拟参数,但对我来说感觉不雅。有没有人有任何关于他们如何处理这个问题的最佳实践? (我也希望这与编译器无关。)我知道如何普遍抑制警告,但是当我有一个未使用的虚拟参数并且我没有预料到它时,我希望得到警告。 p>

编辑添加(根据要求):

inverse_cdf 接口是这样定义的:

INTERFACE inverse_cdf
    MODULE PROCEDURE inverse_distribution_cdf, inverse_normal_cdf, inverse_lognormal_cdf, inverse_deterministic_cdf
END INTERFACE

【问题讨论】:

  • 请告诉我们你如何定义一个 inverse_cdf 接口。

标签: fortran compiler-warnings


【解决方案1】:

我的猜测是您需要定义一个通用接口

stuff.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

【讨论】:

  • 我有一个通用接口 (inverse_cdf),但它是用两个参数调用的,因此没有使用虚拟参数。我想要的是用户不必编写不同的代码来处理确定性“随机”变量而不是处理真正的随机变量(例如,正态分布)。
  • 嗯...我什至无法理解您的意图。如果您在函数调用中不需要第二个参数 - 您不需要它。向用户隐藏这一事实是 100% 的误导。 Fortran 中的通用接口与 Java 接口不同。它们只是描述重载函数的一种特殊语法。具有相同通用标识符的任何两个过程都应不同。例如,它们的参数计数可能不同。这很常见。
  • 我同意 kemiisto 的观点,如果你想重载使用通用接口,如果不是,那么你不要......如果我明白了,你是说你希望用户打电话给inverse_cdf(dist, p)inverse_deterministic_cdf(dist, p)?
  • @steabert:用户永远不会有理由直接调用inverse_deterministic_cdf,就好像他们知道他们有一个确定性变量一样,然后 inverse_deterministic_cdf 函数总是返回该值(如本函数所示)。该功能允许用户以不可知的方式将确定性变量与随机变量结合起来。我肯定对来自 C++/Java 背景感到内疚,这肯定会影响我对优雅的期望。
  • 您可以取消警告或使用 OOP 并将其置于顶部。我看不到第三种方式。你想要的行为对我来说听起来完全像多态性。程序编程中没有类似物。或者你为什么认为开国元勋发明了面向对象编程? ;-)
【解决方案2】:

既然你的过程在一个模块中(因此,这个过程有一个明确的接口),为什么不使用一个可选参数呢?例如。像

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

【讨论】:

  • 对于确定性“随机”变量,无论是否指定了 p,逆 cdf 始终为 dist%value。即,pdf 是位于dist%value 的狄拉克三角函数。 (更准确地说,概率分布函数是δ(x - dist%value)。)
猜你喜欢
  • 2014-04-24
  • 1970-01-01
  • 2014-12-23
  • 2015-10-16
  • 2019-12-21
  • 1970-01-01
  • 2017-09-03
  • 2022-08-03
  • 2021-03-13
相关资源
最近更新 更多