web-dev-qa-db-ja.com

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)

または私がコンパイルエラーを受け取るものは何でも。

22
Statler

配列を返す関数を定義するには、次のように、関数内に関数宣言を含めます。

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)

関数が整数を返すことを宣言します。 An integer、整数の配列ではありません。標準では次のような関数宣言は許可されていないと思います。

integer, dimension(10) function polynomialMult(npts,x,y)

しかし、私は間違っている可能性があります。私はいつも上に示したフォームを使います。

最新のFortranコンパイラーがある場合は、割り当てられた配列を返すなどの賢いことを行うことができます。そして、配列構文を理解することをお勧めします。たとえば、ステートメント:

polynomialMult =  x(1:npts) + 1

より簡潔に書くことができます:

polynomialMult =  x + 1

fortranは、npts要素のみを持つように宣言した配列xのすべての要素にスカラー加算をマッピングするためです。

配列のサイズをサブルーチンに渡すことは非常にFORTRAN77であり、現在ほとんどの場合不要です。一般に、配列のすべての要素を操作する(配列構文の例のように)か、処理する配列のサイズをサブプログラムに計算させる必要があります。

31

私は以前のレスポンダーに以下のように機能することに同意します:

polynomialMult = x + 1

ただし、polynomialMultとxが配列であることを知らなくても、それがスカラー演算であると考えるかもしれません。私は明白であることを好み、次のようにします。

polynomialMult(:) = x(:) + 1

私のグループのコーダーはこの方法でそれを行うと主張しました。私は誰かのコードを理解するために一生懸命に働きたくありません-私は彼らが何をしているかを明白にしたいのです。

3
Marshall Buhl