2012-07-03 1 views
3

Я пытаюсь передать процедуру привязки типа в качестве аргумента другой подпрограмме. Я хочу знать, возможно ли это в Фортране. Вот фрагмент кода, который показывает, что я пытаюсь сделать.Связанные процедуры в качестве аргументов

module type_definitions 
type test_type 
integer :: i1, i2,i3 
contains 
    procedure :: add_integers_up 
end type test_type 
contains 
    subroutine add_integers_up(this,i4,ans) 
     class(test_type) :: this 
     integer :: i4,ans 
     ans = this%i1+this%i2+this%i3+i4 
    end subroutine add_integers_up 

subroutine print_result_of_subroutine(i4,random_subroutine) 
    integer :: i4,ans 

    interface 
    subroutine random_subroutine(i1,i2) 
     integer:: i1,i2 
    end subroutine random_subroutine 
    end interface 

    call random_subroutine(i4,ans) 
    write(*,*) ans 


end subroutine print_result_of_subroutine 


end module type_definitions 


program main 
    use type_definitions 
    implicit none 
    integer :: i1,i2,i3,i4 
    integer :: ans 
    type(test_type) :: test_obj 

    i1 =1; i2=2; i3=3 
    test_obj%i1 = i1 
    test_obj%i2 = i2 
    test_obj%i3 = i3 
    i4 = 4 

    call print_result_of_subroutine(i4,test_obj%add_integers_up) 

    end program main 

Это можно сделать в Фортране? Я получаю ошибку компилятора, когда пытаюсь скомпилировать этот код с помощью ifort.

ответ

5

test_obj% add_integers_up не является процедурой - это привязка, которая, случается, к процедуре, называемой add_integers_up. Вы не можете передать привязку в качестве фактического аргумента.

Если вы хотите передать конкретную процедуру, с которой связана привязка, выполните процедуру! Гипотетически:

call print_result_of_subroutine(i4, add_integers_up) 

Но, как отметили другие плакаты, в вашем примере кода интерфейс этой процедуры не соответствует интерфейсу соответствующего фиктивного аргумента в print_result_of_subroutine.

Если test_obj% add_integers_up ссылается на связанный с ним компонент указателя процедуры (а интерфейс для этого компонента соответствует тому, что ожидалось от print_result_of_subroutine), тогда все будет работать так, как вы ожидаете.

Обратите внимание, что Fortran 90 не поддерживает тип связан процедуры (или компоненты указателя процедуры) - ваш код очень требует FORtran 2003.

3

Вы не указали нам точное сообщение об ошибке, которое у вас есть, и я сам не пробовал ваш пример, но я уверен, что проблема в том, что интерфейс аргумента фиктивной процедуры не соответствует интерфейс фактического аргумента, который передается ему.

Более конкретно, random_subroutine объявлен как принимающий два аргумента, в то время как test_obj%add_integers_up принимает три аргумента; хотя один из них функционирует как аргумент фиктивного объекта-объекта, он по-прежнему считается частью интерфейса этой процедуры.

+0

Точно! Я могу только добавить, что я использовал бы «процедуру» или «модульную процедуру» в блоке интерфейса и не задавал бы интерфейс напрямую. –