0

私はFortran77のダミーであり、常にC ++コーダーでしたが、何年も前からコードを変更する必要があります...文字列の可変サイズ配列を作成したいのですが、Fortranでこれを行う方法をオンラインで見つけることができません77.理想的には、両方の次元が可変の配列である必要がありますが、それが不可能な場合は、文字列の長さを修正できますが、文字列の数は可変である必要があります。

私はこれを試しました:

CHARACTER*32 STR1*(VAR1)
...
WRITE(6,*) STR1(10)

しかし、これは機能しません...

4

1 に答える 1

0

どうやら FORTRAN 77 は動的メモリ割り当てをサポートしていないようです。ac プログラムでメモリを割り当て、その結果を FORTRAN ルーチンに戻してみてください。

ここで行われたように http://owen.sj.ca.us/~rk/howto/FandC/FandC.mem.html

またはより明確に - ある種の相互運用機能を使用して ac メソッドを呼び出す

フォートランから。

Unix ポータブル Fortran-77 コンパイラ ('f77') は、ほぼ完全に C で記述されています。コンパイラの 2 番目のパスは、C コンパイラで使用されるものと同じであり、ほとんどの 'f77' ライブラリ ルーチンは、対応する C ライブラリ ルーチンへの単なるインターフェイスです。 . ただし、Fortran は C で使用されるようなデータ構造をサポートしていないため、「curses」ライブラリが提供するすべての機能を利用できない場合があります。「curses」でウィンドウを操作するのは特に困難です。データ構造を含むルーチンの使用に関心がある場合は、おそらく Fortran の代わりに C を使用する必要があります。

Fortran プログラムから C ルーチンを呼び出すには、いくつかの C コードを作成する必要があります。Fortran は引数を参照またはアドレスで渡すため、C 関数は変数をアドレスとして受け入れるように準備する必要があります。これは、ライブラリ関数を呼び出す前に、引数を適切に設定する Fortran から呼び出される C で関数を作成する必要があることを意味します。概略的には、これは次のようになります。

ルーチン名のアンダースコア ( _ ) に注意してください。

C ソース ファイル内:

foo_(bar) /* アンダースコアに注意 */ int bar; /変数はアドレスで渡されることに注意 */

{ : }

Fortran ソース ファイル内:

call foo(baz) /* 「baz」が整数であると仮定します。*/ { : }

Fortran は文字を使用して記号をまっすぐに保つため、アンダースコアは重要です。RS6000 でコンパイルしている場合、これはデフォルトの動作ではありませんが、RS6000 で -qextname オプションを使用してコンパイルすると、他のプラットフォームと同じように実行されます。

Fortran から C を呼び出す

以下の Fortran の例と、それが C ルーチンを呼び出す方法に注意してください。

initscr() を呼び出し、 clear() を呼び出します。. . move(x, y) を呼び出します。. . refresh() を呼び出す endwin() を呼び出す end

...ここで、x と y は新しい座標を指定する整数です。

Fortran からの Curses の呼び出し

「curses」ルーチン「move()」を呼び出していた場合、次のようにすることができます。

C ソース ファイルには、「curses」ライブラリ関数「move()」へのインターフェイス ルーチンと、他の「curses」関数へのインターフェイスを提供するその他の C 関数が含まれています。

#含む

initscr_() {initscr(); }

clear_() { clear(); }

move_(x, y) int *x, y; /これらはポインタです */ { move(*x, *y); }

refresh_() { リフレッシュ(); }

endwin_() { endwin(); }

ルーチンは、次のコマンドを使用してコンパイルされます。

cc -c curses.c f77 test.f curses.o -lcurses -ltermcap

Fortran ファイルの /usr/include/curses.h で定義されたマクロを使用している場合は、C 言語の規則を想定していることに注意してください。これは、Fortran で使用するときに得られる結果に影響を与える可能性があることに注意してください。

https://engineering.purdue.edu/ECN/Support/KB/Docs/CallingCFromFortranから

于 2011-09-12T08:18:56.273 に答える