Чтобы определить функцию, которая возвращает массив, включите объявление функции внутри функции, например:
function polynomialMult(npts,x,y)
integer npts
double precision x(npts), results(npts + 1), y(npts,npts)
! Change the next line to whatever you want
double precision, dimension(npts) :: polynomialMult
polynomialMult = x(1:npts) + 1
end function
Ваша декларация
integer function polynomialMult(npts,x,y)
объявляет, что функция возвращает целое число. Целое число , а не массив целых чисел. Я не думаю, что стандарт допускает объявления функций, такие как:
integer, dimension(10) function polynomialMult(npts,x,y)
но я могу ошибаться. Я всегда использую форму, которую я показал вам выше.
Если у вас есть актуальный компилятор Fortran, вы можете делать умные вещи, например возвращать выделенный массив. И я предлагаю вам выяснить синтаксис массива. Например, ваше заявление:
polynomialMult = x(1:npts) + 1
может быть более кратко написано:
polynomialMult = x + 1
, поскольку Fortran отобразит скалярное дополнение ко всем элементам массива x, который, как вы объявили, имеет только npts
элементов.
Передача размеров массивов в подпрограммы - это очень ФОРТРАН77 и почти всегда сейчас не нужно. Обычно вы либо хотите работать с каждым элементом в массиве (как в примере с синтаксисом массива), либо вы должны позволить подпрограмме определить размер массива, с которым он имеет дело.