ファイル - みる会図書館


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

1. 月刊 C MAGAZINE 1993年5月号

を処理しています。 Table7 ティレクトリエントリの内容 DPB は また , ルートディレクトリて、 . や .. の指定 DOS ファンクション 32h オフセットバイト数 内容 (DPB アドレスの取得 ) を可能にするため , ともにルートディレク 8 ファイル名 00h ~ 07h て、取得て、きます (TabIe 2 ) 。データ領域の最 トリ d : \ に変換しています。 3 ファイル名拡張子 08h—OAh 大クラスタ番号が FF7h 以上のとき 16 ビット 1 ファイル属性 OBh ツヾス名の置換 ( get , 。 a ゆ誧 ) く FAT になります。 10 予約領域 OCh—1 5h SUBST コマンドなどて、置換したドライプ 2 最終編集時刻 開始クラスタ番号の取得 (getfatentr 1 6 h-••- 1 7 h ピット 0 ~ 4 : 秒 / 2 のディレクトリが指定された場合には 5 ~ 1 0 : 分 1 1 ~ 1 5 : 時 サプディレクトリが格納されている位置 DOS ファンクション 60h 2 最終編集日付 て、実際の物理的なパス名を取得することて、 ( 開始クラスタ番号 ) を取得するには , ピット 0 ~ 4 : 日 5 ~ 8 : 月 対応て、きます (TabIe 1 ) 。この DOS ファンク DOS ファンクション 11h 9 ~ 1 5 : 年 ションはネットワークドライプにも対応し ( FCB によるファイル検索 ) 2 開始クラスタ番号 1Ah—1Bh ていますが , ネットワークドライプのディ を使用する必要があります (TabIe 3 ) 。この 4 ファイルサイズ 1 Ch—1 Fh DOS ファンクションは指定された FCB を検 レクトリは直接読み書きて、きないため , 除 クトリを検索する 索して結果を DOS ファンクション 1Ah ( Tab 外しています。 le 4 ) て、指定したディスク転送アドレスにセ ④元のディレクトリに戻る ) DPB の取得 (getdpb) ットします。 FCB によるファイル検索て、は といった手順て、開始クラスタ番号を取得し DPB (Disk Parameter Block) はそのド ディレクトリが扱えないため ①カレントディレクトリを DOS ファンク ライプに関する情報を収めてある構造体て、 , ) 下 AT の読み込み ション 47h(TabIe 5 ) て、取得しておく 今回のようにディスクを直接読み書きする ②指定ディレクトリの親ディレクトリを FAT 領域のバイト数は DPB 構造体の ときには必ず必要となります。 IFAT 当たりのセクタ数 カレントディレクトリに変更する ③ FCB によるファイル検索て、指定ディレ ( セクタ数 / FAT ) DSORT 作成の動機 Table 6 アプソリュートティスクリード プログラムを開発するときには , 機能ご システムファンクション爪 T25h アプソリュートディスクリード とに複数のファイルに分けてプログラムを 己述します。にれらの複数のフツイルをリ AL = ドライプ番号 ( 00h = A , OIh=B, 引数 DS : BX = ディスク転送アドレス ンクする場合 , 通常はすべてのオプジェク CX = 読み込みセクタ数 DX = 読み込み開始論理セクタ番号 下ファイル名を個々に指定してリンクしま 爪 T25h す。しかし , にれては仕様追加などてファ MS-DOS 4. x 以降の場合 イルが増えたときに MAKE ファイルやバッ CX=FFFFh チファイルを書き換えないといけません。 AL = ドライプ番号 ( 00h = A , OIh=B, DS : BX = D 旧 KIO 構造体のアドレス をこて、 , 怠惰な筆者は , オプジェクトファ 十 0 ~ 3 : 読み込み開始セクタ番号 十 4 ~ 5 : 読み込みセクタ数 イル名をワイルドカードて指定してリンク 十 6 ~ 9 : ティスク転送アドレス するようにしています。こうするとリンカ 爪 T25h がソートしてくれない場合はリンクするた 返り値 キャリー びにリンクされる順番が違ってくる可能性 工ラー発生 キャリー = 0 があります。バグが潜んぞいてリンクの順 正常終了 番が変わる現象がて、たりてなからたりする 機能 AL レジスタで指定されたドライプに関して DX レジスタで指定された論理セクタ番号から 可能性も否定てきません。納品したプログ CX レジスタで指定されたセクタ数を DS : BX レジスタで指定されたバッフアに読み込む DOS 4. x 以降では CX レジスタに FFFFh をセットすると 32 ビットセクタ対応になり , ラムの動作を再現するためにはリンクする DS : BX レジスタの指すアドレスから開始セクタ番号 , 読み込みセクタ数 , 転送アドレ 前にディレクトリを直接ソートしておく必 スを読み取る 1 6 ピットセクタ番号の範囲では従来の呼び出し形式も可能である 要があります。にれがディレクトリソート このシステムコールではセグメントレジスタ以外のすべてのレジスタが破壊され , ユーティリティの作成の動機てす。 また , 爪 T25h コール時にスタックに積まれたフラグは終了後もそのままスタック に残っている 1 8 h— 1 9 h 94 C MAGAZINE 1993 5

2. 月刊 C MAGAZINE 1993年5月号

ーソフトウコ 第回 Windows ソフト 今日突然 , 先輩社員が PC ー 9801 の NA / C が火星のクレータから顔をのぞかせるのて , さて , CECW をインストールしてみまし というカラーノート PC を持って遊びにきま これをやつつけます。もうほとんどタコ壺 よう。圧縮ファイルを解凍して得られる実 した。 486 搭載て TFT カラー液品なのて、す からタコが出てくるようにしか見えません 行ファイルとヘルプファイルを , パスを通 が , これがなかなか捨てたもんじゃありま がたたかれたタコがけっこうかわいいの したディレクトリに置いて , プログラムグ せん。筆者は Windows の社外プレゼン用と て見てやってください ループへの登録を行います。 こまて、はす いう目的て 20S / V マシンの携帯型 PC をいく このソフトはシェアウェアてす。ューザ べてマニュアルてす。 つか比較調査したことがあるのてすが , ス 登録前は機能限定版となり , オプションと 最初に CECW を実行するとユーザ登録の ヒ。ードと画面の見やすさに関してはかなり ハイスコアの登録がて、きません。 画面が表示されます。とりあえずはことを いい線いっています。まあ , 難点は 640 >< 4 パスして , 次に進むと横型ツリーのディレ 00 という解像度の低さて、しようか ? クトリ構造が表示されます。解像度が高く CECW というわけて , というかあまり関係ない ないと使用に耐えませんが , 視覚に訴える てすが , 今回は Windows を中心にご紹介し 面ては縦型ツリーを遙かに凌ぎます。さて 作 者 Mt. New' s ます。 解像度の低いディスプレイのユーザは表示 ( 三浦孝司 , 中島哲さん ) 設定を縦型に変更します。表示設定てはそ ファイル名 CECW. LZH のほかにも , ファイル / ドライプ / ツールバ ネット NlFTY-Serve ほか Marsian Busters ーの表示・非表示が選択て、きます。 以前この欄て、もご紹介した DOS 用のファ 全体的な使用感としては , Windows のフ 作者 : 轢ジャイプ イル管理ソフト「 CEC 」の Windows 版てす。 ァイルマネージャが現状て、は貧弱なのに比 ファイル名 : MSBSTI 1 1 . LZH MS-DOS 用の CEC は LAN 対応ということ べると , CECW は今まて DOS のファイル管 ネット : NIFTY—Serve ほか て , 某 EC クローンとしては完成度の高いも 理ソフトを使い慣れたユーザには , 使い勝 といってしまえばそれま たわいもない のて、したが , これが Windows て、利用て、きる 手のよいものと感じるはずてす。ただし , ての Windows ゲームて、す。が , このゲーム というのは非常に喜ばしいことて、す。 「ファイルマネージャの代わり」とまて、はい ただし , 現バージョンの CECW は , CEC U. S. 帰りて、 Windows にどっぷりつかってい かないことも確かて、す。 た同僚がいたく気に入っていたのて、ご紹介 の機能がすべて盛り込まれているわけては ファイルマネージャの重要な機能「関連づ します。 ありません。アーカイプファイルの工クス け」などがてきなかったり , MDI が採用され "Marsian Busters" とは「火星人をやつつ トラクトやファイルダンプなどのユーティ ていなかったりと , 比べて差のつく機能も けろ」とても訳しましようか ? リティ部分がまだ反映されていません。 目につきます。これらもこれからの機能ア つまり「もぐらたたき」ゲームてす。火星人 れからのバージョンアップに期待します。 ップに期待する点てあります。 Fig. 1 「 CECW 」実行画面 Fig. 2 「 CAD/Draw 」実行画面 とにかく , 第一 0 [ 0 をを W の 00 ツを 崧編物当題ををみ無物 Td/d1dfSoFT(*)AR2 ヨを材 . : 物 5 しを ] 朝第こ託 3 第第ド三い一 C ドい : いさい当トい 、をい ! - 3 新 、 23 い 3 町 をト : しす 38 C MAGAZINE 1 3 5

3. 月刊 C MAGAZINE 1993年5月号

プログラ、ノグ入門 C カグラマ のための ティレクトリのソート 第 32 回 MS-DOS 5.0 では , D 旧コマンドの機能か拡 張され , ファイルを日付や拡張子でソートして表 示することかできるようになりました。しかし , 当然のことなから実際のティレクトリの中身まで はソートされません。今回は , ティレクトリをソ ートして直接書き換える方法を紹介します。 中 ディレクトリとファイルが混在している の順て、ソートする ときにディレクトリを最後に集める ( 6 ) ゴ スイッチー e , -f, ー t に対して機能し , 逆順 ( 3 ) -e 拡張子て、ソートする にソートする ディリクトリを直接読み書きする方法は , 拡張子が同じ場合はファイル名のべース 「ディレクトリの日付変更」 ( ' 92 年 12 月号 ) て、 簡単なヘルプメッセージを表示する 名て、ソートする 説明しましたから , 今回は , プログラムの ディレクトリ名を指定しない場合にもへ ( 4 ) -f ( デフォルト ) 説明のところて簡単に解説します。 ルプメッセージを表示 ファイル名のべース名て、ソートする DSO RT ユーティリティ ( 5 ) -t DSORT ユーティリティ の使用法 日付順にソートする の使用例 日付が同じ場合は 使用法 拡張子→ファイル名のべース名 ( 1 ) dsort d : *dir dsort [-df ト d ロ [-eftr] くディレクトリ名 > TabIe 1 バス名の置換 ディレクトリを直接書き換えるため ( 安全 DOS ファンクション 60h ノヾス名の置換 ( DOS 非公開 ) のため ) ディレクトリ名は必ず指定する仕様 引数 AH=60h にしました。また , ワイルドカードて、の指 DS : = ノヾス名のアドレス ES : D は置換後のバス名のアドレス ( 128 バイト ) 定はサポートしていません。 爪 T21 h オプションスイッチには以下のものがあ 返り値 キャリー ります。 AX=02h : ファイルが存在しない AX=03h : 無効なノヾス ( 1 ) -df キャリー = 0 正常終了 ディレクトリとファイルが混在している SUBST / JO 爪 / AS 引 GN コマンドなどで置換されたノヾス名の実際の物理的なバス名を返す 機能 ときにディレクトリを先頭に集める ES : 団レジスタで指定したバッフアには d : *path*filename. ext または **machine*path*filename. ext( ネットワークドライフ ) という形式でセットされる はじめに ( 2 ) ー引 新 MS-DOS プログラミング入門 91

4. 月刊 C MAGAZINE 1993年5月号

あなたの時間を オプティマイズ ( 最適化 ) ! ! LJItra-C ( ウルトラ C ) は、 C 言語の学習 / 開発に最適な環境・性能・仕様を提供する ANS ト C に準拠した C コンバイラです。インクリメンタル・コンバイル方式の採用により、今まで実現不可 能だったインタープリタと同じ機能性と、コンバイラに匹敵する実行速度を同時に実現しました メニュー形式とコマンド形式の両方か可能な統合環境を採用し、他のコンバイラでは真似できない 充実したエラーチェック機能、完全なソースレベル・テパッグ機能、ソースコードのプラウズ / ク 必要がなく、思考プロセスを中断することなく各ツールに即座に切替えることができます。 Ultra-C は、下記の図のような統合化環境を採用しているので、あるツールを終了して別のツールを起動する ■統合化環境 ロスリファレンス機能など豊富な機能が初心者から上級者までカバーします。 ウインドウ・マネージャ ですから、そのマシンの速度で実行できるマシン コードを生成します。 下記の図は、 Ultra ー C の使用によって、コーディン グ / テストの各サイクルがどのように短縮されるか を示しています。 考察 編集 コンノヾイル テスト / 診断 表示編集ツール % 節約 インクリメンタル 99 % 節約 コンノヾイラ 工デイタ コマンド・プロセッサ プラウザ デバッカ 考察 編集 ←コン / ヾイル / リンク テスト / 診断 30 % 節約 デバッガ全体 インクリメンタル・コンパイラとリンカ プログラム・データベース ■主要なサプシステム群 コマンドウインドウ コマンドウインドウは、 Ultra ー C の制御の中枢で、 こから式を評価したり、プログラムをロード / 実 行 / デバッグ、およびセープすることができます。 工デイタ ェデイタは、 C 言語プログラムを作成および修正す るためのツールです。編集されたコードは、セープ してコマンドウインドウに戻るときに自動的にコン パイルされます。また、ユーザが選択した外部ェ デイタとのインターフェースを設定できます。 ソース言語デバッガ このデバッガでは、 C 言語プログラムのデバッグと トレースを行うことができます。また、プログラム やデータの検査や修正を行うことができ、コマンド ウインドウと一体になっています。 プラウザとクロスレファレンサ プラウザとクロスレファレンサでは、ユーザプログ ラムの構成を把握し、またプログラム内のファイル とオプジェクトを素早く探索することができます。 ■表面に現れないツール群 インクリメンタル C コンパイラ コンパイラは、 C 言語のソースを実行可能なマシン 語に変換します。ソースコードをメモリにロードし たとき、および工デイタの終了時に新しいコードを セープすると、自動的に呼び出されます。 インクリメンタル・リンカ リンカは、複数のソースまたはオプジェクトファイ ルの関数を、単一のプログラムに結合します。また、 スタンドアロン実行可能ファイルの作成にも使用さ れます。リンカは、コンパイル過程の一部として自 動的に呼び出されます。 式評価機能 式評価機能は、コードがインタープリトされるので はなくコンパイルされるという点を除いて、イン タープリタと同しような役目を果たします。コマン ドウインドウに式を入力すると、即座に評価されて、 実行結果がコマンドウインドウに表示されます。 ソースフォーマッタ ソースフォーマッタは、 C ソースコードの体裁を整 も遅くなります。 UItra - C は正真正銘のコンパイラ 行は Ultra ー C を使用する場合よりも 70 倍から 100 倍 ますが、インタブリタを使用するとプログラムの実 使用してこの機能性を提供しようとするものがあり Ultra-C 以外のシステムの中には、インタブリタを れます。 合には、その関数を参照する関数も再コンバイルさ せん。また、関数の型、引数の数や型を変更した場 読み出されて、再度コンパイルされることはありま ルに対する # include 文が出現しても、ディスクから 済み形式で保持されるので、再度そのヘッダファイ ダファイルは、最初に現れた際に特殊なコンパイル 再コンパイル / 再リンクすることが可能です。ヘッ コンパイルされ、ユーサが変更を加えた部分だけを 採用しているので、プログラムはロード時にすべて Ultra-C は、インクリメンタル・コンパイル方式を を再度リンクしなければなりません。 イルしなければなりません。また、プログラム全体 もちろんのこと、 #include ファイルもすべてコンパ た場合でも、変更部分が入っているファイル全体は 従来のツールでは、大きなファイルの数行を変更し ・インクリメンタル・コンバイル コードを実行するときに自動的に呼び出されます。 ムエラーを検査します。表面には現れませんが、 ポインタ算術演算のオーバーフローなどのランタイ バーフロー、無効なポインタ、未定義関数の呼出し、 ランタイムチェッカは、ゼロ除算、配列境界のオー ランタイムチェッカ て、自動的に呼び出されます。 します。表面に現れないコンパイル過程の一部とし ルから作成された C 言語プログラムの整合性を確認 モジュール間意味チェッカは、複数のソースファイ モジュール間意味チェッカ 動的に呼び出されます。 に現れないツールであり、編集過程の一部として自 な読み易い形にします。ソースフォーマッタは表面 えて表示し、また自動的にフォーマットして標準的 各開発サイクルに要する時間の U に a ー C による短縮 ・メニューとコマンド UItra-C のユーザーインターフェースは、メニュー で作業するユーザとコマンドを使用するユーザが等 しく便利であるように設計されています。メニュー で選択できる項目は、すべて同等のコマンドが用意 してあります。 コマンドウインドウからは、エデイタの起動、関数 のトレースと変数の監視、プログラムの構造を通し た表示編集など、 UItra ー C の各種の構成要素をコマ ンドにより起動することができます。コマンドは、 対応するメニュー項目と全く同し動作を行います。 Ne ・ . Re 宿第第 S をを 0 し心 oa を 0 「日れ第イ 0 を ・スタックオーパフロー ・スタック上のリターンアドレスの上書き ・不合理なシフトの大きさ ・コードへの書込み ・データの実行 ・異なる型のポインタ間の引き算 ・ポインタ算術演算のオーパフロー ・整列していないポインタの差異 使用 ・初期化されていないオートマティックポインタの 格納または不正なキャストのために無効 ) ・無効なポインタを通しての呼出し ( 範囲を越えた ・初期化されていないポインタを通しての呼出し ・ヌルポインタを通しての呼出し ・ヌルポインタを通しての読出し / 書込み デックス ・初期化されていないオートマティック配列のイン チェック ・配列参照が宣言された境界の範囲内にあるかの クできます。 Ultra-C は、以下のようなエラーを実行時にチェッ ランタイムチェック 能です。 従って、エラーを迅速かっ容易に理解することが可 ソルをエラーの発生した位置にただちに移動します。 すると停止して、エラーメッセージを表示し、カー の有無をチェックします。 Ultra ー C はエラーを検出 UItra-C は、コンパイル / リンク / 実行時にエラー ■工ラーチェック

5. 月刊 C MAGAZINE 1993年5月号

TabIe 2 List 1 ( game. h ) の各行の内容 X 68 k 活用講座 容 290 : void 敵キャラ発生移動 (void); ・ / * mychr. c * / void 自機移動処理 (void); 294 : void 弾発射移動 (void); / * game. c * / TabIe 1 今月作成したゲームソースファイルのファイル構成 List 1 172 ~ 198 行 291 : 292. 293 : 295 : 296 : 297 : 内 おきまりのシステムインクルードです ファイル名 game. h enemy. C game. C map. C mychr. c sprlte. C utiles. c 背景などの処理を行うルーチン ( 今月ではただのダミー ) ゲームのメインルーチン 敵キャラクタ処理ルーチン clash. c 、当たり判定を行うルーチン ゲーム全般のプロトタイプなどの宣言へッダ ファイルの内容 いろいろな下請けを集めたサービスルーチン スプライト表示処理のためのルーチン 自機と自分が発射した弾の処理 、、 EXT ″は game. c をコンバイルするときだけ空白に置き換え られ , それ以外では、、 exte 「 n ″となります ちょっとしたマクロの定義です。 NULL は普通はシステムへ ッダで定義してあるのですが , 念のために定義しておきます 23 ~ 58 行かなり前に連載で収録した sp 「 ite. h で定義したマクロ群です 59 ~ 63 行絶対値を計算したり , 敵スプライトの最大数を定義していま す 64 ~ 170 行一群の宣言はもっとも下位レベルのスプライト制御のための 宣言です ゲームで用いる PCG をその目的ごとに区分けして管理するた めの構造体です ゲームで用いる変数の宣言と各ファイルで定義される関数の プロトタイプです TabIe 3 List 2 ( ut ⅱ es. c ) の各行の内容 3 ~ 7 行 199 ~ 297 行 14 ~ 21 行 9 ~ 13 行 Fig. 1 Fig. 2 ゲーム画面 utiles. C sprite. C mychr. c map. C game. C enemy. C clash. c enemy. 0 game. 0 mychr. 0 map. 0 clash. 0 sprite. 0 utiles. 0 Makefile の雛形 参照行 内容 utiles. C game. h sprite. c game. h clash. c game. h map. c game. h enemy. c game. h game. c game. h mychr. c game. h 5 ~ 13 行工ラートラッパ ( 前号参照 ) のための宣 14 ~ 25 行ゲームをアボートする場合の処理です 割り込みべクタを復帰してスクリーンを元に戻して終了コー ド 1 で復帰します 28 ~ 34 行 malloc( ) を呼び出してメモリを確保します その際にエラーチェックを行います 36 ~ 67 行指定されたファイルネームのファイルから PCG テータをリー ドして GAME PCG 構造体を生成し , それのポインタを 返します PCG テータは 16X 1 6 ドット単位でファイルの大きさからノヾ ターン数を算出しています このゲームのスプライト管理方法ではハードウェアを実際に は割り当てないスプライトが必要です このルーチンはそのダミーを作成するためのルーチンです 1 10 ~ 142 行実際にゲームの PCG テータを読み込むルーチンです テータリード関係ではもっとも上位の処理です 144 ~ 174 行画面モードを切り替え , バレットを設定するルーチンです 176 ~ 254 行バスエラーなどをトラップするための処理が記述されていま す X68k 活用講座 131 69 ~ 108 行

6. 月刊 C MAGAZINE 1993年5月号

ダイアログの里 2 ロ - 本ロ 0 五ロ 一三ロ 乗松保智 前回まで , THINK C を実際に使ってプログラムを入力したり , そのプロ グラムの内容を見たりと , Macintosh のプログラムの基本を説明してき ました。今回は , 一歩進んでダイアログ処理を説明します。 Fig. 1 ファイル選択ダイアログ ーダイアログ ダイアログは , アプリケーションが処理 を実行するうえて、必要な情報をユーザに要 求するために使用します。たとえば , 工デ イタて、ファイルをオープンする場合を考え てみましよう。 工デイタはユーザがどのファイルをオー プンしたいのかを知らなければなりません。 こんなとき ,MS-DOS ならば fgets などを使 ってユーザにファイル名を入力させるのて、 しようが , Macintosh て、は Fig. 1 に示すよう なダイアログが表示されます。ューザはマ オプションを指定するときに使います。 Fi ウスやキーボードを使ってファイルを選択 に使用します。たとえば工ラーが発生した g. 2 て、は三つのラジオボタンがありますが , します。 ときにエラーの内容などをスタティックテ このようにアプリケーションとユーザの どれも選択されていない状態になっていま キスト領域に表示します。スタティックテ 対話を司るのがダイアログマネージャて、す。 す。しかし , これは単に説明のためにこう キストは , ほかのものと異なりマウスクリ なっているだけて、 , 実際のアプリケーショ ックやキー入力に反応しません。 ーダイアログアイテム ンて、は , どれかひとつが選択されていなけ 編集可能テキストは , 逆にユーザがアプ ればなりません。この処理については後述 リケーションに情報を伝えるために使いま ダイアログのウインドウ上には , OK や C します。 す。このアイテムは , TextEdit を使用して ancel などのボタンとチェックポックスやテ チェックポックスは , オンやオフという います。よって , Cut や Paste などの標準的 キストの入力フィールドなどがあります。 状態を表すときに使用します。これはラジ な編集コマンドを使えます。 これらはダイアログアイテムと呼ばれます。 オボックスとは異なり , ひとつひとつがオ 最後にボタンて、す。ボ、タンは , ダイアロ Fig. 2 に代表的なダイアログアイテムを示し ン , オフの状態を持ちます。 Fig. 2 て、はどち グて、の設定を有効にしたり , 中止を指定し ます。 らもオフになっています。 たりして , ダイアログを終了させるときに ラジオボ、タンは , いくつかの選択肢のう 次のスタティックテキストは , アプリケ 使います。 Fig. 2 て、はどちらも角が丸くなっ ち同時にはひとつだけが選択て、きるような ーションからユーザへ情報を提供するため た四角て、示されていますが , 通常はデフォ 118 C MAGAZINE 1993 5 sampIe2 マ Home デスクトップ D SampIe2. make D samp1e2. r キャンセル 間く

7. 月刊 C MAGAZINE 1993年5月号

ー新 MS ー DOS プロクラミング入門 み込めば , スモールモデルて、コンパイルて、 きます。 ディレクトリを読み込んだ後は消去済み 工ントリを詰めています。 なお , dsort. c ( 付録ディスク収録 ) て、は複 数のメモリモデルに対応するため , if ( sizeof( char * ) といった if 文て、メモリモデルを判定していま す。本来は #if sizeof( char * ) 4 というように記述してプリプロセッサて、判 定させたほうがよいのて、すが , MS ー C て、はコ ンパイルエラーとなります。最適化を行え ばどちらも同じコードにおちるはずて、す。 とくに気にする必要はないと思います。コ ンパイラが定義するメモリモデルに関する は に異なるため , このように記述しました。 て、きるようになりますが , コンパイラごと マクロ名をチェックすれば条件コンパイル ディレクトリエントリには TabIe 7 の内容 が書き込まれているため , ファイル名 ファイル名拡張子 こを見れば 最終編集時刻と最終編集日付 ファイルサイズ ファイル属性 などがわかり , これらを基準にソートする ことカイきます ( 今回はソートの基準として 最初の三つをサポート ) 。 ディリクトリをソートする場合 , ソート コラム 拡張子を指定してコマンドを起動すると そこ「ちまらを意地悪をして次の実験 素直な仕様てはないカ思います。 96 C MAGAZINE 1993 5 動されます。これは誰が考えても納得する のよ ~ うに起動すれば必ず NAME. BAT が起 A > NAME.BAT@ たがって , れ , 拡張子の指定が有効になりましたし ~ しかい MS-DOS 5.0 て、は仕様が変更さ NAME.COM が起動されま 、ゞてた。らめの拡張子を指定しても無視され , が起動きれます。極端な NAME. Z22 となります。 ′べて無視されるため 3 や OI±I)NAME.COM 叮しますそれ以降は内部ゴマンドの引数ど MS-DOS 3 、 x てはコマンドの拡張子はす 。ーうなるてしょラか ? 、 のよ . うに拡張子まて、指定して起動したらど A > NAME.BATO それぞは。 = OM が起動されます。 しいう。プアイルがあらたしをには NAME. C 、 第 NAME.BAT NAME.CO 乢 NAME.EXE てい同じディレク。トリに , ~ の順て検索され , 実行されます訂したがづ COM → EXE → BAT ルを実行するときには , AT のファイルが実行てきます。実行フ ~ ァイ = = = 当。られているように拡張子が 00M , 。 EXE, B 余談になります力、 MS ~ DOS てほよス知 ①ては起動に失敗しま 0 たよしたがイて , A>D 旧 .EXEØ ② NAME.EXE を DIR.EXE にリネームして と起動してみる 、 , A > NÅME.Z@ ① NAME. EXE を NAME.Z にリネームして してみました。 , れ BMS-DOS 、 3 と同じ仕様てす。ち 一場合はそこて区切り内部コマンドとみな ンドのべース名が DOS の内部コマンドと同 ②ては DIR コマンドが起動されます。コマ 、外ては起動て、きないということになります。 、して処理すな。けをも COM, EXE, BAT 以 MS-DOS を 0 ぞほ指定された拡張子は尊重 と同じことになります。 A>D 旧 *. EXEO A>D 旧.EXE@ なみに , されるとまずいファイルに気をつける必要 があります。たとえば , システムファイル 00. SYS, MSDOS. SYS など ) プロテクトのかかったファイル などがあげられます。筆者はプロテクトの かかったアプリケーションを使用すること がないため , 今回はプロテクトに関しては 無視しました 010. SYS と MSDOS. SYS は必 ずディレクトリの先頭にあるため , ソート する前に ①ディレクトリの先頭の隠しファイルと ポリュームラベルをスキップ ② . および .. ディレクトリをスキップ という処理を追加しています。最初に本ュ ーティリティを作成したときには , ①をサ ポートしていなかったため , ルートディレ クトリをソートするとそのディスクから起 献を収録 ) 。 EN. TXT というテキストファイルて、参考文 を応用してください ( 付録ディスクに BUNK て、きないような用途て、は今回紹介した手法 といっても DOS ファンクションだけて、記述 合と比較してプログラムも面倒になります。 くなり , DOS ファンクションを使用する場 くなりますが , 失敗した場合の危険度も高 クを直接読み書きすればかなり自由度が高 方法に関して簡単に説明しました。ディス 今回はディレクトリ内を直接ソートする まとめ リセットを行う必要があります。 ときは DOS ファンクション 0Dh て、ディスクの す。このようにディスクに直接書き込んだ ト (Table 8 ) て、ディスクに書き戻していま ソート後 , アプソリュートディスクライ ツィレクトリの書き込み (writedir) ・ ことがあります。 動て、きなくなるというクレームをもらった

8. 月刊 C MAGAZINE 1993年5月号

NUMBERS List べてのマシンて、使用て、きるはずて、す。動作 確認は PC ー 9801 て行いました。 LSI C ー 86 Ver. 3.30 をインストールした 後 , 本誌付録の提供ファイルをひとつのデ ィレクトリに展開した後 , A> LCC NUMBERS. C と実行すれば , そのディレクトリに実行フ ァイル NUMBERS. EXE がて、きます。コマ ンドラインから A> NUMBERS とだけ入力すると画面に Fig. 7 のように表示 されるはずて、す。 NUMBERS を実行するたびに画面は上の ほうに流れていってしまいますから , Fig. 7 の内容をファイルとして保存しておくと便 利て、す。プログラムの実行結果をファイル に保存することを「ファイルに落とす」とい います。たとえば , A > N U M B E R S > N U M と入力すると新しいファイル NUM がて、き , その内容は Fig. 7 と同じものになります。 N UM の内容を見たいときには , TYPE コマン ドを使って A> TYPE NUM とします。またはエデイタを使って見るこ ともて、きます。たとえば先月号て、インスト ールした SE3 を使う場合 , A > S E3 N U M と入力すれば NUM の内容が見られます。ま た , あなたがワープロソフトとプリンタを 持っていれば , ファイル NUM を読み込んて、 印刷することもて、きます。 印刷する方法はワープロソフトによって 異なりますのて、 , ここて、は触れません。お 手持ちのワープロソフトのマニュアルを参 考にしてください N U M BERS を修正するには プログラム NUMBERS のように , 自分て、 コンノヾイルて、きるソースプログラムが手に 入ると , 自分て、アレコレ修正したくなるの が人情て、す。また , 自分て、ソースプログラ ムを修正して , 実行ファイルの動作がどう 変化したかを調べるのは C 言語が上達する道 88 C MAGAZINE 1993 5 * 名前 2 : numbers ー 2 進数、 8 進数、 1 0 進数、 1 6 進数の対応表を作るプログラム 3 : * 書式 4 : ー画面に表を表示する。 A > NUMBERS 5 : A> NUMBERS 〉 TABLE ーファイル TABLE に表を落とす。 6 : * 解説 7 : プログラム numbers は、 0 ~ 9 9 までの数値について、 2 進数、 8 進数、 8 : 1 0 進数、 1 6 進数の対応表を作るものである。 9 : * 作者 10 : 結城浩 ( C マガジン「 C 言語プログラミング・レッスン」 ) Copyright (C) 1993 bY Hiroshi Yuki. 12 : 13 : 14 : 15 : #include く stdio. h> 17 : / * 18 : * 定数 MAX_NUMBER は表示する数の個数。 * MAX_NUMBER が 100 のとき、 0 ~ 99 までを表示する。 * MAX_NUMBER は 32765 より大きくしてはいけない。 21 : 22 : #define MAX—NUMBER 100 24 : / * * 以下はこのプログラムで使用する関数の「プロトタイプ宣言」である。 * このプログラムで使用する関数の名前、引数の個数と型、返値の型を宣言する。 26 : 27 : print_binary(int n) ; 28 : VOid 29 : void main(void); 30 : 32 : * 関数 main 33 : 34 : void main(void) 36 : 38 : 40 : 41 : 42 : 43 : 44 : 46 : 48 : } 49 : 51 : * 関数 print-binary は引数 n を 2 進数として表示する。 * 例えば 52 : 53 : → 0000000000000010 54 : = 255 → 0000000011111111 print_binary(int n) 56 : VOid 63 : 64 : 65 : 66 : int i; printf( ” %16S ” , ” 2 進数” ) ; printf( ” ” 8 進数” ) % 8s ” " 10 進数も printf( ” % 8s ” " 16 進数も ; printf(" X8s*n ” for (i = 0 ; i く MAX—NUMBER; i + + ) { print_binary(i); % 80 ” , i); printf( ” printf( ” % 8d ” , i) ; printf( ” X8x*n", i) ; int 1 ; for (i = 0 ; i く 16 ; i + + ) { if (n & ( 1 くく ( 15 ー i))) ( printf( ” 1 ” ); else { printf( ” 0 ” ); いいいい ( に ~ にいに " に ~ らいに(に~に)~リリい、L@に「いい -

9. 月刊 C MAGAZINE 1993年5月号

メントを作成するために旧態依然のキャラ 用のグラフィカルなツールがあり , リソー クタ指向環境を使うことは , センスレスな スエデイタなどと呼びます。 上になかなか大変て、す。そのため , Windo BC 十十 /TC 十十 forWin にはリソースワ ークショップ (RWS) が付属していて , リソ ws のプログラミング環境にはリソース編集 テノヾイスコンテクスト うデバイスコンテクスト : 略して DC は = = 使いますこれらはにウインドウへのハン ~ 。。・ Window もの A 円でしばしば使われます。。ドルを引数に取ります。 WindOW SystemT いう , グラフィクコン線を弓「くための Windows A 円に LineTo() = 。 テクスト ( GC ) : みだいなものです DC を直ミをいうものがありますが , にれは , DC のノ、 訳すると「デバイスの環境・状況」といらた ンドルを引数に取リますもしデフォノい ~ とろですが , 、。要は描画に使われる情報を = ・ト属性以外の線糧や色を使いたが ? たを 保存してお ( ものだ 4 思らておけば遠から : それ用の A 円 ( seIectO 可 ect ( ) ) を使プて DC に属性を登録しておきま事前に登録 GC と異なるのは , GC が事実上ビッ十マッするという点がちま。っと面倒です LineTo. 、。プスグリ十ン。しか考慮していないのに対しいを呼び出すたびに引数をずらずら書き並べ DC のほうはディスプレイたけでな 0 プリ籌るよりはよほど効率的でしよっ。 ~ ンタやプロッタなどの多岐にわたる出力装ーを文字の描画についても同じで ; 。 system フ ツント以外のフォントを使いたがうたら , 置に対して使える点です。 、ウインドウに対応する DC を取得するに T も xtO ( ) の前にあらかじめ登録しておきま は , BeginPaint( ) や GetDC(3)% という A 円をすふ 仮想コード ースの活用を非常に楽にしてくれます。 リソース作成の掟 まずは , Windows を立ち上げて RWS を起 動します。 FiIe/New を選び , 新規プロジェ クトを作成します。 . RC を選択するとよいて、 しよう。 RWS て、いう「プロジェクト」には , EXE まて、をターゲットに入れたすべてのリ ソース関係のファイルを放り込んて、おくこ とがて、きます。ますは , File/Add Project を使って , C 十十用のヘッダファイルを加え ておきましよう。このヘッダファイルには , ボ、タンやメニューなどの ID を書き込み , RW S と C 十十両者て、共有することにします。 新しいリソースを作成するには , Resour ce / New メニューを使います。一例として , HeX のメニュー関係のリソースを List 3 に あげておきます。ダイアログをオープンす るメニューには , 忘れずに クをつけてお きます。 さて , こうしてメニューを作成していく と , ヘルプ / About て、使用する CM ABOUT という ID が定義されていないことがわかり ます ( そのほかの ID は , owl/include/owlrc. h て、定義されています。これもプロジェクト に放り込んて、おきましよう ) 。 RWS は , 新た に ID を登録するかどうか聞いてきますか ら , Yes を答え , 適当な番号を割り付けま す。このとき , 先ほどプロジェクトに加え たヘッダファイルに ID の格納先を明示する ことが大事て、す。 ついて、に , File/Preference メニューを使 って , . RC ファイル ( テキストファイル ) だけ て、なく . RES ファイル ( バイナリファイル ) も 同時にセープするようにしましよう。コン パイルする手間が省けます。 このほか , EXE があれば , リソースファ イルのセープと同時にダイレクトに EXE フ ァイルの書き換えもて、きます。 スクロール 置朝鞏は謝罰髞器囀岩告 いよいよ大物のスクロールの番がやって コラム LiSt 1 : / / ウインドウのオープンがらみのみ : 更に簡略化してある 2 : MYApp: :Run() InitAppIication(); lnitlnstance(); メッセージループに入る ; 8 : 9 : MYApp::InitInstance() MYApp::InitMainWindow(); MakeWindow(MainWindow) ; MainWindow->Show(); 13 : 16 ・ MYApp: :MakeWindow(PTWindovs0bject 0bj) obj->Create() : 20 : 21 : MyWin::Create() 石 ndows API でウインドウをオープン ; 23 : そのハンドルを HW i ndow メンパへ代入 ; 24 : MyWin::SetupWindov(); 25 : 26 : } 28 : MYW i n : : Se t u i ndow ( ) 29 : { TWindow0bject: :SetupWindow() ; 30 : 32 : } 33 : 34 : TWindow0bject: :SetupWindow() ⅶⅱ e ( まだオープンしていない子供のウインドウ ) { 36 : そのウインドウの C rea te ( ) を呼ふ ; 37 : そのウインドウの Se tu pW i ndow ( ) を呼ぶ : 38 : 39 : 40 : } 雑処理 : 102 C MAGAZINE 1993 5

10. 月刊 C MAGAZINE 1993年5月号

三つの要素に対してどのようにウェイトを 置き , どの順序て、モデルを構築していくか の違いて、あるともいえる。 構造化設計においては , まずソフトウェ アが果たすべき機能に着目する。そして , 機能をトップレベルから , 次第に詳細化し ていき , その段階て動的な動作を考慮して モジュールを定義していく。そして , さら にモジュールをサプモジュールへと分割し , それぞれのサプモジュールが果たすべき機 能をどんどんと小さなものへと還元してい く。最終的に十分小さくなったところて、 , 実際のプログラムとしてデータ構造を決定 し , ソフトウェアを実現するというアプロ ーチて、ある。すなわち前記レベルを ( 1 ) → ( 3 ) へと適用していく。データが最後にきてい ることからもわかるように このアプロー チて、はデータは受動的な存在て、あり , ( 2 ) て、 決定される「手続き」に従属している存在て、 しかない FPLF のようなテキストフォーマッタて、あ れば , トップレベルの機能は , 当然ながら 「入力ファイルをフォーマットして出力する」 て、ある。それをさらに分ければ , 「 1 行入力 する」「コマンド行かどうかを調べる」「コマ ンドを解釈処理する」「コマンドて、はない行 についてはフィル処理をする」「フィル処理 されたデータをフォールド処理する」などに 分かれるだろう。この状態て、の全体構成の 概略を示したのが Fig. 4 て、ある。この後 , 各 機能単位が動的モデルとして実現され , 最 後にデータ構造を決定すればソフトウェア として完成する。 実際に , どのような点に着目してモジュ ール分割を行うかについても , いくつかの 原則があるのて、紹介しておこう。 ・データの流れに着目する。 一般に外部データは「入力過程」を経て内 部データへと変換され , その形て、「処理過 程」によって処理加工を施され , 再び「出 カ過程」を経て外部データへと戻される。 そこて、 , この経路に沿って , 三つの領域 にモジュールを分割するという発想て、あ る。 FPLF の主要モジュールをこの三つに 60 C MAGAZINE 1993 5 分けると , Fig. 5 のように境界を引く がて、きるだろう ( 実際には , この境界を決 めた後て、 , モジュールを決定するという 順序になる ) 。 ・制御 ( データ ) の分岐に着目する。 制御 ( データ ) の流れを見ていると , 特定 の点から多方向へと流れが分岐する場合 がある。 Fig. 4 の FPLF の例て、いえば , コ マンドディスパッチャのところがその典 型て、ある。この場合 , 分岐するそれぞれ Fig ・ 4 機能に着目して分割した FPLF の内部構造 初期化ルーチン . nf ディスパッチャ コマンド ファイル入力 は別モジュールとして考えられる。 これらの分割戦略は , これまて、長い間に 渡って行われてきたものて、あり , 読者の多 くにとっても , 細かい部分まて、意識して行 っているかどうかは別として , すて、におな 日唱する分割戦略 プジェクト指向設計の じみの発想て、あると思う。 オプジェクト指向という名前が暗示する 1 行入力 Fig ・ 5 入力変換・内部処理・出力変換に着目して分割する ファイル入力 入力変換 コマンド ティスパッチャ . nf 初期化ルーチン 1 行入力 内部処理 . 出力変換 フィル処理 フォールド処理 ページ処理 ファイル出力 フィル処理 フォールド処理 ページ処理 ファイル出力