C MAGAZINE - みる会図書館


検索対象: 月刊 C MAGAZINE 2000年5月号
170件見つかりました。

1. 月刊 C MAGAZINE 2000年5月号

令ー IN 、印を付加すればよいだけなので , 考 え方そのものは簡単です。ただし , といった式に対しては のように結合させる必要があります。この いた中間コードを生成できることを確認で この方法により , 上記の結合規則に基づ を呼び出しています。 ードを生成するために , 再帰的に自分自身 単項演算子の処理するオペランドの評価コ ような結合を実現するため , expr7() では 因子の処理 (factor()) きると思います。 参照変数の 3 種類があり , それぞれ , toy の変数には ( 単体の ) 変数・配列変数・ 左辺値の処理は少々複雑になります。 生成します。 という形式でスタックへのブッシュ命令を p = 文字配列のアドレス PUSH a=STRlNG PUSH a=CONST b = 定数 れ , 次に , 定数と文字列に対しては , それぞ クするくらいのものです。 いぜい右カッコで終了しているかをチェッ す。そのほかにやるべきことといえば , せ ession() を再帰的に呼び出すだけで済みま 式なので , 式の評価コードを生成する expr まず ( 式 ) ですが , カッコのなかは単なる 成の方法について順に見ていきます。 す。以下ではこれらに対する中間コード生 出しの五つが t 。 y では因子として扱われま ( 式 ) , 定数 , 文字列 , 左辺値 , 関数呼び 変数 a 24 C MAGAZINE 2 0 5 として解釈されることになっています。 v 省略可能であり , 省略された場合には [ 0 ] 配列変数と参照変数に対する [ 式 ] の部分は が左辺値としての形式となります。ただし , 参照変数 a → a[ 式 ] 配列変数 a → a[ 式 ] ar() 中では , vardata 構造体の vartype メン ノヾが VAR"IYPE ARRAY( 配列変数 ) か VART YPE_REFER( 参照変数 ) の場合には先だっ て [ 式 ] の部分の式評価コードを生成するの ですが , 次の字句が LBRACK(' [ ' ) でなけ れば省略されたものと判断し [ 0 ] と等価な b = 変数のタイプ LOAD a = オフセット べての左辺値に共通な次のコード , を生成することにしています。最後に , す PUSH a=CONST b=0 コード e) のように渡せば , 評価コードが生成され 事前に int lvalue=TRUE として exprO (&lvalu 合に * ⅳ alue = FA E とされます。つまり , の内部では , 左辺値以外の因子を扱った場 した場合に * lvalue=FAISE とされ , factor ( ) かでは , 何らかの演算を行うコードを生成 用意されているもので , 演算子処理部のな 引数 int *lvalue は , このチェックのために expr0 ( ) —expr7 ( ) および factor ( ) のとる す。 あるか否かをチェックする必要がありま せん。そのため , 何らかの方法で左辺値で とることが可能な左辺値でなければなりま 的にポインタが渡されるため , アドレスを だけで済みますが , 参照渡しの場合は内部 を呼び出して式の評価コードを生成させる 値渡しの場合には , 単純に expression() なりません。 数の要求する引き渡し方法に従わなければ 方法があり , 呼び出しコード生成部では関 方法として , 値渡しと参照渡しのふたつの していきます。 toy では関数への引き渡し 価コードを引数リストの左側から順に生成 引数として渡される値 ( あるいは参照 ) の評 呼ばれる関数が引数を要求するのであれば では , LPAR ( ' ( ' ) の存在を確認したあと , 次に関数呼び出しコードの生成部 ( ca Ⅱ ( ) ) すが , 詳しくは後述します。 れるフレームの先頭からの相対アドレスで - > 。Ⅱ set ) は関数呼び出しごとに割り当てら が生成されます。ここでオフセット (vdata た時点でそれが左辺値であれば lvalue は TRUE のままであり , そうでなければ FAL SE がセットされていることになるため , この値により左辺値であるかどうかを判断 することができます。 関数の n 番目の引数が参照渡しを要求 ( fd ata->argtype Cn] ==ARGNPE REFER) して いる場合 , まず上記の方法で左辺値である かを検査し , 確認されればアドレス渡しを 行わせるために chg_code( ADDR) を呼び , 中間コード列の終端の命令を ADDR 命令 に書き換えてやります。この操作について 少し説明しておきましよう。 左辺値であることが確認されたというこ とは , つまり var ( ) が一度だけ呼ばれたと いうことになるので , 中間コード列の終端 には必ずー LOAD 命令が存在します。 -LOA D 命令はパラメータとして指定されたオフ セットと変数タイプによって求められるア ドレスにあるデータをスタックにブッシュ する命令です。対して ADDR 命令は , パ ラメータから求められるアドレスをスタッ クにブッシュします。このふたつの命令は 意味も含め共通するパラメータをとるた め , 命令を書き換えるだけで正当な ADD R 命令として機能させることができるわけ です。 以上の方法で引数の処理を終えれば , あ とは呼び出し命令 , CALL p = 関数構造体のアドレス を生成し , 関数呼び出しコードの生成は完 了します。 代入演算子の処理 (expr0() ) 代入演算のコード生成部では , ま $expr 1 ( ) を呼ぶことで = を含まない部分式の評 価コードを生成させます。次の字句が EQ UAL ( ' = ' ) であれば , 代入式として部分式が 左辺値であるかを確かめ , 中間コード列の 終端をユ OAD 命令から ADDR 命令へと書 き換えます。そのあと , 右辺の式評価コー ドを expression() に生成させ , 最後に左辺

2. 月刊 C MAGAZINE 2000年5月号

ます。 濃度パターン法は細かな画素を扱える場 合には有効に活用できるので , プリンタな どで利用されています。最近のプリンタは 解像度が上がっているのでわかりにくいか もしれませんが , プリンタ出力された画像 をよく見ると異なる色を交互に印刷するこ とで中間色を実現していることがわかりま す。しかし , ディスプレイなどで表示する 場合 , 濃度パターン法をそのまま用いると 元の画像の 1 画素が数個の画素に置き替え られるため , 結果の画像が大きくなってし まうという欠点があります。これを解決す る方法として“デイザ法”があります。 デイザ法においても基本的な考え方は濃 度パターン法と同じで , 先ほど F1g. 2 に示し たようなパターンによって中間調を表現し ます。両者の違いは単純に複数画素をひと つの画素として扱うのではなく , 同じ色の 画素でもある規則に従って色を割り付けて パターンを作り出すということです。ディ ザ法では見た目の画像の細かさ ( 解像度 ) は 犠牲になりますが , 結果画像の大きさは同 じに保つことができます。 濃度パターン法もデイザ法も骨格となる 考え方は同じなので , ほば同じ処理で実現 できます。以下 , デイザ法についてさまざ まなアルゴリズムを紹介します。 デイザリング処理 前述したように , 擬似階調表現では使用 する色をある密度で配置することにより中 間色を作り出します。この配置にはいくつ かのバリエーションが存在します。ここで はデイザリング処理として提案されている いくつかの方法を紹介します。なお , 各処 理の概念をとらえやすくするため , 16 階調 のグレースケール画像を 2 値画像 ( 白と黒の みの画像 ) に変換する方法を紹介しますが , ほかの画像に減色処理を適用する場合も基 本的な考え方は変わりません。 102 C MAGAZINE 20 5 デイザリング処理の基本的な考え方は前 述したとおり , 画素の配置パターンによっ て中間的な色を作り出すことです。この方 法では , 元の画像で同じ画素値になってい ても変換後の画像では異なる画素値になる ようにする必要があります。その際 , 中間 調の画素値によって画素の分布が決まるよ うにします。 たとえば , 白 ( 255 ) と黒 ( 0 ) の中間 ( 128 ) の画素値の部分は全体として , 白の画素数 : 黒の画素数 = 1 : 1 になるように振り分けます。 ではどのように振り分けてこのような状 態を作り出せばよいでしようか ? そのた めの方法は大きく分けて , " 組織的テイザ 法”と“ランダムテイザ法”の 2 種類がありま す。それぞれの方法について見ていくこと にしましよう。 組織的デイザ法 組織的デイザ法はある中間調を白に割り 振るか黒に割り振るかを決定するために座 標 ( 位置情報 ) を用いる方法です。同じ色で も座標の違いによってどの色に割り振るか が決定されます。実際には座標ごとに閾値 を設定して , ある点の画素値がこの閾値を 超えているかどうかによってどちらの色に するのかを決定します。 具体的には , 16 階調の画像を 2 値に減色 する際には F1g. 3 のような 4X4 の閾値パター ン pat を用意します。 pat のなかの PI ~ P16 に は 1 ~ 16 の数字がひとつずつ入っています。 そして , 座標 ( x , y ) の画素値が v である場合 , V<pat [x%4] [y%4] となる場合に黒 ( = 0 ) , それ以外の場合白 ( = 1 ) を割り振ります。このようにすることで , た とえば 4X4 の領域の画素値がすべて 8 の場 合には 4X4 の領域のなかで半分が白 , 半分 が黒になることになりちょうど中間のグレ ーが表現されることになります。 ここで pat のなかの数字の並びをどのよう しきい Fig. 3 組織的デイザのバターン pat P9 P5 PI PI 3 PI 4 PI 5 PI 6 PI 0 PI 1 PI 2 P6 P7 P8 P2 P3 P4 振ります ( Fig. 6- c ) 。この数字を前と同様に に戻って , 2X2 の領域に 5 から 8 の値を割り が設定できたことになるので , 全体の領域 これで各領域のもっとも小さい枠に閾値 g. 6-b) 。 とも小さい数字のところに値を収めます ( FI で , このなかでも基本順序を適用し , もっ れの領域も 2X2 の領域で成り立っているの 従って値を割り振ります ( Fig. 6- a ) 。それぞ 分けて考え , そのなかに F1g. 5 の基本順序に 4X4 の場合にはまず , 領域全体を 2X2 に 処理します。 作りたい場合には Fig. 6 のように再帰的に って閾値を設定します。大きなパターンを 的には Fig. 5 のように " たすき型 " の順序に従 ンになります。べイヤー型の配置は , 基本 が 4X4 の場合におけるべイヤー型のパター っとも一般的に使われるものです。 Fig. 4 べイヤー型は , 組織的デイザとしてはも べイヤ—(Bayer) 型 のパターンを用意します。 調から 2 階調への減色では 16X16 の大きさ 用意する必要があります。たとえば 256 階 画像を処理する場合には大きなパターンを ンになっていますが , より多くの階調の元 画像が 16 階調としているので 4X4 のパター この説明では元 なお , 前述のように つか紹介します。 こでは代表的によく用いられるものをいく はいろいろなものが提案されていますが てきます。 pat に用意する閾値のパターンに に設定するかによって処理の結果が変わっ PI ~ P16 には 1 ~ 16 までの数字がひとつずつ入る

3. 月刊 C MAGAZINE 2000年5月号

読者プレゼント 2 名 B コンピュータは , むずか 2 名 しすきて使えない ! 提供 ( 株 ) 翔泳社 TEL 03 ( 5362 ) 3700 使むヨ えかビ し、ぎタ ′て Visual Basic を作ったアラン・クー パーによる使いにくいシステムの原 因と解決策を示す書籍 モニタ 1 名 2 名 A あぶこん 2 2 JOIIY Developer's Kit 提供住友セメントシステム開発 ( 株 ) 提供 ( 株 ) コンパル TEL 03 ( 3299 ) 5751 TEL 03 ( 5600 ) 9981 1 Borland C + + Builder 5 提供インプライズ ( 株 ) TEL 03 ( 5350 ) 9380 第地 h ・市 an 引 ~ ⅵ馳 a ev 引叩 ment 朝新 0 曲 3 記 and lnt 師 T001s 第ン第 - 第ン、 いやすいにジアル第当 ・ : ま上のン -- ネント ・メを」′、グを強物する 0 。を朝・ 0 ー ・イいーネット対応 ・多第なデータ ^ ース物 : 圧倒的な生を社を第り、多様なー・スにえる 、、てセ実現されたピジアル聞発、ール 0 B ⅶ 0 5 ビデオ出力を VGA ディスプレイに表 さまざまな画像テータに対応し , そ Borland C + + Bu ⅱ de 「の最新版。デバッ の読み込みや表示 , 画像効果が行え 示できるアップスキャンコンバータ。 グ機能を強化し , 最新の A 日や ANSI ール集 規格に対応したビジュアル開発環境 詳しくは http://www.com/al.to/まで る ActiveX コントロ バックナンバー情報 【モニタ募集要項】 03-5642-81 OO ( 2000 年 3 月 23 日現在 ) C MAGAZIN E ◇応募資格 : プログラミング経験者 , およ ROOM モニタ係」宛に投函いただく劜 1999 年 びプログラミング学習者。 あるいは E - ma ⅱアドレス宛に電子メール 特集「思考ルーチン」 ・ 1 月号 特別記事「 Bo and C + + Builder による TCP / 旧ソケット制御」 ◇モニタ期間 : 商品受領より 3 か月間 ( モ を送信ください。 特集「 MFC 6.0 」 ・ 2 月号 新連載「徹底解説画像と音のアルゴリズム」 ◇レポート発表 : 提出いただいたレポート ニタ商品によっては発送に日時を要する 特集「アルゴリズム入門」 ・ 4 月号 新連載「 c 言語入門」 , 「実践入門 c + + 」 , 「デザインパターン入門」ほか は , 編集部到着月日から 2 か月後に発売 ものがあることをご了承ください ) 。 特集「日本語処理」 ・ 6 月号 ◇モニタレポート : モニタ期間中に最低 2 する本誌上 , または付録 CD - ROM にて 特集 2 「伝送制御プログラミング」 特集 1 「 STL 」 ・ 7 月号 掲載収録する予定です。 回のモニタレポートを提出していただき 特集 2 「組み込みプログラミング入門」 特集「実践 PC - UN Ⅸプログラミング」 ・ 8 月号 ◇選考発表 : この号のモニタ選考結果は ます。レポートはテキストファイルとし , 特集「思考ルーチンプログラム選考結果」 フロッピーティスクにて「 READERS ' 2000 年 9 月号にて発表いたします。 特集「遺伝的アルゴリズム」 ・ 9 月号 新連載「どび了クのエレガントなクラス設計技法」 特集「プログラミング Tips 大全」 ・ 10 月号 特集「ライブラリ活用術」 2000 年 1 月号 モニタ応募の注意 特集「ファイルフォーマット事典」 モニタ選考発表 ◇綴じ込みの葉書に必要事項を明記のうえご 特集 1 「ファイルフォーマット事典ーサウンド , ドキュメント編」 ・ 1 1 月号 ( 敬称略 ) 特集 2 「ジオメトリックエンジン入門」 ( 1 ) Borland C + + Builder 5 応募ください。 特集「最新グラフィック処理のアルゴリズムを斬る ! 」 ・ 12 月号 CatchUP! 「 DirectX7 」 干場裕昭 ( 大阪府 ) ◇記入もれやモニタ番号が複数記入されてい 2000 年 る場合 , 綴じ込み葉書以外でのご応募は無 特集 1 「情報隠蔽の仕組み」 ・ 1 月号 2000 年 1 月号 特集 2 「 Doom に見る 3D ゲームの高速化と思考ルーチン」 効とさせていただきます。 特集 1 「 XM 凵 ・ 2 月号 プレゼント当選者発表 特集 2 「最新 Windows プログラミング」 ◇締め切りは 5 月 18 日必着です。 特集 1 「 C ℃ + + プログラミング期末試験」 ・ 3 月号 (A) PostgreSQL セミナー受講券 特集 2 「デジタルサウンドの技術と加工」 読者プレゼント応募の注意 大澤斉 ( 長野県 ) 特集 1 「トラブルを避けろ ! プログラミングの禁じ手」 ・ 4 月号 ◇綴じ込みの葉書に必要事項を明記のうえご 特集 2 「 Java の変遷と互換性を探る」 ( B) カレンダ 応募ください。 *lnside Windows の在庫については , 上記の電話番号まで御連絡ください。 木村昌史 ( 東京都 ) ほか 9 名 ◇雑誌公正競争規約の定めにより , 懸賞当選 ( C ) オブジェクト指向 【訂正とお詫び】 c MAGAZINE2000 年 4 月号に内容の誤りがありま 者 , モニタ該当者はこの号のほかの懸賞に スクリプト言語 Ruby 0 ・ [ び「ククのパウーアップ C + + 応募できない場合があります。 田中至盛 ( 京都府 ) ほか 2 名 付録 CD - ROM に収録されていた hello.c, hel 缸 cpp に全角文字が 含まれていました。正しくは今月号付録 CD - ROM に収録されて ◇締め切りは 5 月 18 日必着です。 いる同ファイルをお使いください。 ご迷惑をおかけした読者のみなさま , ならびに関係者の方々にこの 場でお詫び申しあげます。 原文を手直しさせていただく場合 READERS'ROOM ではみなさ もあります。ご了承ください。 まのご意見・ご感想をお待ちして 綴じ込み葉書裏面の記事評価アンケートには [ 宛先 ] 下記の数字をご記入ください。 おります。ほかにも , コンピュー タをめぐるさまざまなこと , 何で 〒 103 ー 8508 ①特集 1 「スクリプト言語を作ろう」 ⑩ローテク講座 ②特集 2 「 C 言語クイックマスター」 ℃言語フォーラム 東京都中央区日本橋箱崎町 24 ー 1 もけっこうです。質問もどしどし ⑩最新開発環境レポート「 MindSearch 」 ③ C 言語プログラミング学習塾 ソフトバンクバブリッシング ( 株 ) お寄せください。 ⑩特別記事「 Borland C + + CompiIer 5. 引 ④ど m びてククのパワーアップ C + + ⑤ Pe プログラミングの楽しみ ⑩特別インタビュー「最新回 e プロセッサ C マガジン編集部「 R & R 」係 投稿原稿 , 自作ソフトも受け付 用開発ツールの機能と将来の展望」 ⑥プログラミング相談室 [ 電子メール宛先 ] けております。採用分には弊社規 ⑦ハードウェア基礎講座 ⑩ MONTH LY H EADLI N E @C MAGA Bookends ⑧ Standa 「 d C ℃ + + 定の薄謝を進呈いたします。お送 cmaga@softbank. CO. jp ⑨ Java プログラミングリファレンス の学問のススメ [Web/X—ジ ] のあつばれご意見番 ⑩アルゴリズムラボ りいただいた原稿・ソフトは , 原 ZC マガ電脳クラブ ⑩ Windows Prog ramming Tips 則として返却いたしません。また , http://cmaga.zdnet. CO. jp/ ⑩ VCL 解体新書 ÄREADERS' 日 00M ( 敬称略 ) READERS'ROOM 157

4. 月刊 C MAGAZINE 2000年5月号

ノヾワーアップ List List C + + で書いた counte 「 . cpp C + + で書いた t 「 ial.cpp * counter. cpp #include "counter. h" / * 0 クリアする * / VOid counter : : c lear ( ) { value = の / * 十 1 する * / void counter : : increment ( ) 十十 va / * カウント値を読み出す * / int counter: :get( ) ( return value; test fO て 'counter * trial.cpp ー * hOW し 0 compile: * Borland C 十十 - > bcc32 trial.cpp counter. cpp * visual C 十十一 > 0 ー —GX trial.cpp counter. cpp #include く iostream> cout #inc lude rcounter. h counter using namespace S td ー 土北 main( ) { counter C ー c. clear(); c. increment ( c. increment ( c. increment ( int V = c. get();= cout くく nvalue return 0 ー / / カウンタを用意 / / 0 クリア / / 十 1 〃十 1 / / 十 1 / / 読み出し ー / / 出力 くく V くく endl List 1 p 「 ivate メンバ変数 v 引 ue にアクセスできないことを確認する Fig. 1 メンバ関数の定義方法 戻り値の型クラス名 : : メンバ関数名 ( 引数… ) { 処理の内容 〃セて土引 2. cpp ー ude く iostream> #include "counter. h" using namespace std ー int main ( ) counter C ー eou し。 - va ぎ当上 : va 垣 0 、 k イ endlf return 0 ー ていないぶん , C 言語版に比べ , ちょっと スッキリしてませんか ? 字面上 , 主語 . のように書いたとき , デフォルトでは priv 動詞 ( ) みたいな形式なので : ate: 扱いとなります。だから最初の private: ・ c. clear() c をクリアする は省略してもかまいません。 ・ c. increment() : c を + 1 する ・ v = c. get() ・ c から読み出す ・ counter.cpp と読めるのも何だかキモチイイよね。 ・ private メンバ変数の確認 counter CI ・ ついでにクラスの利用者は private メンバ counter C2; 変数 value にアクセスできないことも確か cl . clear(); 〃 cl . value = 0 ; めておきましよう。 c2. clear(); / / c2. value = 0 ; ではカウンタの利用者側コード trial. cpp List 12 のコードをコンパイルすると , 濃 cl . increment(); 〃 + + cl . v 引 ue ; (List 11 ) を見てみましよう。次のコード : いグレーの部分でエラーとなるはずです c2. increment(); 〃 + + c2. v 引 ue ; (Fig. 2 ) 。変数や関数を private 部に置くこ c2. increment() ; 〃 + + c2. v 引 ue , counter c; によって counter オプジェクトの実体であ とで , このような不正なアクセスを予防で intnl =cl get(); る "c" を作ります。この実体を " インスタン きるってわけです。 int n2 = c2. get(); ス " といいます。メンバ関数の呼び出しは というように counter が複数あってもカウ ・ va ⅳ e があるところ 構造体のメンバアクセスに・ . ' を使うのと ント値はそれぞれが独立していますから , 同様に こで再度 counter. cpp (List 10 ) の counte 期待どおりの結果 ( nl = 1 , n2 = 2 ) が得られ インスタンス . メンバ関数 ( 引数… ) r::increment() をご覧ください : ます。 となります。ⅱ stll を見ても , 引数を与え void counter::increment() { counter を使って , コマンドラインから 十十 value となってますね。この value はいったいど こにあるのでしよう。 それは increment() されたインスタンス のなかにあります。すなわち c. increment() すると c. value が + 1 されるわけです。だか 次にカウンタの実装 counter. cpp (List 10 ) です。メンバ関数の定義は Fig. 1 に示す書 式に従ってください。 ・ trial.cpp ど [ びてク″クのパワーアップ C + + 71

5. 月刊 C MAGAZINE 2000年5月号

記事 特 , 別 BorIand C + + CompiIer 55 インストールと使い方 長久勝 インプライズは米国に引き続き日本でも BorIand C + + Compiler 5.5 日本語版の 無償公開を行いました。本稿ではこの最新 の C / C + + コンバイラについて , インスト ール方法とその使い方について解説しま す。なお , Borland C + + CompiIer 5.5 日本語版は本誌付録 CD ー ROM に収録され ています。 BorIand C + + CompiIer 5.5 登場 去る 2000 年 3 月 9 日 , インプライズから 「 BorIand C + + Compiler 5.5 日本語版 ( 以下 BCC5.5 ) 」が無償で公開されました (TabIe BCC5.5 は , 3 月 24 日に発売された Windo ws 用 C / C + + 統合開発環境「 BorIand C + + BuiI der5 」に含まれるコンパイラとほば同じ性 能を持った最新の C / C + + コンパイラです また , 現在 Windows 上でもっともポピュ ラーな C / C + + コンパイラである「 Microsoft VisuaI C + + ( 以下 VC + + ) 」との互換性を強く [ 注 1 ] 1 , 付録 CD-ROM に収録 ) 。 TabIe 1 BCC5.5 のスペック CPU 動作環境 OS 特 メモリ HDD 容量 ANSI/ISO C + + 準拠 VC + + との高い互換性 作成したプログラムの再配布 t Pentium CPU および互換性のある CPU ( 推奨 Pentium/166 以上 ) Windows 2000/Windows 95 / 98 / NT 4 ℃ ( SP3 以降 ) 32M バイトのメモリ ( 推奨 64M バイト以上 ) 50M バイト以上のハードティスク空き容量 最新の ANS Ⅵ SO テンプレートをサポート 最新の ANS Ⅵ SO 標準 C + + テンプレートライプラリ (STL) を サポート VC + + 独自の言語拡張に対応 ライセンス条項を守ることで可能 ( 詳しくはライセンスに関するドキュメントを参照 ) TabIe 2 含まれる主要ツール一覧 BCC32. EXE 旧 NK32. EXE B日C32. EXE CPP32. EXE COFF20MF. EXE IMPL 旧 . EXE IMPDEF. EXE MAKE. EXE TDUMP. EXE TL 旧 . EXE GREP. EXE TOUCH. EXE FCONVERT. EXE C / C + + コンバイラ リンカ リソースコンバイラ ANSI/OEM 文字セット変換ユーティリティ タイムスタンプ更新ユーティリティ テキスト検索ユーティリティ ライブラリ管理ユーティリティ ファイル構造解析ユーティリティ メイクユーティリティ DLL やモジュール定義ファイルから定義ファイルを作成 DLL やモジュール定義ファイルからインポートライブラリを作成 ボートライブラリ ( BCC5.5 , Borland C + + Bu ⅱ de 「でリンクできる形式 ) に変換 COFF 形式のインポートライブラリ ( VC + + で生成される形式 ) を OMF 形式のイン C / C + + プリプロセッサ 意識した各種ユーティリティ群も付属して います (Table 2 ) 。 BCC5.5 は最近はやりの 統合開発環境の形ではないものの , この内 容からかなりの潜在能力を見てとることが できます。 こうした人気プランドの最新コンパイラ が , お試し版などといった商品の機能限定 版ではなく , コンパイラとして完全な形で 無償公開されたことは , プログラミングを より一般的に浸透させるうえでも有意義な ことです。また , 作成したプログラムがラ イセンス条項を守ることで再配布可能にな っているのも重要な意味を持ちます。 これまで Windows 上では , 開発環境を 購入してプログラミングを行うことが一般 的でしたが , BCC5.5 の登場によってこの 構造は変化する可能性があるのではないか と思います。 本稿では , BCC5.5 の能力の一端をご紹 介したいと思います。 [ 注 1 ] BCC5.5 のコンパイルコアや付属ツ ールは Borland C + + Builder 5 と同一です。 ただし , Borland C + + Builder 5 に含まれて いる Visual Component Library(VCL) など インストール は含まれていません。 BCC5.5 は , それを構成するファイル群 特別記事 BorIand C + + Compiler 5.5 M に収録 , インプライズの Web サイト (htt を freecommandlinetools. exe ( 付録 CD-RO 137

6. 月刊 C MAGAZINE 2000年5月号

プログラミング技術情報誌・ C マガジン C 0 N T E N T S 。 = , スクリプト言語を作ろう インタブリタの構造と設計 字句解析 構文解析 コンバイル 実行系 効率的なインタブリタの設計 C + + プログラマのための 。 = , C 言語クイックマスタ C 言語で扱う情報 関数 C 言語のシステム C 言語プログラミング学習塾く第 2 回 > デ→を扱う長久勝 8 な′ 0 て叮厚叮のパワーアップ C + + く第 2 回 > オブジ , クト Pe プログラミングの楽しみ く第 4 回 > ネットワークの楽しみ結城浩 水野順 ー大城正典 アルゴリズムラボく第 8 回 > デイザによる擬似階調表現昌達 K'z 画像処理を極める 詳説 JDK 解体新書く第 36 回 > 式 (Expression) ( 5 ) きだあきら Java プログラミングリファレンス Standard C/C + + 『単純な iostream 』 p. J. 円 auge 「 / 熊谷典大訳 く第 1 回 > ハードウェアとプログラムの関係鈴木元治 / イラスト協力 : Stunne 「 ーハードウェア基礎講座 プログラミング相談室 プログラミング相談室毛呂宗夫 8 38 60 68 82 88 93 101

7. 月刊 C MAGAZINE 2000年5月号

特集 1 五ロ - 三ロ を を抽出する作業を字句解析といいますが , は“ ' が 0 個以上後続するものをいいます 必ずしも一度にすべての字句を抽出し字句 が これは正規表現を用いて , の列に変換する必要はなく , 字句解析の次 識別子 = ( 英字に一・ ) ( 英数字に ' ) * の段階である構文解析とともにひとつのパ と簡潔に定義することができます。同様に スにまとめられる場合が多いようです。つ C 言語の符号なし整数に対しても , まり , 構文解析部で次の字句が必要になる 自然言語における単語は名詞・動詞・接 符号なし整数 = たびに , 字句解析部に字句を抽出させるの 続詞・記号などいくつかに分類できます ( 数字・数字 * 川 ( 数字・数字 * ) ' L ' です。この方法は人間が文章を読む際の作 が , コンピュータ言語においても字句はい と定義できます。 業と似ており , 感覚的にも自然なものであ くつかに分類されます。たとえば識別子 では , 今回設計するインタブリタ言語 to るといえます。本稿で例題として作成する ( 名前 ) ・特殊記号 ( 演算子など ) ・整数・実 y の字句定義を見ていきましよう (TabIe 1)0 インタブリタ言語 toy でも字句解析部と構 数などがそうです。 C 言語における識別子 文字列の定義が多少複雑なことを除いて , 文解析部は 1 パスにまとめられています は英字あるいは・ " で始まり英数字あるい かなりシンプルになっています。 toy にお toy の字句解析部 が これについては後述します。 字句定義 LiSt 1 List 1 / * 次の 1 文字を素直に読み込む * / static int getrawchr(void) if( unget ) { unget = FALSE ー return unget—chr ー )else return fgetc ( srcf 厄 x. 。 : 字句解析系 #include <stdio. h> #include く string. h> #include <ctype. h> #include <stdarg. h> #include ″ toy. h ” ー ex—t Lex ー static FILE *srcf; void char * filename) = fopen(filename,nr"); if( ! srcf ) { fprintf(stderr, ”宅 s : CouIdn't open file.%nn, filename); exit(-l); static void ungetchr ( 土 n ヒ c ) unget = TRUE ー unget—chr = C ー static void skipspace ( void ) int c ー while( c = getchr(), isspace(c) ) ungetchr ( c / * 識別子の抽出 * / static void lex—ident( void ) int c, pos = の int type ー void *data ー void c lose—source ( void ) { fcl ose ( srcf } / * 現在処理中の行番号 * / static 土 n セ cur ー ine = 1 ー void error(const char *format va—list は s fprintf(stderr, "ERROR!%rßd : va—start い ist , format vfprintf ( stderr , format , は s し va—end( list); fprintf(stderr,"%n"); 0 lose—source ( ex 辻 ( -1 cu ては ne while( c = getchr(), isalnum(c) Ⅱ c = = if( pos く IDENT—MAXLEN ) Lex. detail.ident[ 00S 十十 ] = (char) ungetchr ( c Lex. detail.ident[pos] = 0 ' ・ if( hash—search( Lex. detail.ident &type, &data) ) { / * 登録済み識別子 ( 予約語や関数名籌 ) の場合 * / Lex. type = type; Lex. data = data; else / * 未登録の識別子 * / Lex.type = IDENT; Lex. is—ident = TRUE; / * 定数の抽出 * / static void lex—const ( void ) int c ー unsigned int num=O; while( 0 = getchr(), isdigit(c) ) num = num * 10 十 (unsigned) ( c ungetchr ( c Lex. type = CONST; Lex. is—ident = FALSE ー Lex. detail . = num; static int unget = FALSE ー static int unget—chr ・ / * 1 文字読み込むただしコメントは除去される * / static int getchr ( void ) if( unget ) ( unget = FALSE; return unget—chr ー )else{ int c = fgetc ( srcf cur line 十十一 ' # ' ) { / * コメント行の除去 * / 引 se if (c - while( c = fgetc(srcf), c ! = '%n' & & c ! = EOF curl ine 十 return c; 特集 1 スクリプト言語を作ろう 13

8. 月刊 C MAGAZINE 2000年5月号

そのほかインストール方法や詳細について は readme. txt をご覧ください。 VBV0ice 4.1 評価版 「 VBVoice 4.1 」は , 電話応対などの自動 音声を扱うコンポーネントです。 ( 株 ) ソフ トボートのご協力により \S0ロ、 BOAIWB Voice ディレクトリに評価版を収録しまし 0 そのほかインストール方法や詳細につい ては , YSOFI 、 BOAT ディレクトリにある re adme. txt をご覧ください。 VBFax 3.0 評価版 「 VBFax 3.0 」は , F , の自動応答システ ムを実現するコンポーネントです。 ( 株 ) ソ フトボートのご協力により \ SO ロ、 BOA 半 V BFax ディレクトリに評価版を収録しまし そのほかインストール方法や詳細につい ては , }SOFTBOAT ディレクトリにある re adme. txt をご覧ください。 Borland C + + CompiIer 5.5 インストール支援ツール 「 BorIand C + + Compiler 5.5 インストール 支援ツール」は , Borland C + + Compiler 5.5 をインストールする際に必要な環境をウィ ザード形式で設定するツールです。 setbccll. exe ファイルを実行すると各種 ファイルが展開されますので , そのなかに 含まれる readme. ⅸ t をご覧のうえご利用く ださい。 このプログラムは Borland C + + Builder 4 ProfessionaI にて作成しました。また のプログラム ( ソースコードも含む ) は配布 や改変を自由に行うことのできるフリーウ ェアとして公開します。 ・ CD ー ROM のディレクトリ構成 ・ Borland TeamSource 1.0 アップデート ・・ Borland JBuilder3 コンパイラアップデート ・・・ BorIand DeIphi 5 アップデートパック # 1 ・ BorIand C + + BuiIder 5 Enterprise トライアル版 ・ Borland Database Engine 5.11 アップデート ・・ BorIand C + + CompiIer 5.5 dPROBE25TRlAL ・、・・・ BOC JProbe 2.5 トライアル ・・・ BOC JClass Ver. 4.0 トライアル ・ CD - ROM 収録プログラムの紹介 ( テキストファイル ) lnprise SOFTBOAT TSUPDATE JB3UP DEL5UP ・・ CB5TRlAL BDE51 IUP BCC55 JCCHART4TRlAL BOC README. TXT VBFax VBFax 3.0 評価版 Announce ~ー・ー・・ ~ ・ Announce! 3 0 評価版 VBVoice ・・、・ VBVoice 4.1 評価版 LSI C -86 Ver 3.30C 試食版 ・ WZ EDITOR with WZ MAIL 4.0 評価版 Lhasa 、一、 = 、・・い ~ ~ ・ヨ zh / zip 解凍ツール "Lhasa BorIand C + + Compiler 5.5 インストール支援ツール ・特集 1 「スクリプト言語を作ろう」 特集 2 「 C + + プログラマのための C 言語クイックマスター」 LSIC WZ4 T00 S ETBCC CMAGA Toku1 Toku2 Perl ・ Cpp ・ Pe 日プログラミングの楽しみ ど兀ーび「ククのパワーアップ C + + ・・・ C 言語プログラミング学習塾 Sodan ・ Hard ・・ Stdccpp ・ Java ref ・ AIgo Tips ・ Vcl L tech " D0ji 、 ・・プログラミング相談室 ・・・新連載「プログラミングの根底を学ぶハードウェア基礎講座」 ・、・翻訳記事「 Standard C ℃ + + 」 ・・・ Java プログラミングリファレンス ・・・画像処理を極める一一アルゴリズムラボ ・・ Windows Programming Tips ・・・ VCL 解体新書 ・・ローテク講座 ・・・恥ずかしながらドジりました ・・・・・・・ ~ ・・・・・・・・・ , 、インタビュー「最新旧回プロセッサ用開発ツールの機能と将来の展望」 ・・学問のススメ千言万語 フィンローダのあつばれご意見番 ・ C マガ電脳クラブ Vtune Lang Appare Puzzle ・ lhasa, ◎竹村嘉人 C D- ROM Contents ・ WZ EDITOR with WZ MAIL 4.0 製品評価版 , 01998-2000 Village Center, c. ・ LSI C -86 Ver. 3.30C 試食版 , 01993 LSIJAPAN CO 、 ,LTD. ・ VBVoice 4.1 評価版 , VBFax 3.0 評価版 , 01995-98 Pronexus 抦 c. ・ BOC JCIass Ver. 4.0 トライアル , 01997-2000 KL Group,Inc. 日本語版開発 : 文化オリエント株式会社 ・ BOC JP 「 obe2.5 トライアル , ⑥ 1998-2000 KL Group,Inc. 日本語版開発 : 文化オリエント株式会社 ・ Borland JBuilde 「 3 コンパイラアップデート、 01998 INPRISE CO 「 po ion. RISE Corporation. ック # 1 、 Borland Database Engine 5.11 アップデート , Borland TeamSource 1.0 アップデート , ◎ 2000 INP ・ BorIand C + + CompiIer 5.5 , BorIand C + + BuiIder 5 Enterprise トライアル版 , Borland Delphi 5 アップテート / ヾ 159

9. 月刊 C MAGAZINE 2000年5月号

List 3 C 言語で書かれたカウントをするプログラム (counte 「 . h) List 4 ノヾワーアップ C 言語で書かれたカウントをするプログラム (counter. c) * counter. h #ifndef —COUNTER—H— #define ——COUNTER-H— St て uct counter { int value; / / カウント値 / * 0 クリアする * / VOid c ー ear—counte て ( st て uct counter* c セて / * 十 1 する * / VOid increment—counter ( struct counter* ctr ); / * カウント値を読み出す * / int get—counter ( struct counter* ctr * counter . C #inc lude "counter ” / * 0 クリアする * / VOid c ー ear—counter ( struct counter* ctr ) ( ctr->value = 0 ー / * 十 1 する * / VOid increment—counter ( struct counter* ctr ) ( 十十 ctr->va ー ue ー / * カウント値を読み出す * / 土 n ヒ get—counter(struct counter* ctr) { return ctr—>value; #endi f List * tr 土引 .0 ー 語で書かれたカウントをするプログラム (trial.c) test fO で ' coun セ e て List 6 カウンタをファイルとして扱うようにした counte 「 . h #include <stdiO. h> / * printf * / #include ” cou セ ne て . h ” / * counter st て uct & functions * / return 0 ー printf("value v); / * 出力 * / V = get—counter ( &C 潺 increment—counter ( & 0 increment—counter ( &c 潺 increment—counter ( & 0 ); c ー ear—counter ( &c Struct counter C ー int v ー int main け ( / * 読み出し * / / * 十 1 * / / * 十 1 * / / * 十 1 * / / * 0 クリア * / / * カウンタを用意 * / * counter. h # ifndef —COUNTER—H— #define —COUNTER—H—— struct counter { char fiIename[641; / * 初期化する * / VOid init—counter(struct counter* ctr, const char* name); / * 0 クリアする * / VOid clear—counter(struct counter* ctr); / * 十 1 する * / VOid inc て ement—counter ( struct counter* Ctr 潺 / * カウント値を読み出す * / 土 n し get—counter ( struct coun セ e て * c セて #endif はいっさいありません。カウンタを利用す る際に必要な操作は , すべて関数として提 供しているからです。 つまり , カウンタに対する操作がきちん と提供されているなら , その利用者はカウ ンタのなかにあるデータを直接触ることが できなくてもかまわないということです。 むしろ , データを直接アクセスするのは好 ましくないともいえます。なぜなら , たと えばもしこのカウンタを作ってくれたプロ グラマが value という変数名が気に入らな くなり , count に改名したとたん , value に アクセスしているすべての利用者側コード の変更を余儀なくされるからです。もっと 怖いのは , メンバに対する不正な書き込み です。たとえばカウンタ値が 0 であるかど うかをチェックしようとして : / * c は struct counter * / if ( c. value = = 0 ) { と書くべきところをついうつかり : if ( c. value = 0 ) { タに対してクリアでき , カウンタを 1 進め カウンタを使う側にしてみれば , カウン 防ぐことができないのです。 故意にせよ過失にせよ , 不正なアクセスを す。 struct をデータとして用いるかぎり , いのにカウント値が 0 になってしまいま とやっちまうと , clear_counter を呼んでな る " + 1 " が可能でカウント値が読み出せる なら , struct counter のなかに何があろう が知る必要も触る必要もないでしよう。極 端な話 , カウント値をファイルに保存しよ うが ( List6 ~ 8 ) 地球の裏側にあるホストコ ンピュータに電話を掛けてデータベースに リモートアクセスしたっていいんです。 このように考えていくと , " カウンタ ' というのは , 前述の : どこびてク″クのパワーアップ C + + 69 穴の空くほど見つめていても上記三つの操 しかしながら struct counter それ自体 ができます。 といったことができる " モノ " とみなすこと ・カウント値を読み出す ・ + 1 する ・ 0 クリアする

10. 月刊 C MAGAZINE 2000年5月号

C + + の新世紀が、はじまる。 C + + による真のビシュアル開発という画期的なスタイルを実現した C + + BuiIdero 設計から、コンバイル、デバッグまで、開発フェーズ全体にわたって機能を磨きあげ、 かってないほど迅速で効率的なプログラミング環境を提供します これから C + + 言語を覚えようという方も、 すっと携わってきた方も、どちらも満足できる充実の装備 新しい時代の C + + プログラミンクは、 C + + Bu ⅱ der からはじまります ジ一 0 いてツライえにつ ーん戸 R を 00. ノッ , ィ•x PO ′・″ 00 プ 0 ) ょッシ 0 0 インターネットへの対応 (pro/Ent) Web ブラウザを実現する部品をはじめ、 HTTP 、 FTP 、 NNTP 、 POP3 など各種のインタ - ネットプロトコルを サポートする部品が提供されています。また、 Web サーバー上のアプリケーションを作成したり、 HTML ページを生成するコンポーネントも充実しています。 心 S よ C や土 V おー Developraene D " 30034 べてのアケ、 CORBA 。 ' 乙 0 / 0 0 4 瓣を一 マルチメディアへの対応 オーティオ、ビテオを含む各種のマルチメティアファイ イル名 ルもビジュアルに利用できます。また、 C + + を使ってい ることで WindowsAP など各種の AP ヤ規格をその。 , 橋面 ~ 0 ゆ . , ん時 E まま活用できます。 ツ安身学 み名 をアクマ孝、わ廴ラ カらイノ「 メモリのバ自動的に検出する C0deGua 「 d (Pro/Ent) 通常のデバッグ作業では見つけにくいメモリのバグや関 数引数の間違いは、 CodeGua 「 d を使うことで自動的に 検出できます。アプリケーションの信頼性を高めるための 膨大な手間を軽減します。 C + + で実現されたビジュアル開発環境 部品を組み合わせるというビジュアルな開発手法と最 新の ANSI C + + に対応する高速コンパイラを統合し、 Windows98 / 95 / NT / 2000 上の広範なアプリケーション を迅速に開発できます。 ル 0 。 の′ー 0 「 0 な ー -00 ′ーをみ ed. -40 き ~ ~ 0 : & ~ " ーのを ( 00. む 00000 ~ 0 : % に朝れ一 ー ( む・ 0 % 00 ( 複数のターゲ外を管理できる プロシェクトマネーシャ XML べースで書きなおされたプロジェクトマネージャは、複 数のプロジェクトの管理やノードごとのオプションの設定を サポートし、大規模なシステムの構築にも威力を発揮します。 インプライズ株式会社 〒 151-0073 東京都渋谷区笹塚 1 -64-8 笹塚サウスビル TEL. 03-5350-9380 FAX. 03-5350-9369 *COPynghte 1999 lnpnse CorPOratiOn-All rights reserved.Alllnprise and BOrland product names are trademarks 0 「、ね g ぶ e 「 ed trademarks otlnpnse Co 「 po io ル *CORBA't 、米国およびその他の国における 0 切 e ロ Management Group (OMG) の商標または 登録商標です。 * その他、記載されている会社名、製品名は各社の商標または登録商標です。 C + + BuiIder 5 ProfessionaI 乗換えキャンへーン実施 ! この機会に是非、 c + + による真のビジュアル開発のパワーをご体験ください。 Visual C + + ユーザーへ Good News!