Ответ 1
Чтобы определить функцию, которая возвращает массив, включает объявление функции внутри функции, например:
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
.
Передача размеров массивов в подпрограммы очень FORTRAN77 и почти всегда ненужная. Как правило, вы либо хотите работать с каждым элементом в массиве (как в примере синтаксиса массива), либо вы должны позволить подпрограмме определить размер массива, с которым он имеет дело.