コンソールの使用

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 スタンダード・グラフィックス・アプリケーションでのコンソールの使用

Fortran QuickWin または Fortran スタンダード・グラフィックス・アプリケーションでは、デフォルトのプログラムウィンドウがグラフィックとテキストの両方を扱うため、QuickWin ウィンドウを使用することはあまり効率的ではありません。

WRITE 文と READ (またはほかの) 文を使用してコンソールウィンドウにアクセスできますが、大量のテキスト行の表示が必要なアプリケーションの場合は、効率性の観点から別のコンソールウィンドウを作成する DLL を作成することを検討してください。DLL アプリケーションでは、コンソールを割り当て、テキストを表示し、キーボードからの入力を受け付け、コンソールリソースを解放するための Windows* API ルーチンを呼び出す必要があります。

コンソールの基本的な使用方法については、「コンソールを使用するためのサンプルプログラム」で記述されています。

Fortran Windows* アプリケーションおよび Fortran DLL アプリケーションでのコンソールの使用

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 が作成した実際のコンソールを参照します。

コンソールの作成については、以下の「コンソールの割り当てと割り当て解除」を参照してください。

コンソールを使用するためのサンプルプログラム

次のセクションは、コンソールを使用するためのプログラム例を示しています。

コンソールの割り当てと割り当て解除

コンソールを作成するには、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 ルーチンを使用してコンソールバッファーとコンソールウィンドウのサイズを拡大することができます。

  1. まず、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)
    ! ...
  2. 必要に応じて、次のサイズの情報を取得します。

    • コンソールウィンドウの情報 (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
    ! ...
  3. コンソールウィンドウとコンソールバッファーのサイズを設定するには、事前に取得しておいた 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. 無断での引用、転載を禁じます。