я превратил проблему с более сложной 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.
Спасибо большое! Он не сделал этого трюка сразу, но полностью толкнул меня в правильном направлении. – Oshibai