Visual Fortran と Visual C++ が混在したプログラミング

Fortran と C の間の呼び出し,名付け,および引数渡しの規約を理解し,調整したら,アプリケーションをビルドすることができます。

Visual C/C++ を使用している場合,Microsoft ビジュアル開発環境中でコードの編集,コンパイル,およびデバッグを行うことができます。他の C コンパイラを使用する場合,「File」メニューから「New」を選択し,「Files」タブで「C++ Source File」を選択するか,エディタを起動した後に「View」メニューから「Properties」を選択し,ドロップダウンリストから選択することで,コードをビジュアル開発環境内で編集することができます。

ただし,Visual C/C++ を使用しない場合,Microsoft ビジュアル開発環境外でコードをコンパイルし,Fortran と C プログラムをコマンド行でビルドするか,コンパイル後の C の .OBJ ファイルを Microsoft ビジュアル開発環境内の Fortran プロジェクトに追加する必要があります。

コマンド行からのビルドの例として,FORSUBS.F90 に含まれている Fortran サブルーチンを呼び出す C の主プログラム CMAIN.C があった場合,CMAIN アプリケーションを次のコマンドで作成することができます。

	cl /c cmain.c
	DF cmain.obj forsubs.f90

Fortran (DF) コンパイラは,C で書かれ C コンパイラによってコンパイルされた主プログラムのオブジェクト・ファイルを受け付けます。DF コンパイラは .F90 ファイルをコンパイルし,リンカーが 2 つのオブジェクト・ファイルを使って CMAIN.EXE という名前の実行形式ファイルを作成します。

主プログラムがどちらの言語で書かれていても,リンクはどちらのコンパイラでも行うことができます。ただし,先に DF コンパイラを使用した場合,C コンパイラで DFOR.LIB をインクルードしなければならず,また C コンパイラが使用する LIBC.LIB の版で何らかの問題が生じる可能性があります。これらの理由から,先に C コンパイラを使用するようにするか,Fortran と C の両方がリンク先の基本 C ライブラリーに関して合致するようにプロジェクト設定を行うようにしてください。

アプリケーションは,C ライブラリーの 1 つのコピーにのみリンクすれば十分です。

ビジュアル開発環境を使ってアプリケーションをビルドする場合,Fortran は,「Project」メニューの「Settings」(「Project Settings」ダイアログボックス) で指定された情報に応じた基本ライブラリーを使用します。また,「Project Settings」ダイアログボックスの「Link」タブでもリンカー設定を指定することができます。

「Fortran」タブの「Libraries」カテゴリの中では,次のオプションが基本設定として選択されるライブラリーを決定します。

これらのオプションの組み合わせは,次表に示したライブラリーを使用します。

スタティック・プロジェクトと DLL プロジェクトのどちらか? マルチスレッド・ライブラリーの使用 C デバッグ・ライブラリーの使用 使用される Fortran リンク・ライブラリー 使用される C リンク・ライブラリー
スタティック 使用しない 使用しない dfor.lib libc.lib
スタティック 使用しない 使用する dfor.lib libcd.lib
スタティック 使用する 使用しない dformt.lib libcmt.lib
スタティック 使用する 使用する dformt.lib libcmtd.lib
DLL 使用しない 使用しない dfordll.lib (dforrt.dll) msvcrt.lib (msvcrt.dll)
DLL 使用しない 使用する dfordll.lib (dforrt.dll) msvcrtd.lib (msvcrtd.dll)
DLL 使用する 使用しない dformd.lib (dformd.dll) msvcrt.lib (msvcrt.dll)
DLL 使用する 使用する dformd.lib (dformd.dll) msvcrtd.lib (msvcrtd.dll)

Visual C++ がライブラリーを選択する方法も「Project」メニューの「Settings」によって決まりますが,この場合,「C/C++」タブの情報が使用されます。「Code Generation」カテゴリの「Use run-time library」には,次表に示した C ライブラリーが表示されます。

選択されるメニュー項目 有効にされる CL オプションまたはプロジェクト・タイプ オブジェクト・ファイルで指定される基本ライブラリー
Single-threaded /ML libc.lib
Multithreaded /MT libcmt.lib
Multithreaded DLL /MD msvcrt.lib (msvcrt.dll)
Debug Single-threaded /MLd libcd.lib
Debug Multithreaded /MTd libcmtd.lib
Debug Multithreaded DLL /MDd msvcrtd.lib (msvcrt.dll)

Microsoft Visual C/C++ を使用する場合,Microsoft ビジュアル開発環境は,プログラマが特殊な命令や操作を指定しなくても,Fortran と C の言語が混在したアプリケーションを透過的に作成することができます。プログラマは C と Fortran のプログラムを,その言語に応じた構文に基づく色分けを使って編集し,参照することができます。C のソース・ファイルを Fortran プロジェクトに,また Fortran のソース・ファイルを C プロジェクトに追加しても,それらのファイルは自動的にコンパイル,リンクされます。

Visual C++ と Fortran の言語が混在したアプリケーションをデバッグするとき,デバッガーはステップを行う過程でコードの形式に自動的に対応します。デバッグ対象のコードに基づいて,C または Fortran の式エバリュエータが自動的に選択され,スタック・ウィンドウには Fortran 手続の場合は Fortran のデータ型が,C 手続の場合は C のデータ型が表示されます。

出力を行う Fortran 副プログラムを呼び出している Visual C++ プログラムから出力を行うと,出力の順序は期待したとおりにならないことがあります。Visual C++ では,出力バッファはただちに書き出されず,バッファがいっぱいになったとき,I/O ストリームが閉じられたとき,またはプログラムが正常に終了したときに書き出されます。このとき,バッファは「フラッシュ」されたといいます。

Visual C++ と Fortran のプログラム単位に,期待どおりの出力を行わせるには,出力コマンドの後に,Visual C++ の flushallfflushfclosesetbuf または setvbuf のライブラリー呼び出しを使って,Visual C++ のバッファを明示的にフラッシュさせてください。

マルチスレッド・アプリケーションは完全なマルチスレッドのサポートを行わなければならないので,DFORMT.LIB を使用する場合,基本ライブラリーとして LIBCMT.LIB が指定されていることを確認してください。