メモリ - みる会図書館


検索対象: 月刊 C MAGAZINE 1992年10月号
58件見つかりました。

1. 月刊 C MAGAZINE 1992年10月号

MZ は , プログラムソースを公開しているの すが , EMB は通常プロテクトモードからて、 仕上げることが可能て、す。また , プログラ て、 , ソースから XMS の深い内容を理解て、き ムソースを公開すれば , ューザが XMS ファ ないとアクセスて、きません。したがって , ます。今回は , このオリジナル XMS ドライ これらは異なるメモリ管理システムて、管理 ンクションの使用法を理解する手掛かりと バ「 XMZ 」を紹介します。 する必要があります。 なります。 以上の理由から XMZ は , i386 / 486 用の X オリジナル XMS ドライバ ~ ー XMS Men MZ. SYS と 80286 専用の XMZ286. SYS に分 「 XMZ 」 S ⅲ ) ドライバ けて作成し , プログラムソースを公開する MS ー DOS マシン用のソフトは , 通常メモ NEC 版の MS-DOS Ver. 5.0 には XMS ド リアドレス 00000h ~ A0000h の 640K バイトの ライバ HIMEM. SYS が付属しています。 XMS ドライバの解析 コンべンショナルメモリ上て、動作します。 の XMS ドライバは 80286 以上の CPU 上て、動 CPU が 80286 , i386 / 486 と進歩し , ソフトウ 作するように設計されています。したがっ ェアが広いメモリ領域を必要とするように て , 80286 に対応するためのプログラムコー このようなプログラムて、は , いままて、あ なるとコンべンショナルメモリだけて、はメ ドが必要となり , 冗長な部分が多く存在し るドライバとの互換性が重要になります。 モリが不足してきます。このメモリ不足を ます。また , XMS ドライバのようなメモリ そこて、 , ま $HIMEM. SYS の解析から始め 解消するために 80286 , i386 / 468 がアクセス 管理ドライバは , ドライバの提供するファ ることにしました。 可能なメモリアドレス 100000h 以上のプロテ 逆アセンプラを使って HIMEM. SYS を調 ンクションコールをアプリケーションから クトメモリを使うことになり , 、そのメモリ 呼び出すことによって動作しますが , ファ べていくと , 内部にはアプリケーションの 管理が必要となってきます 0MS-DOS はプ 動作を保護する工夫が随所に見られ , かな ンクションの使用法が複雑て、 , 公開された ロテクトメモリの制御を直接行わず , 後か 仕様書のみて、は十分に活用て、きないことが り複雑て、した。互換性維持のために , ら組み込むドライバにより管理します。 あります。 ような内部仕様まて、同一にしなくてはなら のようなメモリ管理ドライバのひとつが XM このような問題をクリアするために , オ ず , 作成には思ったより時間がかかりまし S ドライバて、す。 リジナル XMS ドライバを作成することにし とくに , 割り込み関連の部分は複雑て、 XMS ドライバは , MS ー DOS にデバイスド ました。それぞれの CPU に合わせて最適化 す。単に割り込みを禁止するだけて、はなく , ライバとして組み込みメモリ管理を行うの したプログラムコードて、個々にドライバを 処理に時間がかかるファンクションて、は割 て、 CONFIG. SYS 内て、ももっとも先に記述す 作成すればコンパクトて、高速なドライバに り込みを許可し , そのファンクションはリ る必要があります。 i386 / 486 マシンの CON Fig. 3 メモリマップ FIG. SYS の例を示します。 device himem. SYS i386 / i486 → FFFFFFFFH ( 80286 → FFFFFFH) device emm386. exe himem. sys は , XMS ドライバて、プロテク トメモリを管理します。次の emm386. exe は 仮想 86 を利用した EMS ドライバて、す。 emm 386. exe は , himem. sys が管理しているプロ テクトメモリを取得して , それを EMS メモ リとして利用することになります。 XMS ドライバは , プロテクトメモリを 2 種 類のメモリエリアとして管理します。ひと つは HMA(High Memory Area) と呼ばれ るものて , プロテクトメモリ領域における 最下位アドレスの 100000h ~ 10FFEFh のエリ ア , もうひとつは 10FFF0h 以上のプロテク トメモリエリアて、 EMB (Extended Memor y BIock) と呼ばれるエリアて、す ( Fig. 3 ) 。 HMA はリアルモードからアクセスて、きま 46 C MAGAZINE 1 2 10 、 0 EMB プロテクトモードでなけ (Extended memory BlOCk) ればアクセス不可能 拡張メモリプロック領域 ここまでは A20Line が HMA 80286 などのリアルモ (High Memory Area) ードでアクセス可能 65536 ー 16 = 65520 バイト 亠これ以上のメモリ空間 この 16 バイトの空間は HMA ではない は 8086 / V30 ではア クセス不可能 UMB Upper Memory BlOCk FFFFHTFFFH → IOFFEFH FFFFH:OOIOH → 100000H FFFFH:OOOOH A000 H : 0 0 0 0 H Conventional Memory Area A20Line が ティスネープルのとき ラップラウンドエリア 65520 バイト ラップアラウンドによ りセグメント FFFFH で HMA の代わりにア クセスされてしまう 領域 FFFFH:FFFFH → OOFFEFH 0000H : 0000H

2. 月刊 C MAGAZINE 1992年10月号

A 標準の OVERLAY. LIB< は プロテクトメモリを使うために XM S ドライバ (HIMEM. SYS など ) が 必要となります。これは , プロテ クトメモリを管理するための標準 的なインタフェイスて、 PC ー 9801 シリ ーズのハードウェアに依存するこ となくプロテクトメモリにアクセ スすることがてきます。逆に , XM S ドライバがなければプロテクトメ モリを使うことがて、きません。 れに対して , OVLY98. LIB< は , 場合 , BorDlg て始まる新しいクラ XMS ドライバがあればそれを使い ます。 BorlandC 十十 3.0 において 0 ほかのメモリモデルのライプラ ス名を使います。 BWCC は , BorD ますが , ない場合ても PC -9801 に依 lg て、始まるクラス名のダイアログボ リが必要な場合 , Borland C 十十 utp は dos. h 中て、マクロとして定義 存する情報を利用してプロテクト ックスの背景を灰色て表示します。 3.0 をインストールしたディレクト されています。ここて , outp は出 メモリを使用します。 リの CLASSLIB サプデイレクトリ また , このときに使うダイアログ 力した値が入っている疑似レジス この場合 , 作成したプログラム プロシージャは DefDlgProc て、なく にある makefile を使ってこれらを タ変数 AL を関数の戻り値として を XMS ドライバのない PC ー 9801 以 BWCCDefDIgProc て、なければな 構築しなければなりません。 CLA 使えるように指定されています。 外の機種て実行するとオーバレイ りません。たとえば , $BorDIgTe SSLIBi•ィレクトリに移動してコ しかし , outp の戻り値を使わない の初期化ェラーて、なく , 異常な動 場合は AL が意味をもたなくなる st" というクラス名の BWCC ダイア 作を引き起こす可能性があるのて、 マンドラインから ため警告メッセージが表示されて ログに縮小化アイコンを指定する 注意が必要てす。 make -DMDL=llib 場合は , List 1 のようなクラスを T と入力すると TCLASSL. LIB が構 しまいます。実際には outp は与え Dialog から派生するようにしま 築されます。 Turbo C 十十 for W られたデータを出力していますか Q す。 indows て、は , スモールモデルとラ ら , この警告については無視して textattr でアンダーライン属性 ージモデル用のライプラリが提供 もかまいません。警告メッセージ ( UNDER 凵 NE ) を指定しているの されていますが , ミディアムモデ を表示させないためには , ですが , アンダーラインが文字に Q 開発中のプログラムが大きく ルやコンパクトモデルのライプラ (void)outp(0x37, 7 ) ; 対して 4 ドットずれて表示されてし リが必要な場合は , 統合環境のプ なってきたので , メモリモデルを などと記述してください まいます。 ロジェクトの機能を使い Fig. 1 の ラージモデルに変更したら TCLAS pc ー 9801 て、は , バーティカルラ 手順てライプラリを構築してくだ SL. L 旧が見つからないというエラ Q オーバレイのために使われる ーメッセージが表示されました。 イン属性 (VERTICALLINE) て、 スワップメモリを EMS やプロテク 文字中央に表示される縦線とアン このファイルはどこにもないよう ですが , どうすればよいのでしょ トメモリに割り当てられるという ダーライン属性による下線がうま Q うか。 BorIand C 十十 3.0 で outp 関 ことですが , PC ー 9801 版 Bo 日 and くつながるようにアンダーライン C 十十には OVERLAY. L 旧と OVLY9 数を使うと が 4 ドット分右にずれるようになっ A コンテナクラスライプラリの ています。これは PC ー 9801 のハード Code has no effect 8. L 旧の 2 種類のオーバレイライプ ライプラリ (TCLASSx. LIB) は , デ ラリがあります。どちらを使って という警告メッセージが表示され ウェアに依存する間題て , プログ フォルトの状態てはスモールモデ ます。 outp 関数が動作していない ラムから制御することはてきませ も同じように動作しているようで すが , 何か違いがあるのでしよう ルのファイルだけが提供されてい のでしようか。 ん。 Fig . 1 Turbo C 十十 fo 「 Windows 用ライプラリ構築の手順 CLASSL 旧 *OBJSi イレクトリに新 たなティレクトリ C を作成する このディレクトリに CLASSLIB*OBJS*S にある TCLAS SS. PRJ をコピーして , 名前を TCLASSC. L 旧とする TCW 爪を起動してプロジェクトとして TC SSC. p 日 J をオープンし , 0 tions ー Com ilerl Code eneration で Model を Medium とする compilel Build 訓でプロジェクトを構築する lnformation from Compiler Makers 179

3. 月刊 C MAGAZINE 1992年10月号

原著作者 : 石野恵一郎 改変 / 解説 : 広瀬雄ニ ASCI ト N ET : PCS39334 JUNET : yuuj@ae.keio.ac.jp 改変 : 堀田俊哉 ASCI ト N ET : PCS32469 大の「 K ト Shell 」ファンだった私はヒスト リとェイリアスをたつぶり確保していまし たが , 当然メモリを圧迫します。また工イ リアスの定義て、別のェイリアスが使用て、き ないのもメモリを食う原因て、 , なんとかヒ ストリとェイリアスをメインメモリから追 い出せないかと思っていましたが , 幸運な ことに「 KI-SheIl 」ソースプログラムを入 手する機会がありました。 すぐにバッフアの EMS 追放作業にかかっ たのて、すが , 8086 アーキテクチャのセグメ ントアドレッシングて、 , コマンド行バッフ ア・常駐部・ EMS の三つの領域をアクセス させるのはかなり繁雑て、した。 ノヾッフアカま EMS に乗ってからは不満に感じていた部分 の改良に移りましたが , 私が不便と思らて ことは皆さんも同様に感じていたよう て、 , 私の改良を多くの人が喜んて、くださり , 楽しみながら改良を進めていきました だひとっ悲しかったのは , 改良中は当然 KS H を使うことがて、きないわけて、 , KSH 愛好 者のなかて、もっとも恩恵に預れないひとり だったに違いありません : ー ) 。 さて , 私の場合もともとは単なるユーザ にすぎませんて、した。しかし , 熱心なユー ザて、あればこそ , そのユーティリテイへの 不満や要望が生じてくるものて、す。 どういう点が拡張されれば便利になるの かをいちばんよく知っているのは , 作者よ りむしろューザなのて、はないて、しようか。 もし頻繁に使用しているユーティリティの ソースが手元にあるのなら改良を試みない 手はありません。自分のアイデアがすぐに 反映されるのも「改良」の利点て、 , 数あるプ 66 C MAGAZINE 1992 10 DOS 用シェル環境「 K ト She 旧 ログラミングスタイルのなかて、 , もっとも 楽しい部類に入るのて、はないかと思います。 RAM ディスク「 RZ3 」 ZOBpIus 速水祐 ASCI ト NET : PCS19948 日経 M Ⅸ : hayami トリエントリ数などの変更が可能 ・ RZC. EXE により , 組み込み後のディレク のディスク容量の変更が可能 ・ RZ コマンド RZC. EXE により , 組み込み後 を以下に示します。 っています。今まて、述べてきた以外の機能 タの信頼性も上げることがて、きるようにな た。さらにチェックサムの導入によりデー 作テストが行われ , 信頼性を高めてきまし 多くのユーザによるあらゆる環境下て、の動 IX, ZOB Station など ) を通じて配付され , Z3 」は , パソコン通信 (ASCII-NET, 日経 M 安定性はもっとも要求されるものて、す。「 R されます。したがって , そこて、の信頼性と にテンボラリなどとして , 頻繁にアクセス RAMi-•イスクはアプリケーション動作中 ています。 と入れ換わり , より速いアクセスを実現し して , それぞの CPU に最適化されたコード くに ード / ライトルーチンは CPU を判断 速なプログラムコードとなっています。と ルーチンはアセンプラて、記述し , 小さく高 高速アクセスを実現するために , 各部の 理て、きます。 ニアな 1 ドライプのエリアとしてアクセス管 クとして割り当てることがて、き , それをリ 「 RZ3 」はこのメモリをすべて RAM ディス リ /ROM 裏メモリなどのメモリがあります。 BANK メモリ /EMS メモリ / プロテクトメモ PC ー 9801 にはメインメモリ / VRAM メモリ / 性を図りました。 へのリニアなアクセス , 高速化および安定 能化したものて、 , て、きるだけ多くのメモリ ANK メモリ専用 RAM ディスク「 RZ2 」を高機 river ZObplus version 3 ) は , その前身の B RAMi•イスク「 RZ3 」 (Ramdisk device d ・ EMS メモリ / バンクメモリ / 裏メモリ使用 時においてウォームプートが可能 ・ RAM ディスクの使用状況を示すアクセス ランプ ( テキスト使用 ) を表示する ・ RAMi-•イスクのドライプ名を固定するこ とが可能 付録ディスクには Ver. 3.01 から DOSVe r. 5 対応とウォームプートの実現率を高める 改良をした Ver. 3.04 を収録します。 富田均也 NI FTY-Serve : TAB02234 私は一太郎を使うとき以外は , 日本語入 カ FEP は VJE-ßを使っているのて、 , addde v/deldev はなくてはならないコマンドて、 す。元は NEC/EPSON の MS-DOS に付属の adddrv/deldrv を使っていて , FEP のほかに マウスドライバが必要なときはその環境の 数だけ組み込み用のバッチファイルを用意 していましたが , 昨年 , MS-DOS Ver. 4. 01 にも対応していて , adddrv/deldrv よりメ モリ消費が少ないという adddev/deldev に乗 り換えました。 多重起動がて、きる adddev のおかげて、 , 環 境の数だけパッチファイルを用意するとい うのはめて、たく解消しました。しかし , 今 度は deldev を複数実行しないと , ATOK と VJE-ßが切り換えられないという状況にお ちいり , しかたなく isdeldev を作ることにな ったわけて、す。 adddev は deldev が参照するための ID をメ モリ中に置いているのて、 , この ID のあるメ モリプロックの先頭アドレスと大きさを調 べておき , 今度はデバイスドライバの存在 するアドレスを先頭からたどって , 先ほど のメモリプロックに含まれるものがあれば deldev て、外れるはずだ , というのが「 ISDEL DEV 」て、使ったテクニックて、す。 MS-DOS の非公開の機能を使っていますが , このテ クニックには使わないわけにはいきません。 ただし , DOS 自身も使っているはずなの 取り外せるテパイスの表示 / チェック FISDELDEV 」

4. 月刊 C MAGAZINE 1992年10月号

プログラムの変化に対応でき るドキュメント作成システム ニューノヾージョン C MAGA マイクロドック V3 ℃ プログラムソース付き・・・¥ 48 , 000 ーはそリ、 -4- を - C ツースメイン第 C ツーユ - をジール名物 ー 1 インクん一ドファイ 4 ー第表 ドキ、メント第をア 0 グラム を第、ド方体一フ , イル名 ー 4 プ 0 ーバ 4- ゞを第表 ・通信画面との間て、カット & ペーストが可 TEL 03 ( 3293 ) 4711 能なエデイタを内蔵 「メモリーか簡単 Ver. 1 . 0 」 く動作環境 > FA システムエンジニアリング株 ・対応機種 Macintosh シリーズ FA システムエンジニアリング株は , C 言 ・必要メモリ 2M バイト以上 語から仮想メモリマネージャを利用するた ・必要ソフト 漢字 TaIk6.07 以上 AT コマンド対応モデム めのライプラリ「メモリーが簡単 Ver. 1.0 」 ・対応モデム く価格 > 9 , 800 円 を発売した。 問い合わせ先 同ソフトは , ューザが指定した外部記憶 株まつもと 媒体を仮想データメモリとしてメモリ管理 〒 242 神奈川県大和市大和東 1 ー 4 ー 4 を行うメモリマネージャライプラリて、ある。 TEL 0462 ( 61 ) 0070 開発中プログラムて、のメモリの管理は , メ 「 RED2 Ver. 2.0 」 モリマネージャをとおして得られたメモリ 株凵 FEBOAT プロックナンバの指定だけなのて、 , 仮想デ ータメモリを手軽に利用することが可能と #LIFEBOAT は , スクリーンエデイタ「 R ED2 」に新機能を追加し , Ver. 2.0 として発 なる。 おもな機能 , 特徴は以下のとおり。 ノし、 0 ・ 640K バイトを越えるメモリサイズをサポ 今回のバージョンアップて、追加された機 ートし , 大容量のメモリを必要とするプ 能て、最大のものは , マクロ言語機能と通信 ログラムて、も利用可能 機能。 ・作業領域をはみ出したメモリは自動的に マクロ言語機能 ( TEE ) は , インクルード 外部記憶媒体に退避復帰 ファイルや define などのプリプロセッサ命令 ・退避 , 復帰の繰り返して、分断された実メ をサポートした本格的なプログラム言語。 モリ領域を自動的に再配置して最適化 ユーザは , マクロ言語ソースを専用の TEE ・ EMS メモリに対応 ロ語コンパイラて、実行コードに変換して利 く動作環境 > 用する。 ・対応機種 PC ー 9801 シリ 通信機能は , RED2 から , 各種 BBS や UN ーズ ・対応 OS MS-DOS Ver. 3.1 以上 IX にログインする機能。 BBS の表示テキス ・対応コンパイラ トデータをカットバッフア経由て、編集画面 MS-C Ver. 5.1 以上 , に取り込むことが可能。また , SJIS, EUC の両方の漢字コードをサポートし ,UNIX 接 Turbo C Ver. 2 . 0 続時に入力された漢字コードを直接 EUC コ Quick C Ver. 2 . 0 ードに変換することにより MS-DOS と UNI Lattice C Ver. 4 . 1 X て、同一の編集環境を利用することが可能 Turbo C 十十 Ver. 2 . 0 Borland C 十十 Ver. 2.0 以上 となる。 く価格 > 38 , 000 円 く動作環境 > 問い合わせ先 ・対応機種 PC ー 9801 シリーズ FA システムエンジニアリング株 ・対応モデム AT コマンド対応モデム 〒 790 愛媛県松山市北藤原町 1 ー 26 く価格 > 38 , 000 円 問い合わせ先 (#LIFEBOAT TEL 0899 ( 31 ) 2886 〒 101 東京都千代田区神田錦町 3 ー 6 C ソースをしてその物を 4 フ , イルにはだす . は ( 人力フイル名′第が・な 工 : をユぎトよ ? ? ! イや名あ、込を」 はいファイ 4 ・分 ) 物いフ , イ 4 内をリュ -4 第別 復物・設第分取りを C ソーかり。ュン自作成 プログラムの変化に対応できる文書化システム マイクロドックは、 C 言語ソースを解析して詳細仕 様書 ( 内部仕様書 ) を自動作成します。 表紙、目次、モジュール構成図、モジュール一覧表、 インクルードファイル使用一覧、グローバル変数使 用一覧表、関数仕様書等そ 1 冊の仕様書として罫線 てレイアウトして出力します。また、用紙のサイズ 合わせ、出力項目の選択等かできます ソース上に決められた型でコメントを述すれば仕 様書の説明郎に取り込む事がてきます。これによっ てドキュメントの完全自動作成も可能です。できあ がりの文書をワープロ等て編集できます。 プログラム設計時のドキュメント作成支援 マイクロドックは、プログラム設計時のドキュメン ト作成にも利用できます。プロック・フロー付きの 設計書が簡単に作成できます。 V3.0 から追加された主な機能 ・英語スタイルのドキュメント出力 ・ AN 規格の引数に対応 ・ # inc ! ude ファイルの解析および使用一覧出力 ・グローバル変数使用一覧出力 ・実行部のソースのコメントより構造化フローを出 力。これに依ってソースと対応のとれたプロック フロー付きのドキュメントが作成できます 対応機種 . PC9801 シリーズ・ MS - ロ OS マシン 解析対象 . ANS 肚様に準拠した C ソース 上記製品はデモ・ディスク ( 無料 PC98-5 インチ FD ) があります資料及びデモのご請求は FAX でも受付ています。 MICROART INC. マイクロアート株式会社 〒 2 幻横浜市神奈川区鶴屋町 2 ー 9 ー 22 ー引 4 電話 045 ー引 6 -6508 FAX 045 ー 3 田一 6509 受付時間田 : 00 ー PY5 : 00 ( 月 ~ 金祭日除く ) く資料請求番号 165 〉 N ews Square 165

5. 月刊 C MAGAZINE 1992年10月号

d 加 c 詳解講座・Ⅷ 0 刪 コヒ。ーしたいケースがあるだろう。 ・大きなメモリ塊を確保する。 ・現在のメモリ塊からひとつずっオプジェクトを切 Obstack の使用法は , これとは異なっている。すべ てのシンポル名に対して , ただひとつのオプジェク り取る。 ・いったん切り取ったオプジェクトは動かすことが トスタックが用意されるだけて、ある。シンポルを読 み込んていくうちに , オプジェクトスタックの中に て、きない ある名前が次第に成長していく。名前が完成したら ・現在成長しつつあるオプジェクトにはどんな大き 成熟動作が行われる。つまり , もしシンポルがすて、 さのデータも自由につけ加えることがてきる。 に存在しているものて、あれば , 今読まれたほうは削 テストファイルに手を加えたもの 除される。 Obstack は大きなメモリ塊を確保し , その下位アド レスからメモリを割り当てていくという方法て、実現 されている。 chunk にシンボルを作成するには , 現メ モリ塊の「最高水位線 ( high water mark) 」の上に文 字を加えていけばよい。シンポルの終端に達して文 字をすべて加えてしまったら , 利用者は , 文字の個 数を認識しているのて、 , 新しいオプジェクトを作成 すればよいのてある。普通は平均的なオプジェクト の 100 倍くらいの大きさのメモリ塊を取っておくの て、 , 文字列がメモリ塊の最上位アドレスからあふれ てしまうことはない さらにわかりやすく説明すると , オプジェクトを 生成するのに十分に多くの文字があるならばメモリ 塊上ではこれらの文字はすでに隣接しあって存在し ている ( このことは保証されている ) のて、あって , 内 部て、はその先頭アドレスを指している。文字を移動 する必要はまったくない。このことは第 2 の利点て、あ るといえる。なぜならば長くなる可能性のある文字 列て、あっても明示的に移動させる必要がないからて、 ある。一度生成されたオプジェクトはそれが生きて いるかぎりアドレスを変更することがない 文字列がメモリ塊のサイズの上限を突破してしま ったときには , 自動的にもっと大きな chunk が確保さ れ , 古いほうの chunk の最後から新しい chunk の先頭 へと現在構築されつつあるオプジェクトがコビーさ れる。その後は , これまて、と同様に , 最後に文字を つけ加えていけばよいのて、ある。 grow には , 成長しているオプジェクトに 1 文字ずつ つけ加える版もある。 要約 : 1 1 : #include く stream. h> 2 : # include く Obstack. h> 3 : #include く stddef. h 〉 4 : #include く ctype. h 〉 5 : 6 : VOid 7 : main() { s [ 10 圓 0 ] ; 8 : char* 9 : int n = 0 , got_one 10 : 0bs tac k 11 : char C : OS. copy( ” #nunique words: ” ) ; 14 : cout くく " 何か適当にタイプしてね , で最後に EOFCD ) を御願い \ n ” ; 15 : 16 : while (cin. good() & & n く 1000 の { 17 : if (cin. get(c) & & isalnum(c)) { 19 : go t_one OS. grow(c) : 20 : } else if (got—one) { = os. finish( の ; 22 : char* current for (int i ニ 0 ; i く n; + + i ) { 23 : if (strcmp(s[i], current) 24 : OS. free(current) ; 25 : 26 : current break ; 28 : 29 : 30 : 31 : 32 : 33 : 34 : 35 : 36 : 38 : 39 : 40 : 41 : 42 : 43 : 44 : 45 : 46 : 47 : 48 : } = の { if (current ! = の current ; go t—one cout くく sC0] くく "}n ”・ for (int i = n ー 1 ; i 〉 0 ; cout くく sCi] くく” \ n ”・ os. free(sCi]); E ・ 1 1 よ 0 = N 0 ・ 1 0 ク スズ マイくく トサ ンの”” メ塊 ィリズう ” ; ラモイゅ 新アメサよ + し十レ + レ - 十し十》 0 0 0 0 0 djgcc 詳解講座・ Hello GCC World 85

6. 月刊 C MAGAZINE 1992年10月号

d cc 詳解講座・Ⅷ 0 刪 gcc gomi. c ーに -lm これて、 libc. a, libm. a の順序て、リンクさ れ , うまくコンパイルて、きます。 g032 で拡張メモリを使えるの ? 【質問 2 】 1991 年 10 月号 66 ページて、 PC ー 9801 版 g032 は , PC ー 9801 方式て、も拡張メモリを対応する ように書かれているが debug32 の表示を見る かぎり対応していない どう対処すればよ いか教えてほしい。 DOS 3.3A の EMSDRI VE. SYS を NS / E20 に組み込んて、いる。 【回答 2 】 g032 て、利用て、きるメモリはコンべンショ ナルメモリと工クステンデッドメモリ ( プロ テクトメモリ ) て、す。 EMS メモリは使えませ ん。拡張メモリを工クステンデッドメモリ と EMS メモリとに振り分けることがて、きる マシンて、は , 工クステンデッドメモリに割 り当ててください を教えてください。具体的には , MS-DOS リアルモードのプログラムを呼び出す方法 gcc のプロテクトモードのプログラムから 【質問 3 】 リアルモードの呼び出し方法は ? のグラフィックドライノヾのファンクション コールを gcc から呼び出す方法などて、す。 P C ー 9801 のグラフィックドライバの場合 , デ ータ領域のアドレスをスタックに積んて、対 応アドレスに far call する必要があります が , このようなリアルモードプログラム機 能の呼び出しは可能て、しようか ? 【回答 3 】 H バージョン以降の PC ー 9801 版 djgcc て、 は , コンべンショナルメモリ上にノヾッファ を取り , そのバッフアのセグメントおよび オフセットを BIOS コールの際に引き渡すこ とがて、きます。 実際の手順については , 1992 年 7 月号の「コ ンべンショナルメモリの利用」とサンプルプ ドキュメンコーナ ログラムの conven. c を参照ください 記憶領域を提供します。つまり , とくに使 Obstack クラスは , 大きさに対して柔軟な 分の翻訳を掲載します。 AIIocRing, lnteger, Rational に関する部 こて、は , Obstack, 載します (TabIe 1) 。 利用者ガイド (libg 十十 . texinfo) の翻訳を掲 前回に引き続いて GNU C 十十ライプラリ 用する領域の大きさを指定せずに , 領域が 使用て、きます。これは , 大きさが未知て、あ るデータの読み出しなどには非常に便利て、 す。 AIIocRing クラスは , 一時オプジェクト ( 短時間だけ必要て、すぐに不要になる作業用 のオプジェクトのこと ) の保存に便利なデー タ構造を提供します 0AIIocRing は , リング 状構造 ( 円状にリンクしたリスト ) て、あり , 各工ントリは循環的に利用されます。つま り , 古いデータは利用がリングを一周する 間だけ有効て、 , 再度の利用の際に , 破棄あ るいは再利用されます。 lnteger クラスは , 非常に大きな数を扱え る整数型と演算を提供します。この種のデ ータ構造は , bignum て、参照されることもよ くあります。 Rational クラスは , 有理数型と演算を提 供します。これは , 1 / 3 のような数を正しく 扱いたい場合に便利て、す ( これに対して dou ble て、は 0.3333333 ・・・・・となってしまう ) 。 この連載のページにかぎって , GNUG eneral Public License にもとづいた再 配布を認めます。 GNU C 十十ライプラリ Use ド s Guide Doug Lea 著 /( 株 ) プロシード訳 Copyright@ 1988 Free S0ftware Foundation, c. , 1992 Proceed, 旧 c. オプジェクトスタッククラス Obstack クラスは , GNU CC コンパイラソースに 添付されている C のオプジェクトスタック関係のマク ロと関数を単に書き直したものてある。 文字を 1 個ずつ読み進めて文字列を作りあげなけれ ばならないという場合がよくある。その結果は , 保 存することもあればそうて、ないこともあるが , いず れにせよ Obstack は , 文字を 1 個ずつ読み込んて構築 されるような文字列テープルを作成したり , 保持す ることが容易に設計てきるクラスてある ( * 1 ) 。このク ラスはとりわけ構文解析を行うアプリケーションに とても役立つ。その使用法は , テストファイル ( * 2 ) の gcc 詳解講座・ HellO GCC World 83

7. 月刊 C MAGAZINE 1992年10月号

特集・ Free a 「 e に子ぶ す。というのは , 追加したりするのはリス トのほうが楽だけど参照するときはテープ ルのほうが楽だからて、す ( Fig. 6 ) 。リストて、 も書こうと思えば書けますがバグりそうて、 コワイて、す。ところて、 , Fig. 6 て、 , table size > i 十 2 と書いてますが , テープルもリストも終わ りがあるのて、 , それを超えてアクセスしな いようにプログラムしなくてはなりません ( もしかしたら tbl [ 0 ] だって NULL かもし れないのて、す ) 。こういうのは , しよっちゅ う出てくるんて、す。めんどくさいと思いま せんか ? それに間違ってバグになっちゃ う危険性大てす。思わず , 『恥ずかしながら ドジりました < 第 1000 回 > 』してしまうか *dst = realloc (*dst, strlen (*dst) + strlen 12 : } 10 : } ーん , こうなったら軍 もしれません。極楽プログラマ最大最強の 事力て、かたをつけるしかない ! というわけて、 , テープルのラストにカラ のトークン兵を余分につけることにしまし た。これなら , テープルのサイズのチェッ クをしないて、楽にプログラムて、きますね (L ist 11 ) 。 List 11 のような方法は , 番兵のア ルゴリズムなのかなあ ( 似てるけど違うか ) ? て、も , けっこう兵隊つばいて、すね。多大な CPU 時間やメモリ量に代えても , バグに対 して自衛する権利は誰にて、もあるはずて、す。 こは , 平和プログラミング維持軍のアル ゴリズムとて、も呼んて、おきましよう。とに 、、 table size > i 十 2 〃を書かなくて ・汎用リストルーチン もよくなりました ( バンザイ ! ) 。 旧 6 : 5 : 4 : 1 : 9 : 8 : 7 : 6 : 5 : 4 : 1 : 11 : 10 : 9 : 8 : 7 : 6 : 5 : 4 : 1 : 文字列のメモリ領域を確保しなおす st 「 cat VOid 2 : strcat—real 10C (u-char **dst, if (*dst ト NULL) else u Char *src) (src) + 1 ) ; (src) + 1 ) : *dst malloc (strlen m 訓 oc の監視 strcat (*ds t, src) ; **dst ニ 0 ; VOid * 2 : mt ー 118 (size_t size) VOid *P,• P ニ盟 110C (size); if (!p) / * err ( ) は、 err ( ” m110C ( ) , return p : メモリを開放する関数とマクロ VOid 2 : mt_free_check ()O id *P) if (!p) return : free (p) : 9 : #define CHK-FREE(p) (mt-free-check (p)' メッセージを出して ent ( 1 ) する関数です * / size); (p) : NULL) lnemory nothing Xu" 今回は , リストの構造体は、、 token 〃だけて、 したが , リストルーチン各種を構造体ごと に書いていては , 極楽プログラミングとは いえません ( こんなとき C 十十なら , リスト クラスを作れば OK となるのて、すが・・・ 今回は , 、、 void * 〃て、ゴマかします。リスト 処理をしたい構造体は , typedef struct atom { struct atom * next ; } atom , のように最初のメンノヾを next という名前の 自分のポインタにすればいいのて、す。 toke n もそうなっていましたよね。リスト処理を 行う関数のプロトタイプ宣言の一部を Fig. 7 に示します。リストは、、 atom * * 〃の型にな っていますが , これはリストの先頭のアト ムを書き換えられるようにするためて、す。 リストをパラメータに渡すときは、、 & 〃をつ けます (Fig. 8 ) 。 あれ ? なんて、 list max はリストを書き 換えないのに , atom * * なの ? ・気楽にメモリ管理 に腹は変えられないのて、す ( キッパリ ) 。 きにエラーが出ないから危険 ! 」だって ? 背 oid * なんて , 間違ったパラメータ渡したと イイからて、す。楽チンて、ある ! え ? 「 v 、、 & 〃をつけないとしたほうが統一がとれて ず token のポインタに、、 & 〃をつけ , アトムは 抜きて、す。 list をパラメータて、渡すときは必 思うかもしれません。そうて、す , これは手 特集 Free so 臨 a 「 e に学ぶ快適開発環境構築法 51 ポインタへのメモリの割り当ても , と , 書くことがて、きます。また , 構造体の NEW X (), 100 ) ; は , p = malloc (sizeof (token) * 100 ) ; おくと間違いが減ります。たとえば , 配列とか ) Fig. 9 のようなマクロを定義して ( とくに 間違えることが多くないて、すか ? (I) 。構造体などを malloc するときサイズを 11 。 c を自作の関数て、くるんて、おきます (List て終了しなくてはなりません。そこて、 , ma このような場合 , 工ラーメッセージを出し が足りなくなってしまうことがあります。 MS-DOS などの場合 , 実行途中にメモリ

8. 月刊 C MAGAZINE 1992年10月号

NOW PRINTING ソフトバンクの ソフトバンク 出版事業部 アプリを使いこなす MS - DOS SOFT BANK 星野進ニ著 定価 2 , 200 円 「 Oh!PC 」の好評連載を加筆・修正、書籍化。 MS ー DOS の必要最小限のコマンドや機能につい て、様々な使いかたとノウハウをレッスン形式で紹介。 DOS 工クステンダ入門 林晴比古著 定価 2 , 400 円 DOS 工クステンダについての全体像をわかりやすく記述し、典型的な疑問とその解答をまと めて解説。また DOS / 16M をターゲットに各関数の使用例も詳細に説明。 MELWARE によるパワフルなメモリ管理術 改訂増設メモリ活用ブック 1 川原・石垣・三浦共著 定価 2 , 300 円 「増設メモリ活用ブック 1 」の改訂版。メモリ環境の変化に即応しながら、初心者でも理解 できるように、メモリの基礎知識と MELWAREVer. 5 による利用法を豊富な実例で紹介。 C プログラマのための C + + 入門 柴田望洋著 定価 2 , 900 円 「 c : 98 スーパーライプラリ」の柴田望洋氏が書き下ろした、最も簡潔で正確な c + + の解説書。 c から c + + へ、その拡張の必然性と c + + の特長を、体系的に解説。 Bt ⅱ eve システムガイド MML&VAINS 著 定価 4 , 800 円 NetWare 上で標準装備されるデータベース、 Btrieve について、その高速度を誇る全貌を解説 し、 dBASE で作成したシステムを LAN に移行するための解決策を掲示。ディスク付。 Macintosh ユーティリティとつきあう本 狩野都著 定価 1 , 600 円 System7 の登場で操作環境を大きく変えつつある Macint 。 sh について、新しい環境下でのユー ティリティの利用法をユーザーのニーズに応じて目的別に解説。 PracticaI C Programming 現実的な C プログラミング steve Oualline 著 岩谷宏訳 定価 3 , 600 円 米国 O'Reilly & Associates,Inc. の Nutshell シリーズの一冊。初級から中級を対象に、プログラム の仕様決定から改版まで、 c プログラミングの全サイクルを解説した定本的入門書。 パソコンし AN でどこまでできるか 杉山育央著 定価 1 , 800 円 パソコン LAN で実際に何ができるのかを徹底的に回答。導入や運営についてのチェックポイ ントや実例をあげながら、現在のパソコン LAN の実力を余すところなく語る。 NetWare A 円入門 荒井文吉著 定価 3 , 600 円 NetWare プログラミングの実践的入門書。サンプルプログラムの作成を通し、 NetWare のサ ービスを利用するアプリケーションの作成方法を具体的に解説。 5 " ディスク付。 X ウインドウ・システム・シリーズ日本語版第 7 巻 XViewVe 「 .3 プログラミング・マニュアル XViewVe 「 .3 リファレンス・マニュアル Dan HeIIer 著定価 6 , 000 円 / 4 , 000 円 米国 O'ReiIIy & Associates,Inc. から出版されているシリーズの翻訳書。第 7 巻は、 UNIX 上で 稼働する X11 リリース 4 に対応の XView ツールキット、バージョン 3 の解説書です。 定価は税込

9. 月刊 C MAGAZINE 1992年10月号

特集・ Free a 「 e に学ぶ 快適開発環境構築法 Fig. 4 b it bit 1 1 テパイスドライバアトリピュート 15 14 13 12 11 10 9 8 7 B/C IOC OUB OCR 6 60 5 4 3 2 1 に 9 CLK NUL STO STI 0 名前 値が 1 のときに与えられる属性 15 B/C キャラクタテパイス ( 値が 0 のときは , プロックテパイス ) 14 IOC IOCTL サポート 13 OUB bit15=1 のとき Output Until Busy ファンクションサポート bitl 5 = 0 のとき non - 旧 M format OCR Open/cIose/Removable Media ファンクションサポート 4 に 9 CON テパイスの高速出力 (INT 29H ) サポート 6 60 Generic IOCTRL, Get/Set Logical Device ファンクションサポート プロック型の終了処理 0 STI 標準入力 (stdin) 1 STO 標準出力 (stdout) 2 NU NUL テパイス 3 CLK CLOCK テパイス 2 : 4 : 5 : 6 : Fig. 5 8 mov mov 3 : sub lds 1 : and [dev-attri bute) , 07FFFh bx, cs: Cptsav] [ bx + 13 ] , al WORD PTR bx + 14 WORD PTR bx + 16 , CS : デバイスアトリビュート bit15 = 0 : es : bx ニリクエストヘッダアドレス MS ー DOS の隠しファンクション爪 T DCh INT DCh CL=81 ,AX=I [ 引数 ] [ 戻り値 ] BX = 要求メモリサイズ IK バイト単位 AX = 1 . 工ラー 0 : 成功 DX = 確保メモリプロック最終アドレス 64K バイト単位 BX = 確保メモリプロック先頭アドレス 64K バイト単位 INT DCh CL=82 ,AX=O [ 引数 ] [ 戻り値 ] なし DX = 解放メモリプロック最終アドレス 64K バイト単位 BX = 解放メモリプロック先頭アドレス 64K バイト単位 0 : 成功 AX = 1 : 工ラー ェントラント ( 再帰呼び出し ) 可能となるよ うにプログラムする必要があります。また , グローバル変数を直接参照するようなアプ リケーションも考えられるため (XMS 規格を 破る邪悪なアプリケーション ) , て、きるかぎ りその配置なども考えて作成してあります。 XMS ドライバ テパイスドライバとしての 特集 Free s 。 are に学ぶ快適開発環境構築法 47 てはデバイスドライバの形が残ってしまい 部分がないため , 先頭アドレスだけの処理 デバイスドライバにはドライプ数を入れる は跡を残しません。しかし , キャラクタ型 初期化工ラーとなって , デバイスドライバ の先頭アドレスを入れてリターンすれば , オフセット十 14 ~ 十 17 にデバイスドライノヾ オフセット十 13 にドライプ数 0 として入れ , プロックデバイスて、はリクエストヘッダの 在しないときのエラー処理に苦労しました。 初期化処理て、は , プロテクトメモリが存 ェリアに 0 をセットします。 リを使用しないよう , このシステムワーク アが XMS の管理から外れてプロテクトメモ 対象とします。そして , ほかのソフトウェ 得して , そのすべてを XMS のメモリ管理の ェリアからプロテクトメモリのサイズを取 す。デバイスドライバの初期化処理て、この イズ ( 128K バイト単位 ) が格納されていま は , 実装されているプロテクトメモリのサ システムワークエリア 0000h : 0401h に スドライバになります (Fig. 4 ) 。 1 にするとキャラクタデバイ として bit15 スアトリビュートを 1010 0000 0000 0000b スとして作成することにしました。デバイ て、 , ほかに影響の少ないキャラクタデバイ しまいます。これはあまり好ましくないの スとした場合 , ドライプがひとつ増加して バイスて、もよいのてすが , プロックデバイ ては , プロックデバイスて、もキャラクタデ の形態をとります。デバイスのタイプとし 組み込む必要があるためデバイスドライバ ドライバや常駐ソフトより先にシステムに うわけて、はありませんが , ほかのデバイス XMS ドライバは , 入出力関係の処理を行

10. 月刊 C MAGAZINE 1992年10月号

た場合は構造体の各メンバの内容が表示さ れます。 C ては代入文も式なのて、 , この機能 により変数に値を設定てきます。 ほかにも , 条件制御やマクロ定義 , ヒス トリが利用てきるなど , 使いやすくする配 慮が見られます。惜しむらくは , もう少し マウスを生かす工夫 , たをえば , ボタンに 任意のコマンドやマクロを定義する機能て、 もあればより便利だったかもしれません。 下位ウインドウについても簡単に触れて おきましよう。 ソースリストウインドウには C のソースリ ストが表示されます。マウス左ボタンによ りプレイクポイントの設定 / 解除が行えま す。スクロールノヾーて、スクロールて、きるの はもちろん , キーポードから行番号を入力 することにより行ジャンプすることも可能 てす ( 関数名によるジャンプや , 識別子の検 索もて、きれば万全だったのて、すが ) 。 逆アセンプルリストウインドウにはター ゲットの逆アセンプルリストが表示されま す。当然 , マウスて、プレイクポイントを設 定することもてきます。のみならず , メニ ューにより機械語コードや C のソースを同時 に表示したり / しなかったりといった指定も 可能て、すし , 表示開始アドレス指定にデバ ッガコンソールウインドウ同様の C の式が使 えるのて、 ( ということは , 関数名て、も C ソー スの行番号ても受け付ける ) , 場合によって はソースリストウインドウより重宝するか もしれません。 メモリダンプウインドウには指定アドレ ス以降のメモリ内容がリアルタイムに表示 されます。表示形式はバイト , ワード , ロ ングワード , 浮動小数点 , 文字 , 相対アド レスなどから選べます。また , 表示されて いるメモリ内容をマウスて、指定し , その値 をアドレスとして逆アセンプルウインドウ に渡したり , 新たなメモリダンプウインド ウを開いたりする機能があります。 変数モニタは変数内容を表示するウイン ドウて、す。正確には変数だけて、はなく C の式 の値を表示します。表示の更新はデバッガ に制御が戻るたびに行われるのて , トレー スしながら変数の変化を追うことがて、きる 158 C MAGAZINE 1992 10 わけて、す。 スタックフレームウインドウは実行中の 関数のスタックフレームのようす ( 引数とロ ーカル変数の値 ) を表示します。関数が入れ 子になっている場合 , メニューて、表示対象 を上位の関数に切り換えられます。 レジスタモニタウインドウには 68000 のレ ジスタ内容が表示されます。メニューによ り , レジスタ内容を C の識別子 ( 関数名や配 列 / 構造体名 ) て、表示することも可能て、す。 プレイクポイントウインドウには設定し たプレイクポイントのアドレスが表示され ます。キーボードから新たなプレイクポイ ントを設定することもてきます。 リソースエデイタ リソースはプログラムの実行に必要なデ ータ ( だけて、はなく , サプのプログラムて、も よいのて、すが ) をメインプログラムから分離 したものて、 , ウインドウシステムて、はお馴 染みの概念て、す。データがプログラム本体 に埋め込まれているとデータ部に小さな修 正を加える際にも再コンパイルが必要てす が , 分離されていれば再コンパイルなしに データのみを修正することがてきます。ま た , このような修正はユーザレベルて行う こともて、きるのて、 , ある程度のユーザカス タマイズも可能になります。理想をいえば , ウインドウに表示される図形や文字列など はすべてリソースにしてあるべきて、す。 しかし , SX ー WINDOW て、はこれまて、リソ ース作成用のツールがなかったためか , あ るいは , リソースが実行ファイルとは完全 に別のファイルになってしまうという繁雑 さのためか , ある程度以上大きなプログラ ムて、もないかぎり , リソースをあまり積極 的に活用していません。今回のリソース工 デイタのサポートて、 , 事態が改善されるこ とを期侍してみましよう。 そのリソースエデイタ . X は Macintosh の ResEdit あたりを参考にしたようて、 , 16 進数 値による直接編集 , テンプレートによる穴 埋め式の編集 , リソースタイプに応じた内 蔵専用工デイタによる編集をサポートして います。リソースを編集しようとすると , 専用工デイタがあればそのウインドウ , 工 デイタがなくテンプレートがあればテンプ レート編集ウインドウ , どちらもなければ 16 進編集ウインドウが開きます。専用ェデ イタがあってもあえてテンプレートて編集 したいという場合はメニューて、編集方法を 指定することもてきます。 ちなみに こて、いうテンプレートとは リソース各タイプごとの構造を定義したデ ータて、 , これ自体 TMPL というタイプのリ ソースとして提供されます。標準的なリソ ースタイプのテンプレートはすて、に用意さ れていますが , アプリケーション独自のリ ソースタイプが必要になった場合もテンプ レートの追加だけて、対応て、きます。 専用工デイタとしては , 少なくとも , W IND ( ウインドウの大きさ / 表示位置などの 定義 ) , DLOG( ダイアログの大きさ / 表示位 置などの定義 ) , CNTL ( コントロール数の 大きさ / 表示位置などの定義 ) , DITL( ダイ アログ上のアイテムの配置 ) , PATI ~ 4 ( パ ターンデータ ) 用のものが内蔵されていま す。また , PICT ( 描画命令列の形て、表現さ れた図形 / 絵 ) の場合は , 描画結果を表示す る専用ウインドウがエデイタの代わりに用 意されています。総じてどの専用工デイタ も使いやすそうてす。あえていうなら , W IND と DLOG のエデイタにあるプレビュー機 能はメニューに埋もれさせずにボタンにし てあったほうがよかったような気がします。 しかし , 専用工デイタがリソースエディ タ . X に文字どおり内蔵されてしまっている のはいただけません。このようなサププロ グラムこそリソースにすべきて、しよう。そ うすれば , アプリケーション独自のリソー ス用工デイタを追加したり , 既存のものを 差し換えたりといったことも可能になりま リソースになっていれば , 必要 す。また , になるまて、メモリ上に読み込まないように て、きるのて、 , リソースエデイタのメモリ占 有率を抑えることにもつながります。一考 をお願いしたいと思います。