String - みる会図書館


検索対象: 月刊 C MAGAZINE 1990年6月号
8件見つかりました。

1. 月刊 C MAGAZINE 1990年6月号

C 十十 プログラミング 入門 以外のほかの型には使わないのて、 , typedef を使いま 列の表現が最適化されていなかったりしているとこ ろて、す ( 注 2 ) ・双方リスト ・データベース dList 型 (List3) は , 双方リストのための抽象データ db 型 (List4) は , List1 のプログラムて、実際に使って 型て、 , その節点の node 型のリスト構造から構成され いる , データベースの役目を果たすデータ型て、す。 ます。また , その制御のために , イテレータ ( 反復子 ) この型は , 内部に先ほどの双方リストをもち , 各要 の ite 「型もあります。 素を保持しています。つまり , この型は , データを この双方リストは , その要素に後述の shop 型を以 保持するデータ構造の「覆い」にすぎません。ただし , 下の宣言により使っています。 これには , そのデータ構造が変更されようとも , そ れを使っているプログラムのコードは影響されない typedef shop E; ほんとうは汎用型 ( 本連載第 3 回 ( ' 90 年 3 月号 ) て、解説 という大きな利点があります。 しました ) にしたほうがよいのてすが , 今回は , これ string 型 (shop. h' shop. cc から抜粋 ) い st2 String 型 (shop. h,shop. cc から抜粋 ) / / GNU C + + 付属のライプラリ ( ⅱ bg + + ) での String 型の定義例 ( 一部変更済み ) struct StrRep { / / 文字列の内部表現 / / 文字列の長さ unsigned short len; / / 領域の大きさ unsigned short sz; char s[l] : / / 領域の先頭位置 List2 class String { protected : / / 文字列のデータ表現には StrRep 構造体を使う StrRep* rep : public: / / コンストラクタ , ディストラクタ String(void) : String (Stri ng& x) : String(const char* s) : Stri ng (void) : / * 代入演算子群 * / VOid operator=(String& y) : VO id operator= (const char* s) : VO id operator 十 = (Str ing& y) : VOid operator 十 =(const char* s) : / * 関係演算子群 * / friend int operator==(String& x. String& y) : friend int operator!=(String& x, String& y) : friend int operator く =(String& x, String& y) : friend int operator く (String& x, String& y) : friend int operator>=(String& x, String& y); friend int operator>(String& x, String& y) : / / ここで , 代入演算子がメンバ関数で定義され . 一方 , 関係演算子はフレンド関数で / / 定義されていることに注意しよう。その理由は . 前回述べたので , 参照して欲しい。 / * 型変換演算子など * / char& operator ロ (int i); const char* operator char*() : / * 入出力のために演算子 * / friend ostream& operator くく (ostream& s, String& x) : friend istream& operator>>(istream& s, String& x) : / / 本当はほかにも多数の操作 ( search など ) およびそれぞれの関数の実装があるが . / / ここでは省略する。 ( 注 2 ) 渟通の文字列型は , その表現が同じてあれば , それを共有する。 100 CMAGAZINE 19 6

2. 月刊 C MAGAZINE 1990年6月号

db 型 (main. cc から抜粋 ) #include "d い st. h" / / 抽象データ型の定義 / / データベース ( 双方リストのおおい ) class db { private: d い st a い st, public: node* append ()* e) : node* search(String s) : List4 / / 操作 append node* db : :append ()* e) { a い st. append (e) : / / 操作 search node* db::search(String s) { for (iter it(a い (t) : it() ! = NULL; it. next()) { if (s = ptr->key()) { / / キー情報の比較 return i t ( ) : return NUL し : shop 型 (shop. h, shop. cc から抜粋 ) / / クラス shop の定義部 class shop { / * 基底クラス shop * / private: String nane; Str ing adrs : Str ing phone; public: shop(void) { } shop(String name, String adrs, string phone) : char* key(void) { return name; } / / キー情報を返す virtual void print(void) : / / 仮想関数 List5 / / クラス shop の実装 shop: :shop(String nn, String ar, String pn) :nane (nn) , adrs (ar) , phone (pn) { } VOid shop::print(void) { / / 各メンパの情報を表示する くく name くく” \ n ” cout くく "name ・ くく adrs くく” \ n ” くく” address : くく "phone number : 下のような処理がされます。 くく phone くく "Yn ” : ① 2 以上 , 所定の最大値以下の全整数値を含む整 数の集合 ( 数列など ) を用意する ②整数の集合中の最小の整数は , 素数である ③②で与えた素数の倍数を整数の集合から取り 除く ② ~ ③を繰り返すことにより , 素数を得ることが てきます ( Fig. 2 参照 ) 。この方法は , 大きな素数を得 るのには適していませんが , べンチマークテストな どにしばしば利用されるアルゴリズムてす。 C 十 + プログラミング入門 103

3. 月刊 C MAGAZINE 1990年6月号

new により ) 生成され , それが操作 append によって追 加されます。探索は , あるキー ( ここてはお店の名前 ) により , 操作 sea 「 ch が探索し , 要素へのポインタが 返されます。この操作 append, 操作 search は , デー タベース型のメンバ関数に定義しました。また , 要素 の出力には , 要素型のメンバ関数 p 「 int を使いました。 これら以外の実装は , 抽象データ型の背後に隠さ れており , 抽象データ型を使うため , プログラム作 成者には関係ありません。そして , その実装は , イ ンタフェイスが守られているかぎり , 変更されても 問題ありません ( 注 1 ) 。 ■使用したクラス こては , List1 のデータベースプログラムて、 , 使 テータベースプログラム (main. cc から抜粋 ) List 1 / / データの読み込み ( 入力ストリームから ) 用した抽象データ型を以下に紹介します。 ・文字列 String 型は , 文字列を取り扱う抽象データ型てす。 文字列は , C て、は cha 「の配列などて表現しますが , そ れは , C に文字列を扱うデータ型がないための , たん なる代用にすぎません。この String 型ては , BASIC の文字列のように文字列の代入などが可能て、す。 GNU , C 十十のライプラリには St 「 ing 型が用意され ていて , 今回はそれを使いました (List2)0 また IDEA C 十十には新たに St 「 ing 型を定義しました。 ただし , この実装は , いくっかの部分が不十分て 実用にはなりません。いくつかの部分というのは , たとえば , 提供される演算子が貧弱だったり , 文字 inl ine cget(char* buffer) { Char c; cin. get(buffer, 256 ) : void main() { db goni : char buffer[256] : for ( : ;) { / / 繰り返し / / ゴミを取る cout くく ) ppend, s)earch, q) uit %n" / / 命令待ち cget (buffer) : switch (*buffer) { / / 操作 append ( 情報を読み込み , 要素を登録する ) case cout くく” Cannot find !Yn ” : } else { ptr->print() : if (ptr ! = N 此い { E* ptr = * ( go ⅲ . search(buffer)) : cget (buffer) : cout くく input key (nane) ・ case 'S' / / 操作 search ( キー情報から , 要素を探索し , 表示する ) break : (void)goni. append(new shop(name, adrs, phone)) : String phone(buffer) : cget (buffer) : cout くく "input phone: Str ing adrs (buffer) : cget (buffer) : cout くく "input address: String nane(buffer) : cget (buffer) : cout くく "input name: break : case q exit(l); / / 終了 ( 注 1 ) たとえば , データベ ース型のデータ格納方法が リストからハッシュ表に変 わっても関係ない。 C 十十プログラミング入門 99

4. 月刊 C MAGAZINE 1990年6月号

ライプラリ編 [ 2 ] 今回は , ライプラリ編といいつつ , ヘッ ダファイルを取り上げます。なにしろ , 今 回が「プリプロセッサ特集」という様相を呈 していますのて、 , どこかてヘッダファイル について触れないわけにはいきません。ま た , ライプラリとヘッダが密接な関係にあ るのはご承知のとおりて、す。 標準ヘッダ ANSI 規格て、は , 以下に示す 15 個のファイ ルが標準ヘッダとして規定されています。 く assert. h> プログラム診断用関数 asse 「 t ( ) を定義する ヘッダて、す。この関数は , マクロ定義によ って実現されており , 直前に非デバッグ指 定用マクロ NDEBUG が定義されていると , void 式となります。 く ctype. h > 文字種別判定用ビットマスク , および判 定用マクロ関数を定義するヘッダて、す。 く errno. h> プログラム実行時におけるエラー情報に 関するマクロを定義します。 く float. h > 浮動小数点型の範囲 ( 数量的限界 ) がマク ロ定義されています。浮動小数点型の特性 は , 処理系および実行環境に依存しますが , 通常 , 旧 EE の浮動小数点演算規格に準拠し たものになります。つまり , MS-DOS の処 理系て、は , インテルの 8087 ( 287 , 387 ) のス ペックと同一になります。 く limits. h> 整数型の範囲 ( 上限値と下限値 ) , 特性 ( 処 理系に依存する ) がマクロ定義されていま す。 c h a 「 , s i n g e d c h a r , u n s i g n e d char, short, unsigned short, int, unsigned int, long, unsigned long の各タイプにつ いての定義が行われていますが , 将来的に は , マルチバイトキャラクタについての定 義が追加されるて、しよう。 く loca . h > プログラムが使用される地域別 ( 国別 ) に 異なるて、あろう処理を行うためのマクロが 定義されています ( 具体的には , 通貨の単位 / 表示形式 , 日付や時刻の表現形式などて、 す ) 。 ANSI 規格て、は , 処理系 ( 地域 ) ごとに 必要な情報を LC て、始まるマクロ名として , このヘッダに追加することが許可されてい ます。混乱を避けるため , ューザプログラ ム内て、は LC て、始まるマクロ名を使用しない よう心がけたほうがよいて、しよう。 く math . h > 数学関数 ( 平方根 , 対数 , 三角関数など ) のプロトタイプが行われています。 く setjmp. h> 非局所的な分岐 ( C の制御構造以外の分 岐 ) を行うための関数 , s mp ( ),longjmp( ) などが定義されています。 く signal.h> シグナル操作 / 処理 ( signal( ) , raise( ) ) に 関するマクロが定義されています。このヘ ッダて、は , S , SIG て、始まるマクロ名が予 約されています。通常 , シグナル処理は , 処理系 , そしてオペレーティングシステム に依存しますのて、 , S 給マクロが追加される 可能性があります。ューザプログラム内て、 は S 旧て、始まるマクロ名を使用しないほうが よいて、しよう。 く stdarg. h> 不特定数個の因数を処理する関数のため のマクロ定義を行います。このヘッダて、定 義されている va list, va arg( ) , va end(), va sta 「 t ( ) などのマクロ定義 , マク TbI.2 <string. h> の予約された関数名 WCS—- 文字列操作用 メモリ操作用 ワイド文字列操作用 ロ関数は , 可変個の因数をもっ関数 (printf( ) など ) のポータビリティを高めるためのもの て、す。 く stddef. h> く stdio. h> 標準入出力のためのマクロ定義 , プロト タイプを行うへッダて、す。 く stdlib. h> 一般的な ( 汎用の ) 標準ライプラリ関数の プロトタイプ , および ?TYPEDEF を行います。 < stdio. h> と合わせてもっとも使用頻度の高 いへッダて、しよう。 く string. h> 文字列操作のための関数のプロトタイプ を行います。このヘッダて、は , Tbl. 2 の文字 列て、始まる関数名が予約されています。 TbI.2 に該当する関数名は , ューザプログ ラムまたは , ユーザのライプラリて、は使用 しないほうがよいて、しよう。 く time. h > 時間に関する処理を定義します。 ANSI 規 格の時間処理用関数は , グリニッジ標準時 を基準として処理されます。実際にユーザ が使用する地域時間 , 季節時間などに関し ては処理系に依存しています。 以上のヘッダファイルによって定義され ている ( 標準的な ) マクロ , および TYPEDEF を TbI. 3 にまとめます。 準標準ヘッダ 以下に示すヘッダは , ANSI 規格て、は定義 されていませんが , PragmaC において標 準とする ( または予約する ) ものて、す。 く conio. h> コンソール入出力 ( ストリームて、はない ) , I / O ポートへの入出力関数を宣言します。 く direct. h> ディレクトリ操作に関する関数を宣言し ます。 く dos. h > MS-DOS のファンクションコールに関連 する関数を宣言します。また 8086 のセグメ ンテーションと C のポインタとの変換用マク プロジェクト PragmaC 43

5. 月刊 C MAGAZINE 1990年6月号

五ロ く最終回〉 カード型簡易データベの設計 高橋良明 てみます。今後も実用的テータベース形成 今回は簡易テータベース作成編の最終回と のために必要なモジュールを作成していき して , 今まで作成したモジュールを組み合 わせた簡単なカード型テータベースを作っ ますので , いすれ発表したいと思います。 dbmg. c の main 関数 1 : 簡易データベース 管理用プログラム DBMG. C ver 1.00 1990 ー 01 月号 ver 1.10 1990 ー 02 月号 ver 1.20 1990 ー 06 月号 10 : / * 12 : 13 : #include く iO. h 〉 14 : #include く dos. h 〉 15 : #include く fcntl. h> 16 : #include く stdio. h> 17 : #include く string. h> 18 : #include く stdlib. h> 19 : #include く sys%types. h 〉 20 : #include く sysYstat. h> 22 : #define ORG 23 : #define REV 24 : #define UNDER 25 : #define B い NK 26 : 27 : #define RED 28 : #define BLUE 29 : #define PURPLE ” 19 ” 30 : #define GREEN ” 20 ” ” 21 ” 31 : #define YE し LOW ” 22 ” 32 : #define SKY 33 : #define WHITE ” 23 ” 34 : 35 : struct MNGTBL{ fname[l 幻 : / * ファイル名 * / 36 : Char / * レコード数 * / 37 : long int reccnt; / * レコード長 * / 38 : int recln; / * フィールド数 * / 39 : int fldcnt; flntbl[20] : / * フィールド長 * / 40 : int / * 削除マークオフセット 1990-02 * / delnark; int fldnam [ 20 ] [ 20 ] : / * 項目名 1990 ー 02 * / 42 : Char 43 : } : 44 : MNGTB し nng; 45 : struct 46 : fnane[20]={"a:db. nng"} : 47 : Char tnp-fnane[20] ={"a: dbtnp ・ $ $ $ \ 0 つ : 48 : Char dta[128] ; 49 : Char buf [ 1024 ] : 50 : char List 1 はしめに 今回は , 簡易データベースの作成のまと めということて、 , いままて作成してきたプ ログラムをまとめてリンクします。この修 正て、 , DBMG. C はカード型簡易データベー スになります。 リンクするために , 1 月号 , 2 月号て、作成 した簡易データベース管理プログラム DBMG. C のキーポード入力と画面表示部分 を修正します。 なお , crtsub. c に DBMG 用に任意の場所 に変数を表示する関数 ( pu し st 「 f ) を新設しま 、 0 DBMG. C の修正 printf 関数を put str または , put strf 関数 に変史します。 p 「 intf に変数を引き渡している場合には put st 「 f 関数を使用し , それ以外は put st 「関数 を使用します。 画面表示は , 表示開始位置を X 座標 ( 0 ~ 79 ) と Y 座標 ( 0 ~ 24 ) て指定します。画面 設計を行うのて、 p 「 intf を使用するよりも手間 がかかりますが , きめの細かい表示がてき 110 CMAGAZINE 19 6 ア フ ッ * 名ア出 名ルリ入 ルイエス ィアク一 アフ一べ フクワタ 管ワ闘デ

6. 月刊 C MAGAZINE 1990年6月号

イ 9 入 門 ためのランタイムライプラリが各 C コンパイ うに進行していくのが一般的てある。ヒー ただ , 実際にはデータセグメントはデー プは , C 言語のランタイムライプラリによっ ラから提供されている。もちろん , コンパ タセグメントてあり , nea 「ヒープ領域は nea 「 イラごとにランタイムライプラリの仕様が て使用されるメモリエリアのことてある。 ヒープ領域てあり , その合計が 64K バイトを 異なっているのはいうまて、もない。データ 超えてはいけないというのて、ある。プレイ スタックそのものを操作することはないが , セグメントは , 64K バイトをすべて「データ」 ヒープはよく使用されるのて , ひんばんに ク値は , この境目てあるデータセグメント 用に使用することはない。その代わりに , 参照される。 の次のアドレス , つまり nea 「ヒープ領域の プレイク値というのは , データセグメン nea 「ヒープ領域として確保されているのて、 先頭アドレスて、ある。 トの中て、確保されている near ヒープ領域の ある。したがって , データセグメントは「デ Tbl. 1 にメモリ管理に関連するランタイム 先頭アドレスをさしている。そして , この ータ」と「 near ヒープ」がその領域を占めてい ライプラリを比較一覧した。 値を変更することがてきるのてある。その るのてある。 この表からもわかるとおり , そのほとん どが MS-C によって提供されている。しか m 訓 oc 関数 , free 関数のサンプルプログラム も , このランタイムライプラリの大部分が MS-C Ver. 5.1 からサポートされたものて ある。また , UNIX や ANSI などと互換性が 低いのは , ほとんどが MS ー DOS に基づいて いるためと思われる。 calloc( ) 関数の使用例 カレントドライプの FAT を読み込んて、表 示するプログラムを作ったのて参照してほ しい ( 付録ディスクに収載 , calloc. c ) 。この プログラムの中て c 訓 oc ( ) 関数を使用してい る ( このプログラムは , ディスクドライプを 読み込むために TurboC 専用の関数を使用し ている。したがって Turb0C 以外て、はコンパ イルてきない ) 。 c 訓。 c ( ) 関数の使用例を見てみると , 引数 がふたつある。最初の引数は , 確保する要 素数を指定する。 2 番目の引数は , 要素のバ イト数を指定する。したがって , このプロ グラムて、は , FAT の総数を要素数に指定 し , 要素のバイトを 2 バイトに指定してい る。次の例は , スクリーンの縦と横をメモ リに確保するために , c 訓。 c ( ) 関数を使って 割り当てるための引き数を指定したものて ある。 calloc( 25 , 80 ) : これは , 25 行の 1 行 80 文字を意味している。 こうした使用方法がこの関数には最適かも しれない List 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 13 : * / 15 : #include く stdio. h 〉 16 : #include く stdlib. h> 18 : #if defined( _TURBOC_ #include く a Ⅱ OC. h 〉 20 : #else #include く malloc. h> 22 : #endif 24 : void main( void ) char *buffer; ( char *)malloc( 10 ) ; buffer = 29 : if( buffer = NUL し ) 30 : fprintf(stderr, ex i t ( 34 : 35 : 38 : 40 : 42 : 43 : } by A. Akitu Programmed 1990 ー 04 ー 01 Dated turboc vl. 5 ー v2. 0 Comp iler MSC v5. 1 tcc ーし b:Ytb -IbNtb -C -G -w -ms malloc. c cl /AS /W3 malloc. c Vers ion Purposed 指定バッフアに書き込んだ文字列をまた読み込む memory allocation failed. printf("enter string scanf("%s", buffer) : buffer) : printf("read from malloc buffer . XsYn" free( buffer ) : C プログラマのためのランタイムライプラリ入門 91

7. 月刊 C MAGAZINE 1990年6月号

TbI.6 ティレクトリの分類 は , コンパイラ本体の作成に合わせてバー YPCYBIN ジョンアップして行く予定て、す。このため , YPC*SOURCE 現バージョンをユーザがカスタマイズする YPCYINCLUDE ことはあまりおすすめて、きません。もし , YPCYINCLUDEYSYS 改良を行う場合には , オリジナルコード部 YPCYL 旧 分の汎用性を考慮してコーティングしてく YPCYARC ださい YPCYDOC また , 前述のようにプリプロセッサの仕 TbI. 7 環境変数の設定 様を拡張するための唯一の方法は , #pragma PCINCLUDE=YPCYINCLUDE ディレクテイプのプラグマ命令としてイン PCL 旧 =*PC* 凵 B プリメントすることて、す。ほかの方法 , 新 PCARC=*PCYARC PCTMP=YPCYTMP たなディレクテイプの創設は許されていま せん。この点のみは厳守してください ティスクの内容とセットアップ 本号の付属ディスクには , Fig. 3 に示した ファイルが格納されています。 CPP が動作するためには , ヘッダファイ ルの存在するディレクトリが環境変数によ って定義されていなければなりません。ま た , 本連載は , 回をおうごとに必要なファ イル数が増加していく運命にあります。そ こて、 , 今のうちにシステムのディレクトリ 構造を設定しておきます。 まず , お手持ちのディスク ( て、きればハー ドディスク ) に Fig. 4 のようなディレクトリ ツリーを作成してください 以後 , 付属ディスクて供給されたファイ ルは , Tbl.6 に示す分類に従っておのおのの ディレクトリに複写した後 , ご使用くださ なお , YPCYTMP はテンボラリファイル の作成用て、す。通常 , ユーザファイルを置 くことはありません。 次に , このディスクを使用するときに起 動される AUTOEXEC. BAT( またはほかの BAT ファイル ) て、環境変数を設定 ( TbI. 7 ) してください 現在 , 使用が予定されている環境変数は , TbI.7 の 4 個て、すが , 増加する可能性もあり ます。また , コマンドバス (PATH) に YPCYBIN を追加登録しておいてください すべての実行形式 (. EXE ) ファイル プログラムのソースとヘッダなど 標準 ( 準標準 ) ヘッダファイル 標準 ( 準標準 ) ヘッダファイル ライプラリ (. L 旧または . OBJ ) ファイル ライプラリソースファイル 日 EADME. DOC などのドキュメントファイル Fig. 4 作成するティレクトリツリー PC 引 N SOURCE INCLUDE—SYS ARC DOC TMP Fig. 3 ティスク内容 #PRAGMA*README. DOC CPP. EXE CPP. C CPMACRO. H CPMACRO. C CPTOKEN. H CPTOKEN. C CCTYPE. H CCTYPE. C INCLUDE*ASSERT. H CONIO. H CTYPE. H D 旧 ECT. H DOS. H ERRNO. H FCNTL. H FLOAT. H 9. H LIMITS. H LOCALE. H MALLOC. H MATH. H MEMORY. H PROCESS. H SEARCH. H SETJMP. H SHARE. H SIGNAL. H STDARG. H STDDEF. H STDIO. H STDL 旧 . H STRING. H 刊 M E. H SYS*LOCKING. H STAT. H TIMEB. H TYPES. H UTIME. H 最後まて、 ( て、きれば永久に ) 黙っていよう かと思ったのて、すが , ANSI 規格のプリプロ セッサの機能 ( 処理系の機能 ) のうち , たっ たひとつだけ本稿て、取り上げていないもの があります ( あるいは , 前回の CSP のソー スを見て気がつかれた方もいるかもしれま せん ) 。 それは , Trigraph= 3 文字表記について て、す。これは , C 言語に特有 (FORTRAN や BASIC に比べて ) のバックスラッシュ , 角カ ッコなどを , これらの文字が存在しないコ ード体系をもつ諸外国 ( ドイツ , フランスな ど ) のコンヒ。ュータ ( あるいは端末 ) のため に , ? ? x の形式の 3 文字からなる表記方法て 代替するというものて、す。 確かに , 全世界における標準規格として は必要なものてすが , とりあえず , 日本に おいては障害にはなりません。このため , あえて無視した形を取っています。もし , この考えにどうしても異議があるという方 は , 編集部まて御一報ください。 プロジェクト FragmaC 47

8. 月刊 C MAGAZINE 1990年6月号

ウシステム 入門 00 ウイン、 List 2 0 リソース frame = XtCreateManagedW idget ( " frame boxWidgetCIass, top, NU ししの ; / * 文字列を表示するし abel widget を生成し , widget "frame" に管理させる * / (void) XtCreateManagedW i dget ( " C magazine の : IabeIWidgetCIass, frame, NU しし , / * コマンドボタンに相当する Command ⅵ dget を生成し * / / * widget ” frame" に管理させる = XtCreateManagedWidget(" quit " command commandWidgetCIass, frame, NU しし , の : / * 関数 quit を widget "command" のコールバックプロシージャとして登録する * / / * コマンドボタン "command" ( qu i t と表示しているウインドウのこと ) をマウス / * でクリックすれば , このプログラムは終了する XtAddCallback(command, XtNcallback, quit, NU しい : / * こまでの w idget "top" の設定を実現し , 実際にウインドウを生成する * / XtRea I izeW i dget (top) : / * イベント処理のための無限ループを実行する * / XtAppMainLoop (app) : 8 0 1 ・ 4 っ 0 っ 0 -4 ・ - -0 ″ー 8 0 ) 0 11 っ 0 -4 ・ー 各 Widget は , それぞれ , 内部データをも っている。たとえば , Label widget て、あれ ば , 位置 , 大きさ , ラベル文字列 , フォン トなどの 29 個の属性があり , これらは , リ ソースと呼ばれる。何も指定されなければ , 既定の値が使われるが , xrdbm クライアン トなどを使って指定することもて、きる。た とえば , List2 の、℃ magazine" という文字 列を、、 SOFTBANK" に変更したければ , ホームディレクトリの . XdefauIt に cmsl. * . C magazeine.Iabel:SOFTBANK というように指定すればいい ( * は省略を意 味する ) 。 プログラム中て、指定することも可能て、あ る。 List2 を修正し , リソースの指定を行っ たプログラムを List3 に示す。配列 resou 「 ce に指定を行い , XtAPP itia ⅱ ze 関数て、リソー スの既定値を変更している。その結果 , フ オントはアドビタイムスイタリックの 24 ポ イントになり , 表示文字列も変わった (Fig. 11)。 Fig. 1 1 cms3. C List 3 2 : 3 : 4 : 5 : #include く X11/Intrinsic. h> / * Xt tr i ns i c 関係の定義 * / 6 : #include く X11/StringDefs. h> / * 文字列関係の定義 * / 7 : 8 : #include く X11/Xaw/Box. h> / * Box widget の定義 * / 9 : #include く X11/Xaw/Command. h> / * Command widget の定義 * / 10 : #include く X11/Xaw/ し abel.h> / * し abel widget の定義 * / 12 : 13 : / * コールバックプロシージャを使った簡単なプログラムの実装例 * / 14 : 15 : VO i d 16 : quit(widget, clientdata, calldata) / * コールバックプロシーシャ quit 関数 17 : Widget w idget; / * この関数は , Command widget "command" の 18 : XtPointer clientdata, calldata; / * コールバックにより lntr i ns i cs が呼び出す * / 19 : { / * 引数を無視し , 単に ex i t 関数で終了する * / 20 : XtDestr0YAppIicationContext(XtWidgetTOAppIicationContext(widget)) : exit(0); 22 : 23 : } 24 : 25 : int 26 : main(argc, argv) 27 : int argc; 28 : char* argv ロ : 29 : { / * widget を保持するための Widget 型変数を宣言する * / 30 : Widget top, frame, form, command,• 32 : XtAppContext app; 33 static String resource[] 34 35 ” *font: -adobe-times-bold- i ー * ー 24 ー * ” ” * C magazine .label: Kukuchi kerokerokeroppi 36 ” * quit . la わ e に円 ease Click here to quit" 38 NUL し , 39 : 40 : / * 基礎になるウインドウに相当する widget を生成する * / 42 : tOP = XtAppInitialize(&app, "oops", NU しし 0 , &argc, argv, resource, NULL, の : 43 : 44 : frame XtCreateManagedWidget ( " frame , boxWidgetClass, top, NU しし , の : 45 : / * 文字列を表示する Label widget を生成し , widget "frame" に管理させる * / 46 : (void)XtCreateManagedWidget(" C magazine IabeIWidgetCIass, frame, NU しし , の : " qu it " ボタンをクリックすると終了するプログラム (cms3. c) ー cms3 PIease CIick ん e ね 94 耘 / * ただの ma i n 関数 * / ボップアップウインドウ 最後に , ポップアップウインドウを使っ た例を List4 に示す。このプログラムを実行 すれば , まず Fig. 12 が表示される。 $quit" をクリックすればプログラムは終了し , ヾ cloc にをクリックすれば時計のウインド 特集最新ウインドウシステム入門 73 0