カスタム関数 > Fortran の使用 > カスタム関数での Fortran の使用について
カスタム関数での Fortran の使用について
Fortran ライブラリの作成
1. Compaq Visual Fortran 6.6B で新しい Fortran Static Library プロジェクトを作成して、ファイルをプロジェクトに追加します。
2. 「Build」メニューの「Set Active Configuration」をクリックして、「Release」を選択します。
3. コンパイルとビルドを行います。Fortran プロジェクトの Release サブフォルダに [myfortranlib].lib が含まれるようになりました。
カスタム関数の C のコードを修正します。
Fortran ライブラリがある場合、C コードに追加する必要があります。
extern void __stdcall FORTRANFUNCTION(const double *array1, const double *scalar1 [, etc.]);
// Since FORTRAN typically expects arguments by reference, arguments are passed
// as pointers. To pass values, the FORTRAN code must contain a compiler directive
// telling the function to expect a value rather than an address.
LRESULT mcadfunction(LPCOMPLEXARRAY array1, LPCCOMPLEXSCALAR scalar1, etc.)
// this defines the function before FUNCTIONINFO, using the same variable names
// called by the external FORTRAN function.
{
// some error checking goes here, followed by the
// actual call to the FORTRAN function. For example,
FORTRANFUNCTION(&array1->hReal[0][0], &scalar1->real [, etc.]);
// Either the function call must be in UPPERCASE, or you will have to set
// Settings->FORTRAN->External procedures->External name implementation
// to "Upper case" in your FORTRAN compiler. Any other C functionality follows...
return 0;
}
ライブラリ内のリンク
1. MS Visual C++ または Visual Studio で既存の C プロジェクトを開いて「Linker」タブを選択し、次に「Category」メニューで「Input」を選択します。[myfortranlib].lib をリストの最後の Object/library modules テキストボックスに入力します。
2. libc.lib「Ignore libraries」テキストボックスに入力します。
3. [myfortranlib].lib ファイルのパスを「Additional Library Path」テキストボックスに C:/temp のように入力します。
4. DLL のコンパイルとビルドを行います。
その他の情報
Fortran のコードは関数として直接実行するのではなく、別スレッドとして実行する必要があります。このようにすることで、Esc キーの押下などでプロセスが強制終了した場合に、どの Fortran サブルーチンが現在アクティブなのかをチェックすることなくスレッド全体を強制終了できます。
Fortran コードの中のすべての STOP 文を、エラーコードを返す特殊関数に置き換えて、スレッドを円滑に強制終了する C プログラムを呼び出すようにすると便利です。
Fortran コードに文をコンソールに出力する PRINT が含まれる場合、コンソールをファイルに再割り当てすることで、画面ではなくファイルに出力されるよう変換できます。Fortran ルーチンがエラーで強制終了された場合、このログファイルを読み込んでウィンドウとして表示するように C++ のフロントエンドプロセッサをプログラムできます。この例を次に示します。
SUBROUTINE INIT_STDOUT ()
c this subro which redirects FORTRAN output to file
use dfwin
integer res
c CALL close_stdout
res=SETENVQQ("FOR_PRINT=C:/FORT_OUT.TXT")
c PRINT *, 'Print a character to initialize '
PRINT *,' '
RETURN
END
Fortran ベースの DLL を配布する場合、実行するコンピュータには適切な Fortran ランタイムライブラリがインストールされていなければなりません。使用できる Fortran ランタイムライブラリは次のとおりです。
DFORRT.DLL
DFORRTD.DLL
DFORMD.DLL
DFORMDD.DLL
DFDLG100.DLL
MSVCRT.DLL
これらの DLL がない場合、エラーが発生します。DLL は Fortran コンパイラに同梱されています。これらを Windows/system32/ ディレクトリまたは WINNT/system32/ ディレクトリにインストールする必要があります。
これは役に立ちましたか?