私は、C 関数への単一の呼び出しを追加して、巨大な Fortran 2003 プログラムを更新する必要がある C プログラマーです。
最初に、ループ カウンター (および可能であれば日付/時刻) を含む文字列を使用して C 関数を内部から正しく呼び出す最小限の Fortran ラッパー (最新の自由形式の Fortran では、シャウトなし) を作成する必要があります。ループ。
これは「簡単」なはずですが、私が行った検索では、動作するプログラムを作成するのに十分なスニペットが得られませんでした。
最近の 64 ビット バージョンの gfortran と Intel ifort コンパイラを 64 ビット Linux で使用していますが、テスト コードは両方のコンパイラを使用してコンパイルする必要があります。
ファイル send_to_port.c の C 定義は次のとおりです。
int send_to_port(int port, char *data, unsigned int length);
最後のパラメーターは、Fortran が末尾の null を気にする必要がないようにするために追加されました (私は C で処理します: data[length] = '\0';)。長さパラメーターは Fortran によって「自動的に」追加されることを理解しているため、Fortran 呼び出しには、整数のポート番号と送信する文字列の 2 つのパラメーターしかありません。
次の gfortran 行と同等の ifort を使用してコードをコンパイルしたいと考えています。
gfortran -ffree-form test.f -o test send_to_port.o
最小限のコードを探しています。約 10 ~ 20 行である必要があると考えていますが、Fortran についてはわかりません。test.f の現在の編集バッファーは次のとおりです (コンパイルされません)。
use iso_c_binding
use iso_fortran_env, stdout => output_unit
implicit none
! Fortran interface to C routine:
! int send_to_port(int port, char *data, unsigned int length);
interface
integter(c_int) function send_to_port(port, data) bind(C)
integer(c_int), value :: port
character(kind=c_char) :: data(*)
end interface
integer(c_int) retval, cnt, port
character(1024) str
cnt = 0
port = 5900
do ! Infinite loop (^C to exit)
call fdate(date)
cnt = cnt + 1
write(str, "(A,A,I8)") date, ": Iteration = ", cnt
write(stdout, *) str ! Show what's about to be sent
retval = send_to_port(port, str) ! Send it
write(stdout, *) retval ! Show result
call sleep(1)
end do
end
ヘルプ?