Fortran: как заставить несколько процедур использовать один и тот же интерфейс процедур

У меня есть код, который выглядит как

subroutine sub1(f)
    interface
        function f(x)
            (description of f)
        end function f
    end interface

    (do something with f)
end subroutine sub1

subroutine sub2(f)
    interface
        function f(x)
            (description of f)
        end function f
    end interface

    (do something with f)
end subroutine sub2

Однако две подпрограммы sub1 и sub2 используют одинаковые интерфейсы для фиктивной функции f. Как сделать так, чтобы эти две процедуры использовали один и тот же интерфейс (например, с помощью модуля)? Должен ли я использовать указатели процедур?


person Christopher A. Wong    schedule 21.01.2016    source источник


Ответы (1)


Вы можете определить такие многократно используемые «типы функций» как abstract interfaces в модулях:

module m
    implicit none
    abstract interface
        function der(x,y) result(yDot)
            real, intent(in) :: x, y
            real :: yDot
        end function
    end interface
end module

subroutine integrateEuler(derY,x0,xf,y)
    use m
    real, intent(in) :: x0, xf
    real, intent(inout) :: y
    procedure(der) :: derY
    ! code here
end subroutine

subroutine integrateRKF45(derY,x0,xf,y)
    use m
    real, intent(in) :: x0, xf
    real, intent(inout) :: y
    procedure(der) :: derY
    ! code here
end subroutine

Использование функций указателей не обязательно, но вы можете объявить их таким же образом: procedure(der), pointer :: funPtr => myFun

person Javier Martín    schedule 21.01.2016
comment
Спасибо, это помогло. Пробовал без реферата и конечно же не получилось. - person Christopher A. Wong; 22.01.2016