Как подавить предупреждение о неиспользованном фиктивном аргументе для одной функции в Фортране? - PullRequest
2 голосов
/ 21 марта 2011

У меня есть следующий код 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_cdf - это реализация интерфейса inverse_cdf, поэтому здесь есть неиспользованный p.Как вы можете видеть, у меня есть метод подавления неиспользованного фиктивного аргумента, но он кажется мне не изящным.У кого-нибудь есть лучшие практики, как они справляются с этим?(Я также хочу, чтобы это не зависело от компилятора.) Я знаю, как универсально подавлять предупреждения, но я хочу, чтобы меня предупреждали , когда у меня есть неиспользуемый фиктивный аргумент, и я его не ожидаю.

Изменить, чтобы добавить (по запросу):

Интерфейс inverse_cdf определяется следующим образом:

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

Ответы [ 2 ]

3 голосов
/ 21 марта 2011

Мне кажется, вам нужно определить универсальный интерфейс .

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
0 голосов
/ 22 марта 2011

Поскольку ваша процедура находится в модуле (и, следовательно, процедура имеет явный интерфейс), почему бы не использовать необязательный аргумент? Например. что-то вроде


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...