Вопрос:
Я понимаю, что вы можете вернуть массив из функции в Fortran, но по какой-то причине мой код возвращает только первое значение в массиве, к которому я обращаюсь, чтобы он возвращался. Это функция:
function polynomialMult(npts,x,y) integer npts double precision x(npts), results(npts + 1), y(npts,npts) polynomialMult = x(1:npts) + 1 end function
и вот где я его называю
C(1:numPoints) = polynomialMult(numPoints,x,f) print *, C(1:numPoints)`
прямо сейчас он не делает ничего полезного, потому что я пытаюсь понять синтаксис, прежде чем писать логику. Я видел некоторые вещи о задании типов для функций, но когда я пишу
integer function polynomialMult(npts,x,y)
или что-то, что я получаю при ошибке компиляции.
Лучший ответ:
Чтобы определить функцию, которая возвращает массив, включает объявление функции внутри функции, например:
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 и почти всегда ненужная. Как правило, вы либо хотите работать с каждым элементом в массиве (как в примере синтаксиса массива), либо вы должны позволить подпрограмме определить размер массива, с которым он имеет дело.
Ответ №1
Я согласен с предыдущим ответчиком в следующем:
polynomialMult = x + 1
Однако, не зная, что polyomialMult и x являются массивами, можно предположить, что это скалярная операция. Я предпочитаю быть очевидным и делать это так:
polynomialMult(:) = x(:) + 1
Я даже настаивал на том, что кодеры в моей группе делают это так. Я не люблю работать, чтобы понять, кто-то код. – Я хочу, чтобы это было очевидно, что они делают