Подтвердить что ты не робот

Функция Возвращение массива в Fortran

Я понимаю, что вы можете вернуть массив из функции в 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)

или что-то, что я получаю при ошибке компиляции.

4b9b3361

Ответ 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 и почти всегда ненужная. Как правило, вы либо хотите работать с каждым элементом в массиве (как в примере синтаксиса массива), либо вы должны позволить подпрограмме определить размер массива, с которым он имеет дело.

Ответ 2

Я согласен с предыдущим ответчиком в следующем:

polynomialMult = x + 1

Однако, не зная, что polyomialMult и x являются массивами, можно предположить, что это скалярная операция. Я предпочитаю быть очевидным и делать это так:

polynomialMult(:) = x(:) + 1

Я даже настаивал на том, что кодеры в моей группе делают это так. Я не люблю работать, чтобы понять, кто-то код. - Я хочу, чтобы это было очевидно, что они делают