Windows* システム上では、一般にコンソールウィンドウで文字の入出力が可能です (グラフィックは不可)。
例えば、Fortran の WRITE (またはほかの) 文により、Fortran 論理ユニット 6 に (明示的または暗黙的に) 書き込まれたデータはコンソールウィンドウに文字として表示されます。同様に、Fortran の READ (またはほかの) 文によりユニット 5 に読み込まれたデータはキーボードからの文字入力として受け付けられます。
コンソールは、次の 2 つの要素で構成されています。
画面に文字を表示する実際のコンソールウィンドウ。
表示される文字を含むコンソールバッファー。
コンソール・スクリーン・バッファーがコンソールウィンドウよりも大きい場合、スクロールバーが自動的に提供されます。コンソール・スクリーン・バッファーのサイズは、コンソールウィンドウのサイズ以上でなければなりません (そうでない場合はエラーが発生します)。
数百行以上のテキストの表示が必要なアプリケーションでは、テキストを素早くスクロールできることが重要です。
Fortran コンソール・アプリケーションでは自動でコンソールが提供されます。Fortran QuickWin (および Fortran スタンダード・グラフィックス) アプリケーションではコンソールは提供されませんが、プログラムウィンドウにより Fortran 文からの出力を表示し、入力を受け付けることができます。
次に示すインテル® Fortran のプロジェクトの種類でのみアプリケーション・コンソール・ウィンドウが提供されています。
プロジェクトの種類 |
提供されるコンソールの説明 |
---|---|
Fortran コンソール |
テキストのみを使用する文字セル・アプリケーションの作成を目的にしているため、コンソールウィンドウが提供されます。 コマンドプロンプトから Fortran コンソール・アプリケーションを実行すると、既存のコンソール環境が使用されます。Windows または Developer Studio から ([Debug (デバッグ)] メニューから [Start Without Debugging (デバッグなしで開始)] を選択して) アプリケーションを実行すると、新規のコンソール環境が作成されます。 コンソールの基本的な使用方法については、「コンソールを使用するためのサンプルプログラム」で記述されています。 |
Fortran QuickWin または Fortran スタンダード・グラフィックス |
コンソールウィンドウは提供されませんが、ユニット 6 への出力とユニット 5 への入力がアプリケーション・プログラム・ウィンドウに提供されます。ただし、プログラムウィンドウはテキストとグラフィックの両方を処理しなければならないため、テキストのみの使用よりも効率的ではありません。Fortran QuickWin または Fortran スタンダード・グラフィックスのプログラムウィンドウ (または子ウィンドウ) は、コンソールに似たウィンドウを提供します。 「Fortran QuickWin アプリケーションおよび Fortran スタンダード・グラフィックス・アプリケーションでのコンソールの使用」を参照してください。 |
Fortran Windows |
コンソールウィンドウは提供されませんが、Windows* API ルーチンを使用してコンソールウィンドウを作成することができます。「Fortran Windows* アプリケーションおよび Fortran DLL アプリケーションでのコンソールの使用」を参照してください。 |
Fortran DLL |
コンソールウィンドウは提供されませんが、Win32 ルーチンを使用してコンソールウィンドウを作成することができます。「Fortran Windows* アプリケーションおよび Fortran DLL アプリケーションでのコンソールの使用」を参照してください。 |
Fortran スタティック・ライブラリー |
ライブラリー内のオブジェクト・コードを参照するメイン・アプリケーションのプロジェクトの種類に依存します (プロジェクトの種類を参照)。 |
以下で説明する Windows* API ルーチンに加えて、コンソールの使用に関連したほかのルーチンがあります。『Platform SDK』 ドキュメント (英語) を参照してください。
Fortran QuickWin または Fortran スタンダード・グラフィックス・アプリケーションでは、デフォルトのプログラムウィンドウがグラフィックとテキストの両方を扱うため、QuickWin ウィンドウを使用することはあまり効率的ではありません。
QuickWin ウィンドウは、大量のメモリーを使用するため、特定のサイズを超えることができません。
スクロールが遅くなります。
WRITE 文と READ (またはほかの) 文を使用してコンソールウィンドウにアクセスできますが、大量のテキスト行の表示が必要なアプリケーションの場合は、効率性の観点から別のコンソールウィンドウを作成する DLL を作成することを検討してください。DLL アプリケーションでは、コンソールを割り当て、テキストを表示し、キーボードからの入力を受け付け、コンソールリソースを解放するための Windows* API ルーチンを呼び出す必要があります。
コンソールの基本的な使用方法については、「コンソールを使用するためのサンプルプログラム」で記述されています。
Fortran Windows* アプリケーションまたは Fortran DLL アプリケーションでは、コンソールが作成される前に WRITE 文と READ (またはほかの) 文を使用してコンソールに書き込もうとすると、ランタイムエラーが発生します (WRITE エラーなど)。
Fortran DLL により作成されるコンソールは、メイン・アプリケーション関連のアプリケーション・コンソール・ウィンドウとは性質が異なります。Fortran DLL アプリケーションは、独自のコンソールもアプリケーションも持たないため Windows* API ルーチンを使用してコンソールを作成 (割り当て) しなければなりません。Fortran QuickWin アプリケーションまたは Fortran スタンダード・グラフィックス・アプリケーションのメインプログラムと一緒に使用する場合、Fortran DLL はテキストのみを使用する非常に効率的なコンソールウィンドウをメイン・アプリケーションに提供します。
Fortran DLL アプリケーションと同様に、Fortran Windows* アプリケーションも独自のコンソールやアプリケーション・ウィンドウを持たないないため、Windows* API ルーチンを使用してコンソールを作成しなければなりません。Fortran DLL でコンソールを割り当てた後、GetStdHandle Windows* API ルーチンにより返されるハンドル識別子は DLL が作成した実際のコンソールを参照します。
Fortran Windows* アプリケーションは、テキストのみを使用する非常に効率的なコンソールウィンドウを作成します。GetStdHandle Windows* API ルーチンにより返されるハンドル識別子は、Fortran Windows が作成した実際のコンソールを参照します。
コンソールの作成については、以下の「コンソールの割り当てと割り当て解除」を参照してください。
次のセクションは、コンソールを使用するためのプログラム例を示しています。
Fortran Windows* アプリケーションと DLL アプリケーションのためのコンソールの割り当てと割り当て解除
すべてのプロジェクトの種類で使用するためのコンソールウィンドウとコンソールバッファーのサイズの拡大
すべてのプロジェクトの種類でコンソールを使用するためのカーソル位置での文字の書き込みと読み込み
コンソールを作成するには、AllocConsole ルーチンを使用します。コンソールでの作業が終了したら、FreeConsole ルーチンでリソースを解放します。例えば、以下のプログラムは、コンソールを割り当て、バッファーサイズを大きくし、画面に書き込み、キーが押されるまで停止し、そしてコンソールの割り当てを解除します。
! The following USE statement provides Fortran interfaces to Windows routines USE IFWIN ! Begin data declarations integer lines,length logical status integer fhandle Type(T_COORD) wpos ! Set buffer size variables length = 80 lines = 90 ! Begin executable code ! Allocate a console status = AllocConsole() ! get a console window of the currently set size handle = GetStdHandle(STD_OUTPUT_HANDLE) wpos.x = length ! must be >= currently set console window line length wpos.y = lines ! must be >= currently set console window number of lines ! Set a console buffer bigger than the console window. This provides ! scroll bars on the console window to scroll through the console buffer status = SetConsoleScreenBufferSize(fhandle, wpos) ! Write to the screen as needed. Add a READ to pause before deallocation write (*,*) "This is the console output! It might display instructions or data " write (*,*) " " write (*,*) "Press any key when done viewing " read (*,*) ! Deallocate the console to free its resources. status = FreeConsole()
Windows* API ルーチンの呼び出しについては、「Windows* API ルーチンの呼び出し」で説明されています。
DLL を使用している場合、DLL コードはサブプログラムを作成し、それらのシンボルをメインプログラムにエクスポートする必要があります。
コンソールの基本的な使用方法については、「コンソールウィンドウとコンソールバッファーのサイズの拡大」と「カーソル位置での文字の書き込みと読み込み」で説明されています。
Fortran コンソール・アプリケーションを実行する際、コンソールはすでに割り当てられています。コンソールウィンドウのサイズ、コンソールバッファーのサイズ、カーソルの位置を指定することができます。
必要に応じて、次の Wndows API ルーチンを使用してコンソールバッファーとコンソールウィンドウのサイズを拡大することができます。
まず、GetStdHandle ルーチンを使用して、コンソールウィンドウのハンドルを取得する必要があります。次に例を示します。
! USE statements to include routine interfaces use ifqwin use ifport use ifcore use ifwin ! Data declarations integer fhandle logical lstat ! Executable code fhandle = GetStdHandle(STD_OUTPUT_HANDLE) ! ...
必要に応じて、次のサイズの情報を取得します。
コンソールウィンドウの情報 (GetConsoleWindowInfo ルーチンを使用します)
コンソールバッファーの情報 (GetConsoleScreenBufferInfo ルーチンを使用します)
次に例を示します。
! USE statements to include routine interfaces use ifqwin use ifport use ifcore use ifwin ! Data declarations integer fhandle logical lstat Type(T_CONSOLE_SCREEN_BUFFER_INFO) conbuf type (T_COORD) dwSize type (T_SMALL_RECT) srWindow fhandle = GetStdHandle(STD_OUTPUT_HANDLE) ! Executable code to get console buffer size lstat = GetConsoleScreenBufferInfo(fhandle, conbuf) write (*,*) " " write (*,*) "Window coordinates= ", conbuf.srWindow write (*,*) "Buffer size= ", conbuf.dwSize ! ...
コンソールウィンドウとコンソールバッファーのサイズを設定するには、事前に取得しておいた fhandle と一緒に SetConsoleWindowInfo ルーチンと SetConsoleScreenBufferSize ルーチンを使用します。
! USE statements to include routine interfaces use ifqwin use ifport use ifcore use ifwin ! Data declarations integer nlines, ncols logical lstat Type(T_COORD) wpos Type(T_SMALL_RECT) sr Type(T_CONSOLE_SCREEN_BUFFER_INFO) cinfo ! Executable code to set console window size sr.top = 0 sr.left = 0 sr.bottom = 40 ! <= console buffer height -1 sr.right = 60 ! <= console buffer width -1 lstat = SetConsoleWindowInfo(fhandle, .TRUE., sr) ! Executable code to set console buffer size nlines = 100 ncols = 80 wpos.x = ncols ! columns >= console window width wpos.y = nlines ! lines >= console window height lstat = SetConsoleScreenBufferSize(fhandle, wpos) ! ...
画面に文字を書き込む前に、SetConsoleCursorPosition ルーチンを使用して、カーソル位置を設定することができます。
! Use previous data declarations ! Position and write two lines wpos.x = 5 ! 6 characters from left wpos.y = 5 ! 6 lines down lstat = SetConsoleCursorPosition(fhandle, wpos) write(*,*) 'Six across Six down' ! ...
画面の適切な場所から読み取ることができますが、通常は、開始画面位置からの相対位置にカーソルを設定します。
! Use previous and the following data declaration CHARACTER(Len=50) charin ! Go back to beginning position of screen wpos.x = 0 ! 0 characters from left wpos.y = 0 ! 0 lines down lstat = SetConsoleCursorPosition(fhandle, wpos) ! Position character input at start of line 11 wpos.x = 0 ! first character from left wpos.y = 10 ! 11 lines down lstat = SetConsoleCursorPosition(fhandle, wpos) read(*,*) charin ! ...
コンソール I/O に対して、Fortran の WRITE 文と READ 文の代わりに、Windows* API ルーチンの WriteConsoleLine と ReadConsoleLine を使用することができます。
© 1996-2011 Intel Corporation. 無断での引用、転載を禁じます。