この節では,Visual Fortran と Microsoft Visual C++ の言語が混在した環境で IMSL ライブラリーを使用する方法について説明します。
言語が混在したアプリケーション,または Windows アプリケーションでは,IMSL ルーチンが標準出力またはエラー出力に書き出すメッセージが画面に書き出されると,わかりにくくなることがあります。これを避けるには,Fortran ルーチンから UMACH を呼び出して,出力およびエラー装置を画面の代わりにファイルに再マップします。たとえば,次の自由書式プログラムは,VHSTP からの標準出力を STD.TXT ファイルに,AMACH からのエラー・メッセージを ERR.TXT ファイルに書き出します。
PROGRAM fileout ! このプログラムは,IMSL ルーチンからの標準出力とエラー出力を画面の代わりに ! ファイルにリダイレクトするための UMACH の使い方を示しています。 ! ルーチン AMACH と UMACH は,numerical_libraries モジュールで宣言されています。 USE numerical_libraries INTEGER STDU, ERRU REAL x, frq(10)/3.0,1.0,4.0,1.0,5.0,9.0,2.0,6.0,5.0,3.0/ ! IMSL 標準出力を装置番号 8 の STD.TXT にリダイレクトします。 CALL umach(-2, STDU) OPEN (unit=STDU, file='std.txt') CALL vhstp(10,frq,1,'Histogram Plot') CLOSE(8) ! IMSL エラー出力を装置番号 9 の ERR.TXT にリダイレクトします。 CALL umach(-3, ERRU) OPEN (unit=ERRU, file='err.txt') x = amach(0) ! 不正なパラメタ・エラー CLOSE(9) END
次に,IMSL ルーチン VHSTP から STD.TXT に書き出される標準出力を示します。
1 Histogram Plot Frequency------------------------- 9 * I * 8 * I * 7 * I * 6 * I I * 5 * I I I I * 4 * I I I I I * 3 * I I I I I I I * 2 * I I I I I I I I * 1 * I I I I I I I I I I * ---------------------------------- Class 5 10
次に,IMSL ルーチン AMACH から ERR.TXT に書き出されるエラー出力を示します。
*** TERMINAL ERROR 5 from AMACH. The argument must be between 1 and 8 ***inclusive. N = 0
次に,IMSL ライブラリーを使用する単純な Fortran プログラムの例を示します。
USE numerical_libraries real rinfp rinfp = AMACH(7) write(*,*) 'Real positive machine infinity = ',rinfp end
出力は次のようになります。
Real positive machine infinity = Infinity
対応する C の例を示します。
/* FILE CSAMP0.C */ #include <stdio.h> #include <stdlib.h>
extern float _stdcall AMACH(long *); main( ) { long n; float rinfp; n = 7; rinfp = AMACH(&n); printf("Real positive machine infinity = %16E\n", rinfp); fflush(stdout); _exit(0); }
この C 言語の例は,次の要素の使い方を示しています。
IMSL ライブラリーを呼び出すときに関数プロトタイプ中で必要な _stdcall 修飾子。
& アドレス演算子は,変数のアドレスを副プログラムに渡しています (IMSL ライブラリーは引数が参照で渡されると期待しています)。
C の例を cl コマンドでコンパイルすると,DF コマンドでリンクすることができるオブジェクト・ファイルが作成されます。
言語が混在したプログラミングについての詳細は,「言語が混在したプログラミング」を参照してください。