3

gfortran でコンパイルするときに、イテレータと配列インデックスとして実数を使用することは可能ですか? コード例を次に示します。

program test
    real i
    real testarray(5)
    testarray = 0.
    do i=1,5
        write(*,*) testarray(i)
    end do
end program

私が書いていないコードを実行したい。Windows では intel コンパイラで問題なくコンパイルできますが、gfortran コンパイラを使用して Linux でコンパイルして実行したいと考えています。現在、実数を配列インデックスとして使用し、ループ反復子を使用するとエラーが発生します。

ありがとう!

4

3 に答える 3

2

警告を表示したくない場合は、 --std=legacy を試してください。それ以外の場合は、すでに提案されているように「gnu」。gfortran マニュアルには次のように記載されています。

拡張機能として、GNU Fortran では REAL 式または変数を配列インデックスとして使用できます。

std のデフォルト値は 'gnu' です。これは、GNU Fortran でサポートされているすべての拡張機能を含む Fortran 95 標準のスーパーセットを指定しますが、新しいコードでの使用が推奨されていない古い拡張機能については警告が表示されます。'legacy' 値は同等ですが、廃止された拡張機能に関する警告がなく、古い非標準プログラムに役立つ場合があります。

実数変数をループ インデックスとして使用することは、Fortran 95 で言語標準から削除されました。これを使用するレガシー コードの量が多いため、数十年にわたってコンパイラに残る可能性があります。

于 2012-12-18T21:07:33.257 に答える
2

実数を配列およびループのインデックスとして使用する必要があるのはなぜですか?

インデックスの実際の値を使用する必要がある場合は、次のようにします。

program test
    integer i
    real testarray(5)
    testarray = 0.

    do i=1,5
        testarray(i) = REAL(i)
    end do
end program

もちろん、必要に応じて別の方向に進むこともできます。

integer j 
do j = 1, INTEGER(testarray(1))
...
end do

例えば。標準では、整数以外のインデックスは許可されていません。どちらも意味がありません。配列の 1.5 インデックスは何ですか?

実際の配列のインデックス付けは、でコンパイルした場合に可能になるはずの拡張機能--std=gnuのようです。ただし、それは標準の一部ではないため、常にサポートされているとは限りません。

于 2012-12-18T19:20:43.657 に答える
1

別の可能性は、これを関数またはサブルーチンとして実装することです。ユーザー エクスペリエンスはtab(x)、配列や関数のように似ていますが、より多くの制御が可能になります (たとえば、値を定義した x0 の値の eps 内に x があるかどうかを確認できます)。

一般に、丸め誤差のため、この考えは危険に思えます。

有理数で作業している場合、または整数の srqt を例にとるとf(x)、関数として適用される場合も理想的なケースです (xたとえば、分子と分母を含む派生型の場合)。

したがって、私の最終的な答えは次のとおりです。関数として記述します。

于 2012-12-19T12:04:52.977 に答える