4

gfortranを使用してソースからビルドすることにより、レガシーFORTRANコードを機能させようとしています。ようやく正常にビルドできましたが、実行時に範囲外エラーが発生します。私は gdb を使用し、エラーを loc() 組み込み関数を使用する関数まで追跡しました。渡された整数値 ae を使用して の値を出力しようとすると、loc(ae)「現在のコンテキストにはシンボル "loc" がありません」というエラーが表示されます。ifort 11.x でコンパイルを試み、DDT でデバッグしたところ、同じエラーが発生しました。私にとって、これはコンパイラが組み込みについて何も知らないことを意味します。

少し読んだだけで、loc 組み込み関数が F77 標準の一部ではないことが明らかになったので、それが問題の一部である可能性があります。以下に組み込みの定義を投稿しましたが、それをコードに実装する方法がわからないため、loc() を使用できます。

アドバイスはありますか、それとも私の問題を誤解していますか? gfortran と ifort の両方が範囲外エラーのために同じ場所でクラッシュしますが、loc() を使用する関数は両方のコンパイラ間で同じ大きな数を返すためです。両方のコンパイラが loc に対して同じ値を返すと、 loc() が機能しないというのは少し奇妙に思えます。

使用法:

iaddr = loc(obj)

どこ:

obj は、アドレスが必要な変数、配列、関数、またはサブルーチンです。iaddr は、「obj」のアドレスを持つ整数です。アドレスは、LARn 命令によって格納されるものと同じ形式です。

説明:

LOC は、何かのアドレスを取得するために使用されます。返される値は Fortran 内ではあまり役に立ちませんが、GMAP サブルーチンや非常に特殊なデバッグに必要になる場合があります。

4

2 に答える 2

5

いいえ、それがコンパイルされるという事実は、コンパイラによって認識されていることを意味しloc ます。gdb がそれを認識していないということは、デバッガーが認識していないということです (おそらくmatmult組み込みも認識していません)。

loc広く利用可能な非標準拡張機能です。私はそれらが嫌いです。どこでも機能する標準が必要な場合は、Fortran2003の C<->Fortran 相互運用性標準の一部である c_loc を使用できます。C ルーチンに渡すことができるポインタを返します。

loc 呼び出しの値はどのように使用されていますか?

于 2011-05-03T22:05:53.057 に答える
0

Gfortran loc は、配列での動作が他のコンパイラとは少し異なるようです。たとえば、配列のコピーなどをチェックするために使用している場合は、最初の要素 loc(obj(1,1)) などの loc を実行することをお勧めします。これは、私が intel で考えている loc と同等ですが、gfortran では、代わりに別のアドレスが与えられます (まったく同じメモリ レイアウトを共有する 2 つの配列では、loc の結果が異なります)。

于 2011-05-04T08:16:35.427 に答える