ぶことになります。デフォルトの 状態ては , 各言語の名前付け規約 の条件は , Table 3 のようになりま す。ただし , コンパイルオプショ ンなどにより , 条件が変化する場 合があるのて注意が必要てす (Tab le 4 ) 。 言語によってシンポルとして使 用て、きる文字に制限があります。 また , 大文字あるいは小文字をシ ンポルとして使用したい場合があ ります。このようなときには , AL IAS を使って任意のシンポルを生 成させることがて、きます。 呼び出し規約 呼び出し規約とは , 関数やプロ シージャを実際に呼び出すときの マシン語レベルての手順てす。 の手順が , 呼び出す側と呼び出さ れる側とて一致していないと重大 な障害となります。呼び出し規約 ては , パラメータを受け渡す方法 , パラメータを渡す順序 , スタック の調整方法が規定されています。 マイクロソフトの言語製品ての呼 び出し規約は Fig. 1 に示すとおり てす。 引数の受け渡し規約 一般にパラメータの受け渡し方 う。 ているかを解析するとよいて、しょ れた側がどのようにデータを返し を受け取っているか , また , 呼ば 呼び出した側がどのようにデータ 成するアセンプラコードを読んて , て戻したい人は , コンパイラの生 いろいろなデータを関数値とし えます。 e を使って値を得たほうが簡単に行 以外のデータは Call by Referenc は簡単に行えます ( TabIe 6 ) 。それ 4 バイト以下の整数値を返す場合 関数の戻り値 5 のようになっています。 各言語て、の受け渡し規約は Table 正しくパラメータが渡されません。 る側とて、同じ方法を用いないと , きます。呼び出す側と呼び出され れた側て、内容を変更することがて 渡す方法て , 変数てある場合呼ば ference はパラメータのアドレスを てす。これに対して , CallbyRe alue はパラメータの値を渡す方法 ばれる方法があります 0CaIIbyV れる方法と Call by Reference と呼 法としては , CallbyValue と呼ば lnformation from Compiler Makers Fig. 1 マイクロソフト言語製品での呼び出し規約 く C の呼び出し規約 > バラメータはスタックを介して渡されます。引数は右から左の順でスタ ックに積まれます。スタックの調整は呼び出し側で行います。 <BASlC/FORTRAN/PascaI の呼び出し規約 > バラメータはスタックを介して渡されます。引数は左から右の順でスタ ックに積まれます。スタックの調整は呼び出される側で行います。 ※これ以外に , C で fastc 訓を使用したときのレジスタを介してノヾラメータ を受け渡す規約があります。しかし , この規約は C でのみ使える規約でミ ックスドランゲージでは使えません。 TabIe 5 引数の受け渡し規約 引数の受け渡し方法 BASIC Pascal FORTRAN CaII by VaIue Call by Reference CaII by Reference Call by VaIue ※ C 訓 by Reference による引数受け渡しでは , アドレス ( ポインタ ) を渡すために nea 「 ポインタか fa 「ポインタかの注意も必要です TabIe 6 関数の戻り値が格納されるレジスタ ( 4 バイト以下の整数値 ) 言語 C 注 ) BAS ℃ FORTRAN パイト数 TabIe 3 言語 BAS ℃ FO RTRAN TabIe 4 言語 BAS ℃ FORTRAN 名前付け規約 ( テフォルト ) 、ンハルの文字 条 件 31 文字までシンボルの先頭にアンダースコア ( ) をつける 40 文字まで大文字に変換する 31 文字まで大文字に変換する オプションによる名前付け規約の条件変化 データ型 Char int, short near * long far * INTEGER ( % ) LONG(&) オプション 条件 2 4 上記以外のテータ lNTEGER*2 lNTEGER*4 -pascal* たは fo 市 an を使用すべて大文字に変換 , ジスタ AL DX 高位の部分 AX 低位の部分 DX セグメント部分 AX オフセット部分 AX 低位の部分 DX 高位の部分 猷データへのオフセット値 AX 低位の部分 DX 高位の部分 AX CDECL を使用 C 属性を使用 先頭にアンダースコアはつけない すべて小文字に変換 先頭にアンダースコアをつける ピリオド (. ) をアンダースコアに変換 すべて小文字に変換 先頭にアンダースコアをつける 注 ) ・ float または doub 厄を返す場合には , その値をグローバル変数 fac にコ ピーし , fac のアドレスをポインタ値として返します。 ・ long doub 厄を返す場合には , 値をコプロセッサ命令を使いコプロセッサ スタックのトップに置きます。 ・構造体を返す場合には , グローバル変数に構造体をコピーしてそのアド レスをポインタ値として返します。 lnformation from Compiler Makers 157
特集℃プロクラミンクの秘 裟すぎますが , 名前が長すぎると , かえっ といえばそうかもしれません。 て全体が見にくくなる可能性があるのは確 しかし , フィンローダ流は②て、す。②の かて、す。そこて、 , 妥協案として , あまり長 長所はふたつあります。 ここに出てくる c という非常に短い名前を い場合には省略する , という方法が考えら まず , すべて小文字て書かれていること 持った変数は , 伝統的に getchar のような 1 て、す。①の場合 , どこを大文字にしたか忘 れます。これも悪くはありません。 文字入力の結果を保存するために使われま れることがあるかもしれませんが , ②て、は す。 c という文字が , character を連想させる char * fname , / * ちょっとだけ省略する * / それはありません。ただし , FileName と書 のて , この場合 c という名前が使われるのて、 この方法の場合 , 長すぎもなく , 全然わ いたか FiIename と書いたかわからなくなる しよう。ただし , c の型は int< あるのが普通 からないほど省略するのて、もない , ように , filename と書いたか file name と書 なのて、 , 注意してください。初心者の中に 加減に成功すれば , かなり効果があると思 いたかわからなくなることはあるのて、 , ② は , これをうつかり char にしてしまうこと います。ただ , ひとつ気になるのは , 経験 のように書いたほうが混乱しないと一概に が多いようて、す。この変数は , 伝統的なの 的に , どの程度省略したのか , しばしば忘 はいえないかもしれません。 て、 , 短いながらもまったく無意味て、あるわ れてしまうということて、す。たとえば , 私が②の書き方を気に入っている理由は , けて、はありませんが , この種の使い捨て変 時ファイルの名称を保存したい変数の名前 単語と単語の間が , アンダースコアという , 数は , その場かぎりて、処理が完結するとい を , tempfile としたのか , tmpfile としたの 見た目がかなり空白に近い文字て、区切られ う意味て、 , 変数名に意味を持たせなくても , か , プログラムを書いている途中て、すら忘 ているため , ばっと見たとき読みやすいと 理解の妨げにはならないのて、す。これに対 れてしまうことがよくあります。 田われることて、す。①の書き方は , 確かに して , 複雑な処理を行う関数の名前や , 大 フィンローダ流は , 慣習として省略した 大文字を認識して単語を分解することが可 局的に使われている変数の名前は , て、きる 書き方が固定したものて、なければ , て、きる 能て、すが , ばっと見たとき大文字小文字を かぎりその意味を表すような名前をつける , かぎり省略しない , というものて、す。 区別するほうが , アンダースコアよりも一 というのがフィンローダ流て、す。要するに ただし , 以上の議論は , 継続的に意味を 瞬手間がかかるように感じます。 長さにはまるて、無頓着なのて、す。 持ち得る変数の場合のことて、あり , 使い捨 とくに , 後者は , わかりやすさに影響し さて , て、きるかぎり省略しないとなると , ての変数はこのかぎりて、はありません。そ 場合によっては異様に長い名前になってし てくると思いますのて、 , フィンローダ流と の中にも , ある程度は慣習的に決まった名 まうことがあります。この名前が , 頻繁に しては②を選択することにしました。 前がありますのて、 , それらが使える範囲に ただ , 場合によっては , ②の短所はもう 使われるものて、あると , かえって名前を読 おいては , ありがちな名前を使っておくの むのに労力を使ってしまうことも考えられ ひとつあります。アンダースコアが比較的 が無難な選択だといえましよう。 入力しにくいキーに割り当てられているキ ます。また , プログラムの見栄えも超高層 ーポードがあることて、す。 ビルが乱立したかのごとくなってしまい , あ スタイル まりおもしろくないかもしれません。 長い関数名について , 本誌 ' 90 年 8 月号の 「恥ずかしながらドジりました」に興味ある 流儀としては , 大きく分けてふたつに分 変数には , 固定した意味が与えられ , プ かれます。ここて、は , 英単語を組み合わせ ことが書かれていたのて , これについて意 ることによって名前をつけることにします。 ログラム , または関数の処理が終わるまて、 見を書いておきたいと思います。手元に 8 月 ① SendMessage その意味を持ち続けるものと , いわゆる使 号をお持ちて、ない方のために , 岩谷氏の主 い捨ての一時的な変数とがあります。一時 このスタイルは , 単語の先頭の文字だけ 張を簡単に説明しておきますと , を大文字にして , 単語をびったりとつけた 的変数としては , 関数の戻り値を取り敢え 「 GU 扱うプログラマは , ものすごく長 ものて、す。 ず入れるとか , ループのカウントに使われ い名前の関数を大量に覚えなければなら ( ② )send message るものがあります。 ない。たとえば , AppJugemJugemuG0k getchar( ) ) ! = EOF) { こちらは , 小文字て、書いた単語をアンダ while ( (c oNoSurikirePaipoPaipo( ) が何をすみゆ ースコアて、くつつけるというものてす。 X 、 Mndow 八ンドブックでみつけた関数 私の経験て、は , ①を好む人が多いような 気がします。理由は , ②のほうが , 名前が 長くなってしまうからて、はないかと思いま す。長い文字をタイプするほうがめんどう 名前さ List XSetWindowBackgroundPixmap(display, window, background—pixmap) : 特集 c プログラミングの秘訣 67
アレゴ Fig. 1 可変長文字列の管理 丿ズ ァータ構造入門 (a) 変数 a には、、 h 0 " 00 変数 b には、、 wo 日 d " がセットされている free ptr 0 W 0 「 (b) 変数 a に。 byebye " を代入し , 以前の値、、 hello " は不要となる 00 00 0 W 0 「 d b y e b y e freeptr (c) ゴミ集めを行い , 最初の a の値。 h 0 " は不要なので削除された ング言語の処理系て、も , W 0 「 d b y e ごみ集めによって 文字列領域を管理します。 セルが「使用中』てあると定められていま Lisp< は , 大もとのセルから到達可能な isp のセルは , 二分木のセルと同じ形てす ) 。 に再びセルへのポインタになっています (L こて , ふたつのポインタ car, cdr がとも struct cell * cdr , struct cell * car : struct cell { C て表現すると次のようになります。 からなるレコードになっています。これを Lisp の場合には , セルはふたつのポインタ かの見分けがつけられなければなりません。 の方法て、メモリ領域が使用中て、あるかどう ごみ集めを実現するためには , なんらか free ptr おくという考えもあります。しかしほとん て , そのぶんのメモリを変数に割り当てて きません。もちろん , 最大長を決めておい からないのて , そのまま格納することはて これに対して可変長の文字列は , 長さがわ は , 変数にそのまま格納することカイきます。 浮動小数点数などの長さが固定長のデータ の扱いについて考えてみましよう。整数や 次に BASIC, awk, perl の可変長文字列 して再利用します。 ないことになるのて , これらのセルを回収 点て , 印のついていないセルは使われてい いきます。セルをたどる処理が終了した時 て、す。このとき訪問したセルに印をつけて ての到達可能なセルを訪問することが可能 car と cdr を再帰的にたどっていけば , すべ す。したがって , 大もとのセルからメンバ どの場合 , 文字列の長さは最大長と比べて かなり短かいのて、 , ムダになる部分が多く なります。たとえば , BASIC て、は最大長 25 5 文字て、すが , 平均的な長さはせいぜい 2 ~ 30 文字くらいて、しよう。また , 仮にムダに目 をつむったとしても , perl のような長さ無制 限の文字列を実現することは不可能てす。 可変長の文字列を表現するには , 文字列 の実体をヒープの中に置いて , 変数には実 体を指すポインタを入れることにします。 これは , 文字列に限らず , 可変長のデータ アルゴリズムとデータ構造入門 77 ち , Fig. 1 ( b ) の hell のように , 使われて こて , ごみ集めを行って , ヒープ領域のう プへコピーてきなくなってしまいます。そ て消費してしまい , これ以上文字列をヒー にしておくと , いつかはヒープ領域をすへ さて , このようにヒープ領域を使い捨て 放置しておきます。 いたヾ he110 〃は不要になりますが , そのまま bye 〃の次を指します。変数 a が以前に指して すようになります。ポインタ freeptr はヾ bye ピーされ , 変数 a のポインタが、、 byebye 〃を指 す。ヒープの最後尾にヾ byebye クの 6 文字がコ う値を代入すると Fig. 1 (b) のようになりま しています。ここて , 変数 a にヾ byebye クとい tr は , ヒープのうち未使用の部分の先頭を指 長さがセットされます。またポインタ freep 変数には文字列の実体へのポインタとその 長さを陽に持つようにしています。つまり , が , ここて、はヌル文字を使わずに文字列の 字 ( \ 0 ) を置いて文字列の最後を示します がセットされています。 C て、は末尾にヌル文 b にそれぞれ he110 ク , 、、 world クという文字列 たとえば Fig. 1 ( a ) ては , ふたつの変数 a と 捨て』にするわけて、す。 にします。つまり , 文字列の実体は「使い 中に文字列の実体を作ってそれを指すよう を書き換えるのて、はなく , 新たにヒープの 数に値を代入するときには , 文字列の実体 順に文字列の実体を格納していきます。変 列になっていて , 先頭から末尾に向かって を扱うときの定石てす。ヒープは大きな配
ロ マ 避 ⑤各コマンドの実行 ⑥スタックポインタを元に戻す ⑦レジスタの復帰 ・初期設定ルーチン (init) 基本的に他コンパイラと同じて、す。フリ ーメモリ開始アドレスの設定て、 preqhead->pbrkadr ( void far * )sdevhead , テパイスドライバ バスワード確認 います。 るだけて、す。コンパイルは Fig. 4 のように行 CS レジスタの値を設定している箇所が異な セットされるため , segread 関数て、取得した とすると CS レジスタて、はなく DS レジスタが それて、は簡単な実例を紹介します (passw ord,c, 付録ディスク収録 ) 。参考文献 [ 1 ] て、いろいろと紹介したため , ネタが残って いないのてひとつだけて、勘弁してください 常駐しないデバイスドライバに興味を持た れた方は参考文献 [ 1 ] のプログラム例を今 回の手法て、書き直してください パソコンを勝手に他人に使用させないた めにキーポードロックを行う TSR プログラ ムを使用している方もおられるて、しよう。 しかし , このようなユーティリティて、はリ セットされたら終わりて、す。そこて、 , CON FIG. SYS の先頭に記述してパスワードを確 訒する非常駐デバイスドライバを作成して ロ・む みます。これて、もフロッピーて、起動された ら終わりて、すが , ハードディスクから起動 するように設定しておくといった方法も考 の えられます。 使用法 DOS ファンクション 06h 直接コンソール I/O TabIe 3 直接コンソール I/O て強制終了しないように < パスワード > 確認中に十回など ード > を入力してください ンキーを押してもう一度最初から < パスワ 修正する機能は付加していません。リター < パスワード > を間違えても四キーなどて、 が大文字に変換するため注意してください スワード > に英字を指定した場合には DOS 10 バイトて、す ( それ以上は無視します ) 。 < パ sword 〃を確認し , < パスワード > の最大長は < パスワード > を指定しないときは、、 pas 無限に入力を求める仕様にしました。 ットしてもとくにメリットがないと判断し , るという方法も考えられますが , CPU リセ ある回数以上間違えたら CPU をリセットす が入力されるまて何度て、も入力を求めます。 ード > を確認します。正常なくパスワード > CONFIG. SYS の最初に登録して < パスワ device=password. sys [ く / ヾスワード > ] Fig. 4 LSI C ー 86 Ver 3.20 用コンノヾイル・リンク lcc —c devsm pl.c link devsmpl, devsmpl/noi, , %LSIC%*L 旧 *S*dosIib , if exist devsmpl.sys del devsmpl.sys 「 en devsmpl.exe devsmpl.sys Fig. 5 パスワード確認テパイスドライバのコンバイル・リンク ( 1 ) Turbo C Version 2.0 / Turbo C 十十 Version 1.0 ( 引 NY モテル ) tcc -c -B -w -mt -k- -zPDGROUP password. c tlink passwo 「 d, passwo 「 d. sys/t, /c, %TC%*L 旧 *cs ( 2 ) Microsoft C Compile 「 Version 6.00A ( SMALL モテル ) ICC —C pass 、 MOrd. C ( 3 ) LSI C ー 86 Ver 3.20 ( SMALL モテル ) del $$$. dat symdeb password. sym passwo 「 d. sys く $$$. dat echO w : q >>$$$. dat echo m303 LI 2 300 : eW306 strategy inthdl >$$$. dat 「 en password. exe passwo 「 d. sys if exist password. sys del password. sys mapsym passwo 「 d cl -J -Gs ー、Ⅳ 3 -Zpd password. c -link /m/li ren passwo 「 d. exe passwo 「 d. SYS if exist password. sys del password. sys link passwo 「 d, password/noi, , %LSIC%*L 旧 *S*dosIib , 引数 返り値 機能 AH=06h DL=OFFh : 標準入力からの入力 DL*OFFh : 標準出力に出力 INT 21 h DL=OFFh の場合 ゼロフラグ = 1 : キー入力なし (AL=O) ゼロフラグ = 0 : キー入力あり ()L : キー入力テータ ) 標準入力からの入力または標準出力から の出力を行う 皿十などの制御文字の検査を行 わないので制御文字も取得できる TabIe 4 直接コンソール入力 DOS ファンクション 07h 直接コンソール入力 引数 AH=07h INT 21 h 返り値 AL = 入力文字 標準入力から 1 文字入力されるまで待 ち , そのコードを AL レジスタに返す 機能 このファンクションは文字のエコーや 十の検査は行わない 新 MS-DOS プログラミング入門 95
さあ始めよう / C 言語 . C 言語用プログラミング支援ツ→レ「簡単シリー “はじめたよ IJNIX ”私達はマルチプラットファームを目指します。 「キー入力が簡単」「ウインドウか簡単」を大幅に機能拡張し、 Fo 「 D 「 ofession 引として 4 月 1 日より発 売予定 ( DOS 版 ) 順次 IJNIX DOS / V にも対応予定。 「キー入力が簡単」「印字が簡単」「ウインドウが簡単」「クラフが簡単」 V . 2.0 ーー \ 28 , 000 V R. 2.0 ーー \ 18 , 000 V R. 1.0 ー \ 28 , 000 V R. 1.0 ーー \ 14 , 000 グラフ描画関数と、 N88BASlC を基本に キー入力関数・テキスト画面制御関数・カ テータ出力関数・ピットイメージ出力関数・ 各種のウインドウ制御関数と、 N88BASlC ーソル制御関数を提供します。キー入力関数 プリンタステータスチェック関数を提供しま を基本にしたグラフィック関数を提供します。 したグラフィック関数を提供します。描画で 最大 20 個のオーバーラップ・ウインドウをオ は、指定された位置で指定された桁の入力を す。文字列テータはもちろん、罫線テータも きるグラフは、棒グラフ ( 縦・横 ) 、折れ線グラ 受けつけ、入力テータを指定されたエリアに ープンできます。テキストモードとグラフィ フ ( 縦・横 ) 、円グラフの計 5 種、棒グラフと 同時に出力できます。文字列も罫線も、画面 格納します。入力テータタイプもチェックし、 ックモード双方向をサポート、ウインドウ内 のように桁・行て印字位置を決めるのて桁合 折れ線グラフは重ね合わせも可能。色やライ 漢字入力したいところではフロントエンドプ わせは不要。文字列は、拡大・下線・網掛け でのキー入力関数・テキスト画面制御関数・ ンバターンの設定は自由です。描画のための ロセッサを立ち上けます。カーソルは、現在 等の特殊効果を同時に指定可。罫線は実線 カーソル制御関数もそろっています。文字列 テータテープルをセットして関数をコールす 入力中の位置に表示します。テータ表示色・ 表示関数は、ウインドウ・サイズに合わせた 破線それぞれに太 / 細の計 4 種類をサポート、 れば、グラフ本体はもちろん、タイトル・グ アトリピュートも、 PF キーガイドラインの 自動改行機能を持っているので、プログラミ リッド・単位・凡例まで、全て関数内で計算・ ピットイメージを出力して引く罫線よりも高 表示 / 非表示も設定自由、 PF キーガイドラ 速に印字します ( 社内テスト結果 : ピットイメ ングの手間もぐっと省けます。通常のウイン 描画するので、メインプログラム側ての計算 インには任意の文字列を任意の色で表示でき ージ出力で 10 分かかった表が、 6 分で出力完 ドウに加えてメニュー選択処理のためのメニ 処理は何一つ必要ありません。「簡単シリーズ」 ます。ロールアップ / ダウン・ BS ・ HELP ・ 了に′ ) 。また、文字と罫線を同じ桁・同じ行 は全て併用可能ですから、「ウインドウが簡単」 ューウインドウや、 Y / N のキー入力を受けて HOMEe 十 c の特殊キーも全て取得 OK 。リ に出力できるので、ムタのない帳票を設計で 返せるメッセージウインドウもサポート。ユ と「グラフが簡単」を併用すると、グラフが出 アルタイム・クロック表示関数や、ダイレク きます。もう、制御コード出力処理だらけの るウインドウを画面上にオープンする、なん ーサー・インターフェイスの優等生・ウイン ト・キースキャン関数、 V - 日 AM のリード / 読みにくいプログラムとはオサラバです。 ドウ処理を、メモリ操作なしのお手軽プログ てことも、あっとオドロク簡単さでできてし ライト関数等も用意しています。 ラミングで実現できます。 まいます。 「マウスが簡単」ワトドコ←が簡単」「ヘルプが簡単」「エテイタ入力が聾」 VER. 1.0 一一 \ 18 , 000 V . 1.0 ーー \ 22 , 000 V R. 1.0 ーー \ 28 , 000 V R. 1.0 ーー \ 22 , 000 マウスドライバとのインタフェース関数を アプリケーションの使用方法を導く高機能 グラフィック画面をモノクロ 8 階調または、 長めの文章をキーボードから入力する機能を 提供します。「キー入力が簡単 V2.0 」と「ウイ カラープリンターに八一ドコピーします。領 なボップアップ ( アドバイサ ) 関数を提供しま 簡単に実現てきるテキストエテイタ関数を提供 ンドウが簡単 VI .0 」と併用すると、プルダウ 域指定や色指定など豊富なオプションも用意。 します。アプリケーションでコメントを入力し す。 100 タイトル ( 300 頁 ) のヘルプメッセージ ンメニュー関数や、ダイアログ関数 ( 文字列、 その他、アプリケーション実行中に現在の画 をサポート。タイトルメニューと関連タイト たり、通信ソフトで手紙を入力したりするため メニュー、リスト・ボタン、シートなどの豊 面を Disk にセープする常駐プログラムと、 ルのリンク機能を持ち、階層的ヘルプを実現 のエテイタ入力機能を関数ひとつで実現できま 富なアイテム ) 、マウス情報取得関数か使用で セープしたテータを圧縮するプログラム、更 できます。工ラー・警告・カイド・質問を出力す す。最 50 字 x 6500 行のテキストエデイタが、 きます。 るメッセージ機能もあり、ヘルプ機能と連動す 同時に 20 個作成できます ( 但し、メモリに依存し にそれらのテータを再表示したり、印字した マウスのアクションに対して各関数が返す値 りするプログラムも装備しています。 るとユーサーフレンドリーなアプリケーション ます ) 。日本語対応、スクロール、行単位のカッ として、任意の値をあらかじめ設定すること 苦労して作った美しい画面の利用範囲が広が を簡単に開発できます。 DOS 配下てヘルプメ ト & ペーストをサポート。その他、本格的な工 もできます。このことを上手く利用すれば、 ります。 ッセージを参照するユーティリテイや、専用工デ テイタの開発を支援する関数群を豊富に揃えて マウスとキーボードを併用するアプリケーシ 今まで苦労していた、テキスト・グラフィッ イタも付属。マニュアルレスな弋のアプリケー います。「キー入力が簡単」にエテイタ入力機能 ク画面の八一ドコピーを手軽にでき、マニュ ョンを作る際、マウス用のロジックとキーホ ション開発にお役に立ちます。 ( この商品をお使 を拡張した関数も用意しました。「キー入力が ード用のロジックが一本化できるのて、プロ アル作成時の画面レイアウトとして幅広く利 い頂くときには、別売「ウインドウか簡単 V. 1.0 」 簡単」の手軽さでエテイタ入力機能を実現てき 用できます。 グラムが長くならすに済みます。高い機能を か必要です。別売「マウスが簡単Ⅵ .0 」をお使い ます。 ( この商品をお使し順くときには、別売「キ 短いステップで、簡単シリーズの身上てす。 の方には、マウス対応版のヘルプ関数も用意し ー入力か簡単 V. 2.0 」が必要です。 ) ています。 ) 「ファイレ・エテイタ」 VER. 1.0 ーー \ 18 , 000 「簡単ツールエテイタ」 「 RS -232C が簡単」 ソフトウェア・システムを開発する際のテータ・ファイル設計を支援するエテイタ。テータファイル VER. 1.0 ー \ 22 , 000 VER. 1.0 - ー \ 15 , 000 のコードサイズ、各テータ項目のタイプ・長さ・名称等を入力すると、定義テープルがソースコード として出力され、さらにファイル・レイアウトの印字も可能。 アプリケーション・プログラムの通信用ドライバ 「簡単シリーズ」のテータテープルを編 として常駐し非同期方式て通信を行います。転送 集するための、専用工テイタです。 速度は、 75BPS ~ , 200BPS までをサポート。 ・「住所録を作ろう」 「作ろう」シリーズ ・ VER. 1.0 ー \ 6 , 4 通信部の割込機能の設定もユーサー側で変更でき、 画面上で、マウス ( なくてもかまいません ) やキー ・「スケジュール表を作ろう」・ ・ VER. 1.0 ー \ 7 , 200 受信レティ・送信レティ・送信バッファ工ンプテ ホードを使って、実行画面や帳票のイメージをワ ・「こづかい帳を作ろう」・ VER. 1.0 ー \ 8 , 600 ( ソース付 C 言語の教育用パッケージ ) ィの中から選択可能です。また、バラメータ等の ープロ感覚で入力すると、そのまま使えるソース ・「らくがき帳を作ろう」 ・ VER. 1.0 一 \ 9 , 800 指定により、ドライバ部を介さす自ら相手側と通 コードか出力されます。これ 1 本て「キー入力 ( V 信できる機能、割込処理の禁止 / 許可機能等も付 2.0 ) 」「印字 ( V2.0 ) 」「ウインドウ ( VI.O ) 」「グラフ ロステム供通 ) 属。さらに、ドライバ部に送受信用パッフアか装 ()I .0 ) 」をサポートしています。テータ編集中に 備されているため実行中のアプリケーション・プ 擬似テータを使って表示したりできるので、テス ログラムが変更されてもテータ通信を継続して行 トランの必要もなく、「簡単シリーズ」でアップし ・本体 : (XA/XL/XL2/RLJk イレゾ / LT を除く ) うことが可能なように設計されています。ソフト た開発効率を 60 ~ 40 % も更に引き上けることがで ※全商品プロテワトなし、サンプ ・ OS : MS-DOS V3. レ 3.3 ( F ・ PMS - DOS に添付のもの ) 開発の参考となるよう解り易いサンプルプログラ きます。 ル付きでヴ。 ・プリンタ : NEC PC - P 日浦 1 系、 PC - P 日 2 田系 ※サンプルソフトを実費 ( \ 1 , 5 ) ムも添付。 ・コンバイラ : Mic 「 osoft-C/Lattice-C/Turbo-C/Quick-C で販売中 / ユーサーの側に立ったライプラリ設計、簡単シリ ( 簡単シリーズは、御使用のコンバイラを指定して下さい。 ) ※全商品ロイヤリティフリー ・メティア : 5 ・ 2HD / 3.5 ・ 2HD ( 御希望のメティアを指定して下さい。 ) ーズの一貫した思想です。 ※記載されている内容は、将来予告なしに変更することがあります , ※お問合せはお近くのマイコン・ショップか、私どもへどうぞ ※ MS-DOS 、 Microsoft-C 、 Quick-C は、米国 Mic 「 osoft 社の ・株式 会社 登録商標です 〒 790 愛媛県松山市北藤原町 1 ー 26 ※ Lattice-C は、米国 Lattice 社の登録商標です TEL : ( 0899 ) 3 ト 2886 FAX : ( 0899 ) 41 ー 0336 ※ Turbo-C は、米国 Borland ⅲ te 「 nation 引社の登録商標です . く資料請求番号レ 2 〉 関数をコ - , しするたけ 、デ - タテープしをセットい、
2 回に分ける程度て、配布したかったのて、す が , 付録ディスクの容量の関係て、 , やむな く 3 回に分けて配布することになりました。 読者の方にご不便をおかけすます。 配布ファイル て、配布したファイルはバージョン 1.03 てす。 C マガジン ' 91 年 10 月号および ' 92 年 1 月号 ることになっています。 ージョン番号の 0.01 の桁がひとつずつ上が 在の djgcc て、は , パッチを 1 回あてるごとにバ まず , バージョン番号の説明て、すが , 現 ノヾージョン 1.00 の djgcc に patchl, patch2, patch3 をあてたものと同じということにな ります。 そして , 今回の配布ファイルは patch4 と patch5 なのて、 , これを使ってバージョン 1. 03 の djgcc をバージョン 1.05 にバージョンア ップすることがて、きます。 patch4 と patch5 は , オリジナルの配布フ ァイルて、は , patch4. zip および patch5. zip と いう別々のファイルて、配布されています。 しかし , 付録ディスクに収録するものは , それをまとめたものて、す。 patch4 にも patc h5 にも含まれているファイル ( つまり , pat ch4 て、アップデートされ , なおかっ patch5 て、 さらにアップデートされたファイル ) につい ては , patch5 に含まれているもののみを配 布します。 また ,yshibata 氏による 98 パッチも配布し ます。前回の配布と同様 , yshibata 氏のオリ ジナルの配布ファイル djgpp98i ( ドキュメン トおよび差分ファイル ) のほか , その差分フ ァイルを使って作成した 98 用の実行形式も 配布します。 98 パッチには , オリジナルの djgcc のバー GNU CC の利用および移植方法 Copyright ◎ 1 988 , 1989 , 1 990 Free S0ftwa 「 e Foundation, c. , / 1 991 Proceed' 旧 c. Richa 「 d M. Sta Ⅱ man 著 / ( 株 ) プロシード訳 / 1991 年 1 月 15 日改訂 Ve 「 . 1 .39 用 * 1 「非互換性がある」「非 互換性がない」といういい方 は少し逆説的てす。「互換性 がない」「互換てある」といっ たほうがよいかもしれませ ん。 * 2 mktemp は , 一時ファ イル用のファイル名を生成 する関数てす。 ' 91 年 1 月号 の 75 頁の解説を参照してく ださい * 3 ほかの多くのコンパイ ラては , f00 ( b ) カ” b " に展開 されます。これは使い方に よっては便利てすが , 意図 しない置き換えが生じる危 険があります。 * 4 typedef name の訳て す。 * 5 type modifier の訳て す。しかし , 本来「型指定子」 は type specifier のことて す。かといって「型修飾子」 ては type qualifier のことだ 4. GNU CC の非互換性 GNU C と従来の多くの ( 非 ANSI)C との間には注 意すべき非互換性 ( * 1 ) がいくつかある o'-traditional' オプションは GNUC に対し伝統的な C コンパイラと 同じような処理をするよう指示する。 このオプションによって多くの非互換性がなくな るが , すべてではない。 ・ GNU CC は通常文字列定数を読み出し専用にす る。同じ文字列が複数使用された場合 , GNUCC は ひとつの文字列しか生成しない この結果 , mktemp 関数の引数として文字列定数を 使用することはて、きない。 mktemp は常に引数によっ て指示される文字列を変更する ( * 2 ) 。 いくつかのシステムて、は , sscanf のフォー マット指定に文字列定数を使用した場合に正しく動 作しなくなる。 sscanf が誤って文字列定数に書き込 もうとするからて、ある。 fscanf および scanf も同様て ある。 これらの問題に対するいちばんよい解決法は , れらの目的に使われる文字列定数の代わりに char 型 の配列変数を使用し , それらの配列を文字列定数て 初期化するようにプログラムを書き変えることて、あ る。これが不可能な場合には '-fwritable-strings' フラ グを使用すればよい。このフラグは文字列定数を多 くのほかの C コンパイラと同様に扱うよう GNU CC ー traditiona ドはこのフラグを有効にす に指示する。 る。 ・ GNUCC は文字列定数の中のマクロ仮引数を置き 換えない。たとえば , 次のマクロは GNUCC て、は引 数 a の値によらず " a ”を生成する ( * 3 ) : #define foo(a) ” a ” '-traditional' オプションはこれらの場合を伝統的 ( 非 ANSI) コンパイラと同様の方法て扱うよう GNU C C に指示する。 ・ setjmp および longjmp を使用した場合 , 正しい値を 保持する自動変数は v 引 at ⅱ e と宣言されているものの みてある。これは自動レジスタ割り付けの結果て起 こる。次の関数を見てみよう : jmp buf 信 f00 ( ) し , す。 88 うまく訳すのは困難て C MAGAZINE 1 2 4
級な論理を使うときも , それの真理関数的 な含意を素早く正しくチェックて、きる機能 は , しばしば役に立ちます。プログラマと してのあなたは , このスクラッチパッドを , 複雑な論理式や , デシジョンテープルや , 指定などのチェックに使えるて、しよう。 このスクラッチパッドプログラムは , 偉 大なる論理学者へのささやかな敬意のしる しとして QUINE と命名され , パプリックド メインて、入手て、きます。実行バージョンと 完全なソースコードは , COMPUTER LA NGUAGE のプレテンポードサービス , また は , CompuServe の CLMFORUM の LIBI か ら得られます 0QUINE は Pascal-C 、書かれて おり , MS-DOS システムの上て、ランしま す。それは , EGA または VGA モニタを必要 とします ( この不幸な制約は , 非標準の文字 セットを使っているためて、す ) 。 コードの大部分は ( 基本的な評価マシンも 含めて ) , 標準的な PascaI て、書いています。 機械依存とオペレーティングシステム依存 の部分のみ , Turbo PascaI の非標準的な機 能を使っています。他のシステムへの移植 は , 簡単て、はないとはいえ可能て、す。現在 のバージョンは , 実は私が最初にこのプロ グラムを開発した DigitaI の PRO 350 から移 1 2 3 4 5 6 植したものて、す。 殊文字 ( ギリシア文字と連結記号 ) は , 工ス 式を評価するためには , そのためのファ [ 参考文献 ] ケープシーケンスという方法て、入力します。 ンクションキーを , 当の式の行にカーソル マイナス記号を二つ続けると , コメントの がある状態て、押します。押したキーの種類 [ 1 ] Quine, W. V. O. Method of Logic. 開始という意味て、す。コメントは行末まて、 に応じて , V, C, または N の文字が評価フ Reinhart and Winston, 1961. て、す。 ィールドに出ます。クエスチョンマークが [ 2 ] Strawson, P. F. lntroduction to Lo 行のデータ部分に式を入力したら , カー 出たら , 何かのエラーて、す。このスクラッ gic Theory. Methuen and Co. , 1952. チパッドの内容は , いって、もプリントした [ 3 ] ソルがその行にあるままて、ファンクション Knuth D. E. The Art of Computer キーを押すと , その式に名前 ( 1 文字のギリ り , 指定のファイルにセープて、き , セープ Programming, V01 1 : Fundamen シア文字 ) が付きます。この文字は , 名前の したものを後て、また取り出すこともて、きま ta 1 Algorithms. Addison-Wesley, フィールドに現れます。もうーっ別のキー す。 1968. を押すと , その式の評価 , または別の式の スクラッチパッド 部品として使うことを指定します。式がシ の使い方 ンタクス的に正しければ , 指定フィールド にコロン ( : ) が現れ , 正しくなければクエ スチョンマーク ( ? ) が出ます。 List 5 = T Node : Scratch (Left) Reduce—I mp 1 0 朝 00 り 00 3 00 00 00 00 っ 0 3 00 3 4 4 4 4 4 4 4 4 4 -0 -0 -0 【 0 -0 END ELSE BEGIN New (q { , Operator)) WITH qA DO BEGIN N_Type N_Operator N_Left_L i nk END ・ Reduce—Impl Operator = 0p_Not ・ = Left ・ N_Right—Link ・ = NIL ・ END ELSE BEGI N New (q { , 0perator)) WITH qA DO BEGIN Operator ・ N_Type = Op-Impl ・ N_Operator N_Left_Link = Left ・ N—Right—Link ・ = Right ・ END ・ Reduce—I 叩 1 END ・ Fig. 2 画面の各行には 4 個のフィールドがある 評価フィールドⅣ = 妥当 , C = 矛盾 , N = 無矛盾 ) スペース 名前フィード ( 式の名前・・・ 1 文字のギリシア文字 ) 指定フィールド ( この式か指定されたらコロンが表示される ) スペース 80 Gianfranco Boggi0-Togna 氏は , 20 年以上 のソフトウェア開発の経験を持つコンサル タントです。彼はイタリアのミラノで仕事 このスクラッチパッドは , 真理関数論理 をしています。 を学ぶための良いツールて、すし , もっと高 真理関数論理のためのスクラッチバッド 29
ライフボート lnformation from Compiler Makers Q PC ー 9801 シリーズで , DOS / 16 M を使ったツールを RAM ディスク などと共存させる場合に , 拡張メ モリの競合が起こらないように環 境変数を適切に設定する必要があ ります。設定すべき値を取得する いい方法はありませんか。 A MS-DOS についてくる RAM DISK. SYS や EMM. SYS の場合 , これらのデバイスドライバが使用 した残りの拡張メモリの大きさが , 0040 : 0001 番地に 128K バイト単位 て入っています。ただし , 将来の 機種にわたって , このアドレスに 拡張メモリの大きさが格納される ことはメーカによって保証されて いるわけてはありませんのて、 , 新 しい機種や型名が同じても ROM が 変わったりした場合には , 確認が 必要てす。しかし , このことはか なり広く知られているのてあまり 心配はいらないと思われます。ま ハイレゾモードては , メモリ ウインドウ機構により , デフォル との状態ては , 80000h—BFFFFh 番地が , 100000h ~ 13FFFFh 番地 と同じ RAM に割り付けられていま すから , 拡張メモリとしては , 14 0000h 番地から使用するように指定 しなければなりません。ハイレゾ モードとノーマルモードの区別を プログラムて行うには , 0050 : 00 01 番地の第 3 ビットを参照して , そ の値が 1 の場合には , ハイレゾモー ドになります。 List 1 のようなプロ グラムて , 設定値が判断てきると 思います。なお , この部分を DOS / 16M が自動的に行えるように , 現 在作業中てす。 Q stdaux を使って RS ー 232C ポー トを通して , データのやり取りを したいのですが , データをうまく 受け取れません。データの送信は 行えるのですが , stdaux からの読 み込みはできないのですか。 A stdaux は , 読み書きの両方が 可能て、す。 f 叩 en 関数のパラメータ て、いうと , 、、 r 十〃て、オープンされた 状態になります。てすから , ひと つのファイルポインタ stdaux て、 , 読み込みと書き込みを兼用するこ とがてきます。ただし , こて、注 意が必要なことは , 読み込み状態 から , 書き込み状態へ移るとき , または , その逆に書き込み状態か ら読み込み状態へ移るときに , モ ードを切り換えることを知らせる ために , fseek 関数を呼び出さなけ ればならないということてす。し たがって , fprintf 関数などを用い て , stdaux に書き込んだ後 Mfget s 関数を使って stdaux から読み込む 場合には , fgets 関数を使用する前 に , fseek (stdaux, OL, I) を呼び 出さなければなりません (List 2 参 照 ) 。 fseek 関数に渡すパラメータの 意味は , ファイルポインタ stdaux に対して , ファイル内の現在の位 置から相対的に 0 バイト移動 , すな わち移動しないということて , うすることにより副作用を与えず に , f ek 関数を呼び出すことがて きます。 Q マニュアルには , 日本語処理 を行うときに一 e0 〃オプションを指 定するように書かれていますが , この指定をしなくても , 何も異常 が見られません。もちろん , プロ グラム中には , 漢字を表示したり , 日本語文字列を扱う箇所が多数あ ります。なぜでしようか。 A 文字列の中て , \ 記号は特別な 意味を持ちます。たとえば , \ 記号 の後に , n があれば , 改行コード (ASCII コードの 0x0C ) に変換され ます。 MS-DOS 上て、は , 漢字コー ドとしてシフト JIS コードが使われ ますが , シフト JIS コードの第 2 バ イトにはこの \ 記号と同じ値 ( 0x5C ) を持っ漢字があります。たとえば , 、、導クという漢字のシフト JIS コード は , 0X895C てすから , 、、噂〃という 文字列は , 、、 \ X89 \ 〃と同値て、す。 すると , 第 2 バイトの次の引用符 は , 文字列終了の引用符て、はなく , 文字列中に引用符を表示するコー List 1 1 : #include く s i0. h > Lattice C ドになってしまい , 文字列を終了 させる引用符がなくなってしまい ます。 ー e0 オプションの日本語処理と は , 文字列中の漢字コードを正し く認識し , 漢字の第 2 バイトが \ 記 号と同じコードてあっても , \ 記号 の処理をしないようにするオプシ ョンて、す。て、すから , 、、クという 文字列を一 e0 オプションなして , コ ンパイルした場合には , コンパイ ルエラー ( 文字列が閉じていない ) になりますが , ー e0 オプションをつ ければ , 正しくコンパイルてきま す。また , 偶然にも第 2 バイトに \ 記 号と同じコードを含んだ漢字コー ドを使っていなかった場合には , ー e0 オプションをつけても , つけな くても , 正しくコンパイルて、きま す。 2 : unsigned char far * DATA401 = ( si 馴 char far * ) 0X00400001 : 3 : unsigned char far 事 DATA501 = ( 凹 si 馴 char far * ) 0X00500001 : 4 : 皿ⅲ ( ) 6 : if(*DATA501 & 0X08 ) ( / * High resolution * / printf("set DOS16M = 1 280 ー " , *DATA401 * 128 + 1024 ) : 9 : else ( / * NormaI * / printf("set DOS16M = 1 01 \ n " , *DATA401 * 128 ) ; 11 : 10 : 8 : 7 : List 2 lnformation from Compiler Makers 161 17 : fprintf(stdaux, " : 16 : fseek(stdaux, 0 し 1 ) : 15 : printf("Received ね : buff) : 14 : fgets(buff, 80 , stdaux) : 13 : fseek(stdaux, 0 し 1 ) : 12 : fprintf(stdaux, Require reply"); 11 : fprintf(stdaux, "Transfer parameter") : 10 : fprintf(stdaux, "Transfer commnad") : 9 : system( ” S般記「 0 1200 b8 none sl xon ” ) : 8 : memset(buff, 0 , 8 の ; 6 : char 面 ff [ 8 の : 4 : main() 3 : #include く string. h> 2 : #include く stdlib. h> 1 : #include く s i0. h 〉 7 :
円羽信 プログラミング ( その 4 ) イラスト / 山形彰吾 ⅱ刪つ だ , 知的だ , プログラムだといって , まあ , インテリだ , ハイカラだ , おしやれ いているようだ。 段て、ある。さて , どうやら今日も手紙が届 郵便はまだまだ利用価値の高い情報伝達手 さがうんぬんされているが ( いわずもがな ) て、よいのかもしれない。パソコン通信のよ ろ , 自分のペースて、じっくり取り組めるの もとくに不便は感じていないようだ。むし 彼は生来の筆まめなのか , こういう形式て 活時間帯の差のために郵便て、行われてきた。 実際の勉強会は , 私とロバート氏との生 12 月のことて、ある。 格的に始まったのは 1991 年も押しつまった ロノヾ ート氏との C プログラミング勉強会が本 老紳士 ( 70 ちょっとすぎくらいか ? ) て、ある まわっている ) 。頑固て、はあるが , 気のよい しており , 町内の知人にしきりに吹聴して コンをワープロとして使えることを誇りに ことがないという人物て、ある ( 彼自身はパソ り , パソコンはワープロとしてしか使った おろかプログラミングそのものに無知てあ ーて、ある我がロバート佐々木氏は , C 言語は この連続実践レポートに登場するヒーロ ロ / ヾ と , いうわけだ。おわかりか ? puts(" 戦くことはない " ) : main( ) #include く stdiO. h > ート佐々木 152 C MAGAZIN E 1 2 4 につきあっていると , 何がこの実践レポー ただし , あまり漢字読み取りクイズ か , なんというか。さっそく , 返事を郵送 りクイズにしてしまっている。大胆という てあるこの連載記事を , 毎号 , 漢字読み取 も , 迷走とはいえ <C プログラミング講座 > またもや puts ( ) に戻ってしまった。しか トの目的なのか不明確になってしまう。そ こて、 , あえてロバート氏の徴発にはのらな main() 問題です。 こんにちは , し、 #include く stdiO. h > お元気でなにより。ところで ムでは数字しか表示されんが , ちょっとし ところで , 本題だが丹羽さんのプログラ いう言葉さえ知らんかもしれないがな。 い。ま , もっとも「論う ( あげつらう ) 』と の欠点を論うなどということは趣味ではな よう。小生は , 寛大でならした男だ。若人 使う物であろうが。まあ , それはよいとし の計算のように膨大な計算をさせるときに ンピュータは人間ができないような天文学 を愚弄している内容ではないか。第一 , コ 比較して丹羽さんの問題はあまりにも小生 んのか ? 小生の提出した文化的な間題と ろいのか。丹羽さんはひと桁の暗算もでき ことにコンピュータを使用して何がおもし まあ , 考えて見ると 1 十 2 * 2 なんぞという 然とたわむれるような生活がしたいもんだ。 んでいるという。小生も吉夫君のように自 休みには 4 輪駆動車で山よ川よと広範囲に遊 会があったのだが , 次郎君はさすがに若い。 ないか。先日も俳句仲間の次郎君と会う機 らといって問題をすりかえるのは卑怯では 丹羽さんよ , 『戦く ( おののく ) 』が読めんか 速達て、届いた。 ひっかかることがあったのだろう , 返信は ト氏は猛烈な早さて返事をよこす。今回も の内容にひっかかるところがあるとロバー いつものことだが , こちらが送った手紙 何が表示されるでしようか ? 丹羽信夫 printf ("%d", 1 十 2 * 2 ー 3 / 3 ) ; た改造で」、生の使っている Turbo C で実行す ると心霊現象のように fTurbo-C ー Copy right (c) 1988 Borland lntl. 』という文字 列が表示できる。なかなかのものだろう。 数字から文字列を作成してしまうのだ。 puts ( 1 十 2 * 2 ー 3 / 3 ) : main ( ) #include <stdio. h> または , これでもいい。 printf(l 十 2*2ー3/3) : main() #include く stdio. h > puts(4) : りがおかしいような気もする。相当に気が それに , なんとなく , 文章のつなが ちがいを論うということて、はないのだが へ行くはずがない。これは変だ。他人のま ト氏のお孫さんて、はないか。 4 輪駆動車て山 ってしまっている。吉夫君といえばロバー る次郎君が次の文章て、は吉夫君にすりかわ 単なるうつかりか , 手紙の中て引用してい ロノヾーー ト氏も , 年齢のせいか , あるいは ロバート佐々木 ッセージでも表示することはできる。 だ。で , あるから , やろうと思えば 5 番のメ 単に 4 番のメッセージを表示しているだけ これで , カラクリがわかっただろうか ? main() #include く stdiO. h > ついでだ , もっと簡単にしてしまおう。
SkSeIIllCe 0 てもいいわけて、 ,getch( ) て、得た文字を使っ て if 文や switch 文て分岐するのとまったく同 じように , get next event ( ) が返したイベ ントの種類によって分岐すればいいのてす。 次のイベントを得て , イベントの種類に応 じた処理を行う部分はイベントループと呼 ばれています (List 3 ) 。 List 3 が List 1 と似た形をしていることに 注意してください List ボーリングの疑似プログラム 4 1 : void polling(void) 3 : 4 : 5 : 6 : 8 : 9 : 10 : if ( キーが押された ) { / * キーが押されたときの処理 * / if ( マウスのボタンが押された ) { / * マウスのボタンが押されたときの処理 * / List ポーリングするイベントが多くなってくると・・・ イベント駆動の現実方法 関数 get_next event を使う方法はよくわ かりましたね。 今度は関数 get next event を作る方法を 考えましよう。イベント駆動の実現方法に は , ・ポーリング ・割り込み のふたつの種類があります。以下て、はこれ らを順に説明していきます。 ポーリング イベント駆動の実現方法のひとつは , ポ これはプログラムの一部を並べてもわか ーリングと呼ばれる方法てす。ひとことて、 りにくいのて , Fig. 1 を参照してください いえば「まだかまだかと見張っている」方法 この方法の長所はデータの読み落としが てす。 List 4 を見ればポーリングの方法が ポーリングに対抗するもうひとつの方法 少なくて , 反応速度がいいことてす。反面 , わかると思います。 が割り込みて、す。 プログラムが複雑てデバッグしにくいとい この方法の長所は直感的てわかりやすく , う欠点もあります。 こちらはポーリングのようにいつも見張 実現も簡単て、あることて、す。欠点はスピー っているわけて、はなく , マシンに備わって ドが遅くなることがある点と , データの読 裏て静かに行われていること いる割り込み機能を使ってそのイベントが み落としがある点てす。 List 5 を参照して 発生した瞬間に CPU をむりやり横取りする ください 方法て、す。 TabIe 1 getch ( ) と get_next event( ) の比較 getch( ) 5 1 : void polling—more(void) i f ( キーが押された ) { / * キーが押されたときの処理 * / 6 : if ( マウスのボタンが押された ) { 7 : / * マウスのボタンが押されたときの処理 * / if ( 通信回線にデータが到着した ) { 10 : / * 通信回線にデータが到着したときの処理 * / 11 : 12 : if ( 指定時刻になった ) { 13 : / * 指定時刻になったときの処理 * / 14 : 15 : if ( ・・・が起こった ) { 16 : / * ・・・が起こったときの処理 * / 19 : 20 : 21 : } 割り込み 実は , 私たちが気づかないところても割 り込みは使われているのてす。 たとえば , 関数 getch ( ) が呼び出される以 前にユーザがパタバタ数文字打っていたら どうなるてしよう。もちろんその場合には getch ( ) 内て待ったりしません。すぐに文字 が返されます。これって割り込みを知らな ければ不思議なはずなのてす。自分の書い たプログラムが動いている間ても , パタバ プログラミングの工ッセンス 73 get_next_event( ) 引数 返値の型 返値 待つ ? 返す順番 登場人物 なし EVENT 発生したイベント イベント発生するまで待つ 発生した順に返す キーボード , マウス , タイマ なし Cha 「 入力した文字 文字入力するまで待つ 入力した順に返す キーボード