module aa
implicit none
public :: H
contains
function H(x,p) result(s)
real, dimension(:), intent(in) :: x,p
real, dimension(:), allocatable :: s
integer :: i, n
n = size(x, 1)
allocate(s(n))
do i=1, n
s(i) = x(i)**2 + p(i)**2
enddo
end function H
end module aa
program test
use aa
real, dimension(10) :: x, p
real, dimension(:), allocatable :: s
integer :: n
x(:) = 1.
p(:) = 1.
n = size(x, 1)
allocate(s(n))
s(:) = 0.
s = H(x,p)
print*, s
end program test
Скомпилировано и протестировано с GNU Fortran (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1) 7.4.0
На самом деле это не реальный случай пример программы, потому что если вы знаете размеры x
и p
, вы также знаете размеры s
, так что вы могли бы просто определить его вместо выделения. Но его можно использовать для обобщения модулей, если в модуле нет ссылки на какое-либо измерение.
Чтобы это работало, вы заметите, что s
должно быть allocatable и должно иметь было выделено перед вызовом функции.