2015-09-27 2 views
1

я превратил проблему с более сложной F90-коды в следующее:использование массив функция в качестве аргумента другой функции

module userfunctions 

implicit none 

contains 

    function Function1(Argument,ArgumentSize) 

     ! Input 
     integer, intent(in)       ::  ArgumentSize 
     real,dimension(ArgumentSize),intent(in)  ::  Argument 

     ! Output 
     real,dimension(ArgumentSize)    ::  Function1  

     ! Local 
     integer     ::  i 

     Function1 = Argument 

     ! Random operation on argument, resembling generic vector function 
     do i=1,ArgumentSize 

      Function1(i) = Function1(i)**2 

     end do 

    end function Function1 


    function Function2(RandomFunction,Argument,ArgumentSize) 


    ! Input 
    integer, intent(in)       ::  ArgumentSize 
    real,dimension(ArgumentSize), intent(in) ::  Argument 

    ! Array-type function of dimension ArgumentSize 
    real,external      ::  RandomFunction 

    ! Evaluate RandomFunction to 
    real,dimension(ArgumentSize)  ::  Value 

    ! Output 
    real        ::  Function2 

    ! assign evaluation of RandomFunction to Value 
    Value = RandomFunction(Argument,ArgumentSize) 

    Function2 = dot_product(Value,Value) 

    end function Function2 

end module userfunctions 



    program Fortran_Console_002 

     use userfunctions 

     implicit none 

     real     ::  Result1 
     real,dimension(6)  ::  Vector1 

     Vector1 = 2 

     Result1 = Function2(Function1,Vector1,6) 

     write(*,*) Result1 


    end program Fortran_Console_002 

Результат должен быть «96». Компиляция это с Visual Studio 2013 и Intel Fortran производит следующее сообщение об ошибке:

Error 1 error #6634: The shape matching rules of actual arguments and dummy arguments have been violated. [FUNCTION1]

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

Я использую Visual Studio 2013 для этого из-за удобства. Реальная часть должна быть скомпилирована с использованием Compaq Visual Fortran 6 на виртуальной машине, которая, насколько мне известно, совместима только с fortran90.

ответ

2

См. How to pass subroutine names as arguments in Fortran? для общих правил.

Не используйте external здесь. Он несовместим с расширенными функциями, такими как функции с оценкой массива. Как правило, external предназначен только для старых программ в стиле FORTRAN 77. Сделайте блок интерфейса (см. Ссылку) или попробуйте

procedure(Function1) :: RandomFunction 

вместо этого (Fortran 2003).

+0

Спасибо большое! Он не сделал этого трюка сразу, но полностью толкнул меня в правильном направлении. – Oshibai

Смежные вопросы