Функция, возвращающая массив в Фортране - PullRequest
21 голосов
/ 30 сентября 2010

Насколько я понимаю, вы можете вернуть массив из функции в Фортране, но по какой-то причине мой код возвращает только первое значение в массиве, которое я прошу вернуть.Это функция:

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)

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

Ответы [ 2 ]

29 голосов
/ 30 сентября 2010

Чтобы определить функцию, которая возвращает массив, включите объявление функции внутри функции, например:

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

3 голосов
/ 05 июня 2013

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

polynomialMult = x + 1

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

polynomialMult(:) = x(:) + 1

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

...