4

Fortranで動的な2次元配列を作成して使用できます(77標準)。ここで、FortranプログラムからC関数(たとえば「malloc」を使用)で動的な2次元配列を作成し、Fortranプログラムを介してそれにアクセスできるようにしたいと思いました。Fortranでは、a(1:n、2)やa(1,2)のようなsmthを実行できるようにし、Fortranサブルーチンから配列を渡して取得できるようにしたいです。どうか、例を示して、思い出がどのように調整されるかを説明してください(可能であれば、私は本当に感謝します)。トンありがとう!また、2次元が直接動作できない場合は、C関数で1次元配列を作成しても問題ありませんが、2次元配列であるため、Fortranからアクセスします...ありがとうございます!!!

4

3 に答える 3

3

いいえ、FORTRAN 77 標準では動的配列を作成できません。

また、malloc を使用して Fortran の「動的」配列を作成することもできません。Fortran から割り当てを解除しようとすると、クラッシュが発生します。(もちろん、静的配列として通常の方法で使用できます。)

また、FORTRAN 77 を明示的に要求する場合は、a(1:n,2) のような表記を使用しないでください。この規格ではサポートされていません。

Fortran 2003 にはiso_c_bindingがありますが、FORTRAN 77 にはそのようなものはありません。想定サイズの配列のみを渡し、コンパイラで使用される名前マングリング (つまり、C の Fotran プロシージャ名の末尾のアンダースコア) を処理できます。

于 2012-06-29T20:46:39.990 に答える
3

最も重要な違いは、インデックスの順序です。Fortran は数学的表記法を使用するため、最初のインデックスは列インデックスで、2 番目のインデックスは行です。C は異なり、最初のインデックスは行です。

マクロはこれを説明します

#define AccessFortranArray(ArrayName, i,j) ArrayName[j][i]

a(1:n, 2) のようなことを C で実行することはできません。一時的な配列を作成し、ループ内で要素を抽出するだけです (行の範囲を抽出する場合を除きます。この場合は、 C でポインター演算を使用する)

このような C <-> Fortran 相互運用機能の参考資料があります。

これも多次元のサンプルです: Fortran との間で配列を渡す

"もう一つ"。

Fortran で表示されるようにするには、C 関数の名前の末尾にアンダースコアを含める必要があります。また、小文字にする必要があります。これはすべて、gcc/gfortran ペアを指します。

そしてもう一つ。Fortran 配列は 1 ベースであり、C 配列は 0 ベースであることを知っているので (Jim Balter がコメントでこれを言っています)、配列を渡すことができると言いました。

そして3つ目。大きなデータ ブロックだけが必要な場合は、リンク設定や関数呼び出し規則をいじる代わりに、COMMON ブロックを使用します。

このような

/* C Code */

extern struct
{
   double arr[100];
} thearr_;

そしてFortran:

real*8 arr(100)

common/TheArr/ arr
于 2012-06-29T20:24:39.590 に答える
2

FORTRAN 77 でこれらのことを行う必要があるのはなぜですか? Fortran 2003、または ISO C Binding を使用した Fortran 95 では、これらははるかに簡単です。ISO C Binding を使用した Fortran 95 レベルの現在のほぼすべての Fortran コンパイラ。この組み合わせにより、必要な機能が言語標準の一部として提供されるため、プラットフォームやコンパイラに依存しない方法で提供されます。

動的配列を作成する必要があるだけの場合は、割り当て可能な配列を使用して Fortran 95 で直接作成できます。変更したくない FORTRAN 77 コードがある場合は、Fortran 95 コードをいくつか作成して、2 つを混在させることができます。Fortran 95 で作成された割付け配列を、割付け配列として宣言していない別の Fortran プロシージャに渡すことができます。

何らかの理由で配列を C で作成する必要がある場合は、ISO C バインディングを使用して C ルーチンを Fortran で記述します。C で malloc を使用して作成された配列は、Fortran 型 C_PTR で Fortran に渡されます。そのストレージは、Fortran 組み込みサブルーチン c_f_pointer を使用して Fortran 配列に接続されます。その後、Fortran 配列を使用しますが、これは Fortran 配列と同じです。

多次元配列のインデックスの順序が言語間で異なることは事実です。これは、Fortran が列優先の言語であり、C が行優先の言語であるためです。ただし、Fortran 配列がインデックス付きである必要はありません。これは単なるデフォルトです。実数配列 (0:99) の宣言で開始インデックスを変更できます。または、ポインター境界の再割り当てを伴う c_f_pointer を使用したポインター配列セットアップの場合: array (0:99) => array

于 2012-06-29T22:34:12.053 に答える