インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

コンソールの使用

Windows* システム上では、コンソールウィンドウで文字の入出力が可能です (グラフィックは不可)。

例えば、Fortran の WRITE (またはほかの) 文により、Fortran 論理ユニット 6 に (明示的または暗黙的に) 書き込まれたデータはコンソールウィンドウに文字として表示されます。同様に、Fortran の READ (またはほかの) 文によりユニット 5 に読み込まれたデータはキーボードからの文字入力として受け付けられます。

コンソールは、次の 2 つの要素で構成されています。

コンソール・スクリーン・バッファーがコンソールウィンドウよりも大きい場合、スクロールバーが自動的に提供されます。コンソール・スクリーン・バッファーのサイズは、コンソールウィンドウのサイズ以上でなければなりません。バッファーがコンソールウィンドウのサイズよりも小さい場合、エラーが発生します。数百行以上のテキストの表示が必要なアプリケーションでは、テキストを素早くスクロールできることが重要です。

Fortran コンソール・アプリケーションでは自動でコンソールが提供されます。Fortran QuickWin (および Fortran スタンダード・グラフィックス) アプリケーションではコンソールは提供されませんが、プログラムウィンドウにより Fortran 文からの出力を表示し、入力を受け付けることができます。

次に示すインテル® Fortran のプロジェクトの種類でのみアプリケーション・コンソール・ウィンドウが提供されています。

プロジェクトの種類

提供されるコンソールの説明

Fortran コンソール

テキストのみを使用する文字セル・アプリケーション用のコンソールウィンドウが提供されます。

コマンドプロンプトから Fortran コンソール・アプリケーションを実行すると、既存のコンソール環境が使用されます。Windows* または Developer Studio で ([デバッグ] メニューから [デバッグなしで開始] を選択して) アプリケーションを実行すると、新規のコンソール環境が作成されます。

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

Fortran QuickWin または Fortran スタンダード・グラフィックス

コンソールウィンドウは提供されませんが、ユニット 6 への出力とユニット 5 への入力がアプリケーション・プログラム・ウィンドウに提供されます。プログラムウィンドウはテキストとグラフィックの両方を処理しなければならないため、テキストのみを使用するコンソールよりも効率的ではありません。Fortran QuickWin または Fortran スタンダード・グラフィックスのプログラムウィンドウ (または子ウィンドウ) は、コンソールに似たウィンドウを提供します。

「Fortran QuickWin アプリケーションおよび Fortran スタンダード・グラフィックス・アプリケーションでのコンソールの使用」を参照してください。

Fortran ウィンドウ

コンソールウィンドウは提供されませんが、Windows* API ルーチンを使用してコンソールウィンドウを作成することができます。「Fortran ウィンドウ・アプリケーションおよび Fortran DLL アプリケーションでのコンソールの使用」を参照してください。

Fortran DLL

コンソールウィンドウは提供されませんが、Win32 ルーチンを使用してコンソールウィンドウを作成することができます。「Fortran ウィンドウ・アプリケーションおよび Fortran DLL アプリケーションでのコンソールの使用」を参照してください。

Fortran スタティック・ライブラリー

ライブラリー内のオブジェクト・コードを参照するメイン・アプリケーションのプロジェクトの種類に依存します (プロジェクトの種類を参照)。

以下で説明する Windows* API ルーチンに加えて、コンソールの使用に関連したほかのルーチンがあります。Microsoft* Platform Platform SDK ドキュメントを参照してください。

Fortran QuickWin アプリケーションおよび Fortran スタンダード・グラフィックス・アプリケーションでのコンソールの使用

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

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

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

Fortran ウィンドウ・アプリケーションおよび Fortran DLL アプリケーションでのコンソールの使用

Fortran ウィンドウ・アプリケーションまたは Fortran DLL アプリケーションでは、コンソールが作成される前に WRITE 文と READ (またはほかの) 文を使用してコンソールに書き込もうとすると、ランタイムエラーが発生します (WRITE エラーなど)。

Fortran DLL により作成されるコンソールは、メイン・アプリケーション関連のアプリケーション・コンソール・ウィンドウとは性質が異なります。Fortran DLL アプリケーションは、独自のコンソールもアプリケーションも持たないため Windows* API ルーチンを使用してコンソールを作成 (割り当て) しなければなりません。Fortran QuickWin アプリケーションまたは Fortran スタンダード・グラフィックス・アプリケーションのメインプログラムと一緒に使用する場合、Fortran DLL はテキストのみを使用する非常に効率的なコンソールウィンドウをメイン・アプリケーションに提供します。

Fortran DLL アプリケーションと同様に、Fortran ウィンドウ・アプリケーションも独自のコンソールやアプリケーション・ウィンドウを持たないないため、Windows* API ルーチンを使用してコンソールを作成しなければなりません。Fortran DLL でコンソールを割り当てた後、GetStdHandle Windows* API ルーチンにより返されるハンドル識別子は DLL が作成した実際のコンソールを参照します。

Fortran ウィンドウ・アプリケーションは、テキストのみを使用する非常に効率的なコンソールウィンドウを作成します。GetStdHandleWindows* API ルーチンにより返されるハンドル識別子は、Fortran ウィンドウが作成した実際のコンソールを参照します。

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

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

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

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

コンソールを作成するには、AllocConsole ルーチンを使用します。コンソールでの作業が終了したら、FreeConsole ルーチンでリソースを解放します。例えば、以下のプログラムは、コンソールを割り当て、バッファーサイズを大きくし、画面に書き込み、キーが押されるまで停止し、そしてコンソールの割り当てを解除します。

! 次の USE 文は Windows* ルーチン用の Fortran インターフェイスを提供する
    USE IFWIN
! データ宣言の開始
    integer lines,length
    logical status
    integer fhandle
    Type(T_COORD) wpos
! バッファーサイズ変数の設定
    length = 80
	 lines  = 90
! 実行可能コードの開始
!   !   コンソールの割り当て
    status = AllocConsole() ! 現在設定されているサイズのコンソールウィンドウを取得
    handle = GetStdHandle(STD_OUTPUT_HANDLE)
    wpos.x = length   ! 現在設定されているコンソールウィンドウの行の長さ以上でなければならない
    wpos.y = lines    ! 現在設定されているコンソールウィンドウの行数以上でなければならない
    ! コンソールウィンドウよりも大きいコンソールバッファーを設定する。そうすることで、
    ! コンソールウィンドウのスクロールバーを使ってコンソールバッファーをスクロールできる。
    status = SetConsoleScreenBufferSize(fhandle, wpos)
	 ! 必要に応じて、画面に出力する。READ を追加して割り当て解除の前に一時停止する。
	 write (*,*) "This is the console output! It might display instructions or data "
	 write (*,*) " "
	 write (*,*) "Press any key when done viewing "
	 read (*,*)
!   コンソールの割り当てを解除してリソースを解放する
    status = FreeConsole()    

Windows* API ルーチンの呼び出しについては、「Windows* API ルーチンの呼び出し」で説明されています。

DLL を使用している場合、DLL コードはサブプログラムを作成し、それらのシンボルをメインプログラムにエクスポートする必要があります。

コンソールの基本的な使用方法については、「コンソールウィンドウとコンソールバッファーのサイズの拡大」「カーソル位置での文字の書き込みと読み込み」で説明されています。

コンソールウィンドウとコンソールバッファーのサイズの拡大

Fortran コンソール・アプリケーションを実行する際、コンソールはすでに割り当てられています。コンソールウィンドウのサイズ、コンソールバッファーのサイズ、カーソルの位置を指定することができます。必要に応じて、次の Windows* API ルーチンを使用してコンソールバッファーとコンソールウィンドウのサイズを拡大することができます。

  1. まず、GetStdHandle ルーチンを使用して、コンソールウィンドウのハンドルを取得する必要があります。次に例を示します。

    ! USE 文を使用してルーチン・インターフェイスを含める
    use ifqwin
    use ifport
    use ifcore
    use ifwin
    ! データの割り当て解除
    integer fhandle
    logical lstat
    ! 実行可能コード
    fhandle = GetStdHandle(STD_OUTPUT_HANDLE)
    ! ...
  2. 必要に応じて、次のサイズの情報を取得します。

    • コンソールウィンドウの情報 (GetConsoleWindowInfo ルーチンを使用します)

    • コンソールバッファーの情報 (GetConsoleScreenBufferInfo ルーチンを使用します)

    次に例を示します。

    ! USE 文を使用してルーチン・インターフェイスを含める
    use ifqwin
    use ifport
    use ifcore
    use ifwin
    ! データの割り当て解除
    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)
    ! コンソールバッファーのサイズを取得するための実行可能コード
    lstat = GetConsoleScreenBufferInfo(fhandle, conbuf)
    write (*,*) " "
    write (*,*) "Window coordinates= ", conbuf.srWindow
    write (*,*) "Buffer size= ", conbuf.dwSize
    ! ...
  3. コンソールウィンドウとコンソールバッファーのサイズを設定するには、事前に取得しておいた fhandle と一緒に SetConsoleWindowInfo ルーチンと SetConsoleScreenBufferSize ルーチンを使用します。

!  USE 文を使用してルーチン・インターフェイスを含める
use ifqwin
use ifport
use ifcore
use ifwin
! データの割り当て解除
integer nlines, ncols
logical lstat   
Type(T_COORD) wpos
Type(T_SMALL_RECT) sr
Type(T_CONSOLE_SCREEN_BUFFER_INFO) cinfo
! コンソールウィンドウのサイズを設定する実行可能コード
sr.top    =   0
sr.left   =   0
sr.bottom =   40 ! コンソールバッファーの高さ以下
 -1
sr.right  =   60 ! 
コンソールバッファーの幅 -1 以下
lstat = SetConsoleWindowInfo(fhandle, .TRUE., sr)
! コンソールバッファーのサイズを設定するための実行可能コード
nlines = 100
ncols  =  80
wpos.x = ncols  ! コンソールウィンドウの幅以上
wpos.y = nlines ! コンソールウィンドウの高さ以下
lstat = SetConsoleScreenBufferSize(fhandle, wpos)
! ...

カーソル位置での文字の書き込みと読み込み

画面に文字を書き込む前に、SetConsoleCursorPosition ルーチンを使用して、カーソル位置を設定することができます。

 ! 以前のデータ宣言を使用する
 ! 位置を指定し 2 行を書き込む
   wpos.x = 5 ! 左から 6 文字目
   wpos.y = 5 ! 6 行下
   lstat = SetConsoleCursorPosition(fhandle, wpos)
   write(*,*) 'Six across Six down'
 ! ...

画面の適切な場所から読み取ることができますが、通常は、開始画面位置からの相対位置にカーソルを設定します。

  ! 以前のデータ宣言と以下のデータ宣言を使用する
   CHARACTER(Len=50) charin
 ! 画面の開始位置へ戻る
   wpos.x = 0 ! 左から 0 文字目
   wpos.y = 0 ! 0 行下
   lstat = SetConsoleCursorPosition(fhandle, wpos)
 ! 文字入力の位置を行 11 の先頭に指定する
   wpos.x = 0 ! 左から 0 文字目
   wpos.y = 10 ! 11 行下
   lstat = SetConsoleCursorPosition(fhandle, wpos)
   read(*,*) charin
 ! ...

コンソール I/O に対して、Fortran の WRITE 文と READ 文の代わりに、Windows* API ルーチンの WriteConsoleLineReadConsoleLine を使用することができます。

関連情報