OpenVMS
HP C ランタイム・ライブラリ・
リファレンス・マニュアル (上巻)


前へ 次へ 目次 索引


6.4 Curses の概要

Curses Screen Management 関数およびマクロを使用するときに,端末画面の初期化と復元のために使用しなければならないコマンドがあります。また,Curses が依存する定義済み変数と定数もあります。 例 6-1 は Curses を使用してプログラムを設定する方法を示しています。

例 6-1 Curses プログラム

(1)#include <curses.h> 
 
(2)WINDOW  *win1, *win2, *win3; 
 
main() 
{ 
(3)   initscr(); 
      . 
      . 
      . 
   endwin(); 
} 

例 6-1 の説明:

  1. プリプロセッサ・ディレクティブは <curses.h>ヘッダ・ファイルを取り込み,このヘッダ・ファイルが Curses をインプリメントするために使用する構造体と変数を定義します。 <curses.h>ヘッダ・ファイルは <stdio.h>ヘッダ・ファイルを取り込みます。したがって,プログラムのソース・コードで <stdio.h>を再び取り込むことにより,この操作を重複して実行する必要はありません。 Curses 関数やマクロを使用するには, <curses.h>を取り込む必要があります。

  2. 例の中で,WINDOW は <curses.h>に定義されている構造体です。各ユーザ指定ウィンドウはこの方法で宣言しなければなりません。 例 6-1 では, win1win2win3の 3 つのウィンドウが定義されています。

  3. initscr関数はウィンドウの編集セッションを開始し, endwin関数はウィンドウ編集セッションを終了します。 initscr関数は端末画面をクリアし (OpenVMS Curses の場合のみで, BSD ベースの Curses では画面をクリアしません),ウィンドウ stdscrおよび curscrの領域を割り当てます。 endwin関数はすべてのウィンドウを削除し,端末画面をクリアします。

大部分の Curses ユーザはウィンドウの定義と変更を行う必要があります。 例 6-2 は, 1 つのウィンドウの定義とそのウィンドウへの書き込みの方法を示しています。

例 6-2 ウィンドウの操作

#include <curses.h> 
 
WINDOW  *win1, *win2, *win3; 
 
main() 
{ 
   initscr(); 
 
(1)   win1 = newwin(24, 80, 0, 0); 
(2)   mvwaddstr(win1, 2, 2, "HELLO"); 
      . 
      . 
      . 
   endwin(); 
} 

例 6-2 の説明:

  1. newwin関数は,高さが 24 行,幅が 80 カラム,開始位置が座標 (0,0),つまり端末画面の左上の角であるウィンドウを定義します。プログラムでは,これらの属性を win1に代入しています。座標は (行,カラム) または (y,x) として指定します。

  2. mvwaddstrマクロは, moveマクロと addstrマクロを別々に呼び出した場合と同じ処理を実行します。 mvwaddstrマクロは,カーソルを指定された座標に移動し,文字列を stdscrに書き込みます。

注意

ほとんどの Curses マクロは,デフォルト設定で stdscrを更新します。他のウィンドウを更新する Curses 関数は,マクロと同じ名前ですが,先頭に接頭語 "w" が付いています。たとえば, addstrマクロは, stdscrの現在のカーソルの位置に指定された文字列を追加します。 waddstr関数は,指定されたウィンドウの現在のカーソルの位置に指定された文字列を追加します。

ウィンドウを更新する場合は,端末画面の原点ではなく,ウィンドウの原点を基準にしてカーソルの位置を指定します。たとえば,ウィンドウの開始位置が (10,10) で,ウィンドウの開始位置に文字を追加する場合は,(10,10) ではなく,座標 (0,0) を指定します。

例 6-2 の HELLO という文字列は,画面を再表示するまで端末画面に表示されません。画面を再表示するには, wrefresh関数を使用します。 例 6-3 は,端末画面に win1の内容を表示する方法を示しています。

例 6-3 端末画面の再表示

#include <curses.h> 
 
WINDOW  *win1, *win2, *win3; 
 
main() 
{ 
   initscr(); 
 
   win1 = newwin(22, 60, 0, 0); 
   mvwaddstr(win1, 2, 2, "HELLO"); 
   wrefresh(win1); 
      . 
      . 
      . 
   endwin(); 
} 

wrefresh関数は,端末画面で指定されたウィンドウの領域だけを更新します。このプログラムを実行すると,プログラムが endwin関数を実行するまで, HELLO という文字列が端末画面に表示されます。 wrefresh関数は,端末画面上のウィンドウの中で,別のウィンドウに重なっていない部分だけを再表示します。 win1が別のウィンドウと重なっているときに, win1の全部を端末画面に表示するには, touchwin関数を呼び出します。

6.5 定義済み変数と定数

<curses.h>ヘッダ・ファイルには, Curses のインプリメントに役立つ変数と定数が定義されています ( 表 6-2 を参照 )。

表 6-2 Curses の定義済み変数と#define 定数
名前 説明
curscr WINDOW * 現在の画面のウィンドウ
stdscr WINDOW * デフォルト・ウィンドウ
LINES int 端末画面の行数
COLS int 端末画面のカラム数
ERR --- 異常終了したルーチンのフラグ (0)
OK --- 正常終了したルーチンのフラグ (1)
TRUE --- ブール値 TRUE フラグ (1)
FALSE --- ブール値 FALSE フラグ (0)
_BLINK --- setattr clrattr のパラメータ
_BOLD --- setattr clrattr のパラメータ
_REVERSE --- setattr clrattr のパラメータ
_UNDERLINE --- setattr clrattr のパラメータ

たとえば,定義済みマクロ ERR を使用して, Curses 関数の正常終了または異常終了を判定することができます。 例 6-4 はこのような判定を行う方法を示しています。

例 6-4 Curses の定義済み変数

#include <curses.h> 
 
WINDOW  *win1, *win2, *win3; 
 
main() 
{ 
   initscr(); 
   win1 = newwin(10, 10, 1, 5); 
      . 
      . 
      . 
   if (mvwin(win1, 1, 10) == ERR) 
      addstr("The MVWIN function failed."); 
      . 
      . 
      . 
   endwin(); 
} 

例 6-4 で, mvwin関数が異常終了すると,プログラムは結果を示す文字列を stdscrに追加します。 Curses の mvwin関数はウィンドウの開始位置を移動します。

6.6 カーソルの移動

UNIX システム環境では, Curses 関数を使用して端末画面上でカーソルを移動できます。他のインプリメンテーションでは, Curses が move関数を使用してカーソルを移動することができ,ユーザが mvcur関数にカーソルの始点と終点を指定することもできます。この関数はカーソルを効率のよい方法で移動します。

HP C for OpenVMS Systems では,2 つの関数は機能的に同じであり,カーソルを移動する効率も同じです。

例 6-5 は, move関数と mvcur関数の使用方法を示しています。

例 6-5 カーソル移動関数

#include <curses.h> 
 
main() 
{ 
   initscr(); 
      . 
      . 
      . 
(1)   clear(); 
(2)   move(10, 10); 
(3)   move(LINES/2, COLS/2); 
(4)   mvcur(0, COLS-1, LINES-1, 0); 
      . 
      . 
      . 
   endwin(); 
} 
 

例 6-5 の説明:

  1. clearマクロは, stdscrを消去し,カーソルを座標 (0,0) に移動します。

  2. 最初の moveはカーソルを座標 (10,10) に移動します。

  3. 2 番目の moveは定義済み変数 LINES と COLS を使用して,画面の中心を計算します ( 画面上の LINES と COLS の値の半分の値を計算 )。

  4. mvcur関数は絶対アドレッシングを使用します。この関数はカーソルが現在右上の角にあることを要求することにより,画面の左下の角のアドレスを指定できます。カーソルの現在の位置が不確実な場合はこの方法を使用できますが, moveも同様の動作をします。

6.7 プログラムの例

次のプログラムの例は,多くの Curses マクロと関数の結果を示しています。プログラム・コードの各行の内容の理解に役立つように,各行の右側のコメントに説明が示されています。関数の詳細については,ソース・コード・リストの後の説明を参照してください。

例 6-6 は,1 つのユーザ定義ウィンドウと stdscrの定義および操作を示しています。

例 6-6 stdscr と,それに重なるウィンドウ

/*        CHAP_6_STDSCR_OCCLUDE.C                       */ 
 
/* This program defines one window: win1.  win1 is      */ 
/* located towards the center of the default window     */ 
/* stdscr.  When writing to an occluding window (win1)  */ 
/* that is later erased, the writing is erased as well. */ 
 
#include <curses.h>     /* Include header file.         */ 
 
WINDOW *win1;                   /* Define windows.      */ 
 
main() 
{ 
    char str[80];               /* Variable declaration.*/ 
 
    initscr();  /* Set up Curses.   */ 
    noecho();   /* Turn off echo.   */ 
 
    /* Create window.             */ 
    win1 = newwin(10, 20, 10, 10); 
 
    box(stdscr, '|', '-');  /* Draw a box around stdscr. */ 
    box(win1, '|', '-');    /* Draw a box around win1.   */ 
 
    refresh();  /* Display stdscr on screen.  */ 
 
    wrefresh(win1);     /* Display win1 on screen.  */ 
 
(1)   getstr(str);      /* Pause. Type a few words!   */ 
 
   mvaddstr(22, 1, str); 
(2)   getch(); 
     /* Add string to win1.        */ 
 
    mvwaddstr(win1, 5, 5, "Hello"); 
    wrefresh(win1);     /* Add win1 to terminal scr.  */ 
 
    getch();    /* Pause.  Press Return.      */ 
 
    delwin(win1);       /* Delete win1.           */ 
 
(3)   touchwin(stdscr); /* Refresh all of stdscr.     */ 
 
   getch();                   /* Pause.  Press Return.      */ 
   endwin();                  /* Ends session.              */ 
} 

例 6-6 の説明:

  1. プログラムは入力を待機します。端末画面へのエコー表示は, noechoマクロを使用して禁止されているため,入力した単語は stdscrに表示されません。しかし,マクロは入力された単語をプログラムの他の場所で使用するために,変数 strに格納します。

  2. getchマクロを実行すると,プログラムは一時停止します。画面の確認が完了したら,Return を押すことにより,プログラムを再開できます。 getchマクロは, refreshを呼び出さずに,端末画面で stdscrを再表示します。画面は 図 6-4 のようになります。

図 6-4 getch マクロの例


  1. touchwin関数は画面を再表示することで, stdscr全体が表示されるようにし,削除した重なり合うウィンドウが画面に表示されないようにします。


第 7 章
算術関数

表 7-1 は, HP C Run-Time Library (RTL) の算術関数を示しています。各関数の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル (下巻)』「リファレンス・セクション」を参照してください。

表 7-1 算術関数
関数 説明
abs 整数の絶対値を返す。
acos ラジアン単位の引数の逆余弦 (アークコサイン) を [0,pi] ラジアンの範囲で返す。
acosd (Alpha only) ラジアン単位の引数の逆余弦 (アークコサイン) を [0,180] 度の範囲で返す。
acosh (Alpha only) 引数の双曲線逆余弦 (アークコサイン) を返す。
asin ラジアン単位の引数の逆正弦 (アークサイン) を [ - pi/2,pi/2] ラジアンの範囲で返す。
asind (Alpha only) ラジアン単位の引数の逆正弦 (アークサイン) を [ -90,90 ] 度の範囲で返す。
asinh (Alpha only) 引数の双曲線逆正弦 (アークサイン) を返す。
atan ラジアン単位の引数の逆正接 (アークタンジェント) を [ - pi/2,pi/2] ラジアンの範囲で返す。
atand (Alpha only) ラジアン単位の引数の逆正接 (アークタンジェント) を [ -90,90 ] 度の範囲で返す。
atan2 y/ x (2 つのラジアン単位の引数) の逆正接 (アークタンジェント) を [ - pi,pi] ラジアンの範囲で返す。
atand2 (Alpha only) y/ x (2 つのラジアン単位の引数) の逆正接 (アークタンジェント) を [ -180,180 ] 度の範囲で返す。
atanh (Alpha only) ラジアン単位の引数の双曲線逆正接 (アークタンジェント) を返す。
cabs 複素数の絶対値を sqrt ( x 2 + y 2) として返す。
cbrt (Alpha only) 引数の四捨五入した立方根を返す。
ceil 引数に等しいか,それ以上の最小の整数を返す。
copysign (Alpha only) 最初の引数を 2 番目の引数と同じ符号で返す。
cos ラジアン単位の引数の余弦 (コサイン) をラジアン単位で返す。
cosd (Alpha only) ラジアン単位の引数の余弦 (コサイン) を度単位で返す。
cosh 引数の双曲線余弦 (コサイン) を返す。
cot ラジアン単位の引数の余接 (コタンジェント) をラジアン単位で返す。
cotd (Alpha only) ラジアン単位の引数の余接 (コタンジェント) を度単位で返す。
drand48 erand48
jrand48 lrand48
mrand48 nrand48
均一に分布した擬似乱数シーケンスを生成する。 48 ビットの負でない倍精度浮動小数点数値を返す。
erf (Alpha only) 引数のエラー関数を返す。
erfc (Alpha only) (1.0 - erf (x )) を返す。
exp e を底とする引数のべき乗を返す。
expm1 (Alpha only) exp (x ) - 1 を返す。
fabs 浮動小数点数値の絶対値を返す。
finite (Alpha only) 引数が有限の数値の場合は 1 を返し,無限の数値の場合は 0 を返す。
floor 引数に等しいか,それより小さい最大の整数を返す。
fmod 最初の引数を 2 番目の引数で除算した余りを浮動小数点数値として計算する。
fp_class (Alpha only) IEEE 浮動小数点数値のクラスを判断し, <fp_class.h> ヘッダ・ファイルから定数を返す。
isnan (Alpha only) NaN の判定をする。引数が NaN の場合は 1 を返し,それ以外の場合は 0 を返す。
j0, j1, jn (Alpha only) 第 1 種ベッセル関数を計算する。
frexp 浮動小数点数値の小数部と指数部を計算する。
hypot 2 つの引数の 2 乗の合計の平方根を返す。
initstate 乱数ジェネレータを初期化する。
labs 整数の絶対値を long int として返す。
lcong48 48 ビットの均一に分布した擬似乱数シーケンスを初期化する。
lgamma (Alpha only) ガンマ関数の対数を計算する。
llabs, qabs (Alpha only) __int64 整数の絶対値を返す。
ldexp 最初の引数に,2 を底とする 2 番目の引数のべき乗を乗算した値を返す。
ldiv, div 引数を除算して商と余りを返す。
lldiv, qdiv (Alpha only) 引数を除算して商と余りを返す。
log2 (Alpha only) ,log,log10 引数の対数を返す。
log1p (Alpha only) ln(1+ x) を正確に計算する。
logb (Alpha only) 基数に依存しない引数の指数を返す。
nextafter (Alpha only) y の方向に,マシンで表現可能な x の次の数値を返す。
nint (Alpha only) 引数に最も近い整数値を返す。
modf 最初の引数の正の小数部を返し,2 番目の引数によってアドレスが指定されるオブジェクトに整数部を代入する。
pow 最初の引数を底として,2 番目の引数のべき乗を返す。
rand, srand 0〜 2 31-1 の範囲で擬似乱数を返す。
random srandom よりランダムなシーケンスで擬似乱数を生成する。
rint (Alpha only) ユーザが指定した現在の IEEE 丸め方向に従って,引数を整数値に丸める。
scalb (Alpha only) 浮動小数点数値の指数部を返す。
seed48 srand48 48 ビットの乱数ジェネレータを初期化する。
setstate 再起動して,乱数ジェネレータを変更する。
sin ラジアン単位の引数の正弦 (サイン) をラジアン単位で返す。
sind (Alpha only) ラジアン単位の引数の正弦 (サイン) を度単位で返す。
sinh 引数の双曲線正弦 (サイン) を返す。
sqrt 引数の平方根を返す。
tan ラジアン単位の引数の正接 (タンジェント) をラジアン単位で返す。
tand (Alpha only) ラジアン単位の引数の正接 (タンジェント) を度単位で返す。
tanh 引数の双曲線正接 (タンジェント) を返す。
trunc (Alpha only) 引数を整数値に切り捨てる。
unordered (Alpha only) 引数のいずれか一方または両方が NaN の場合は 1 を返し,それ以外の場合は 0 を返す。
y0, y1, yn (Alpha only) 第 2 種ベッセル関数を計算する。


前へ 次へ 目次 索引