Turbo - みる会図書館


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

1. 月刊 C MAGAZINE 1992年4月号

List 6 応用 C 言語 C の道具箱 tabtospc( ) 関数 ( タブコードのスペースへの置き換え , CM920403 ) ” config. h ” 1 : #include 3 : #define MYEXTERN extern 5 : #include く stdio. h> 6 : #include く string. 8 : # i fde f PROTOTYP E 9 : #include ” cboxprot. h ” 10 : #endif 12 : tabtospc(ds, ss, tablen) 13 : char *ds 14 : Char *SS int tablen; 17 : i nt i , k, j, n ・ n=strlen(ss) fo で (i=0 ・ i く n ・ if (ssCi] ト dsCk)=ssCi); else{ for(j=0 ;j く tablen dsCk)= con t i nue dsCk]='*0' return( の : 34 : 33 : 32 : 31 : 30 : 28 : 22 : 20 : 15 : 11 : 4 : 2 : ログラムにバグがあり , ディレクトリ内の 前回紹介したディレクトリ制御関係のプ バグについてのお詫び #define SYSV #define UNIX ・ UNIX 用 config. h ox. a の指定てある。 , こてヾー lcbox クとは , ライプラリ libcb -lcurses -ltermcap ー 0 sample /usr/5bin/cc sample. c -g -lcbox オプションを指定する必要がある。 コンパイル ( あるいはリンク ) の際にリンク curses ライプラリとリンクする場合には , ar rv libcbox. a func. 0 /usr/5bin/cc func. c -c -g が必要て、ある。 類に応じてこれを EUC などに変換すること 漢字コードはシフト JIS なのて、 , マシンの種 付録ディスクに収録されているファイルの ファイル数が非常に多い場合や UNIX 上て起 動した場合に , 適切に動かないことがわか りました。今月号の付録ディスクにその修 正版を収録しましたのて、 , 前回のものと差 し換えてください [ 参考文献 ] [ 6 ] [ 2 ] [ 1 ] ログラム集」技術評論社 MELON. A. I. G 著「ファイル処理プ ング入門 [ 下 ] 』技術評論社 [ 5 ] 河西朝雄著「 Micr 。 s 。 ft 初級プログラミ サイエンス出版 浩訳「 UNIX システムプログラミング」 [ 4 ] K. ハヴィランド , B. サラマ共著 / 玉井 菊池彰訳「 CURSESJ 啓学出版 [ 3 ] ジョン・ストラング著 / 矢吹道郎監修 / xplainedl , Prentice Hall, 1991 Berny Goodheart, TIJNIX Curses E tice Hall, 1990 CURSES, LEX and YACC 』 , Pren Axel T. Schreiner, TUSING C with ・新刊案内 ( 定価は税込 ) Windows プログラマー 短期養成講座 オプジェクト指向 W i n d 0 w s プロクラミンク 中山茂著 / A5 ・ 480 頁・定価 3 , 605 円 Windows プログラミングは , メッセージ 誘導やイベント誘導の考え方を理解し , さらに 600 近くの Windnws 関数を覚えな けれはならぬなど , 簡単には乗リ越えら れない壁かある。本書は , 操作性のよい BorlandC + + を用い , 簡潔なプログラム を例題として , オつ・ジェクト指向・手続 き指向の差異も把握てきるよう工夫しな から , 短期間て容易にプログラミングが 習得てきるようまとめたテキスト。 裔日本語 Windows3 中山茂著 / A5 ・ 342 頁・定価 2 , 369 円 解説に対応した画面例 700 余を併載。操 作によリ実際の画面表示かどの様に変わ るか , 次にどのような操作をすればよい か , 実行手順か一目てわかるよう編集さ れた入門テキスト。付属の 13 種のアプリ ケーション・ソフト総てについても解説。 C ユーザー待望の解説書 ( ソースプログラム F D 別売 ) TurbO C + + オプジェクト指向 プロクラミンク入門 ー ANSI C, AT&T C + + Ver2.0 版ー 中山茂著 / A5 ・ 268 頁・定価 2 , 369 円 グレードアップされた C++ の基礎知識・ 基本操作 , 統合開発環境メニューはもと よリ , C + + の特徴てあるオプジェクト指 向プログラ三ングを自在に駆使てきるよ う , その基本的考え方から実技まてを平 易に解説 ( PC9801 シリース対応 ) 。 TurbO C, Turbo C + + クラフィックス プロクラミンク入門 —TurboC 2.0c, TurboC + + 1 0 版ー 中山茂著 / A5 ・ 278 頁・定価 2 , 369 円 プログラミングの基礎から , 基本操作 , 効果的グラフィックスを用いたシステム 構築 , 関数を学ぶための CAI の作成まご を習得てきる入門テキスト ( PC9801 シリ ーズ・ FMR シリース対応 ) 。 Borland C + + 技報堂出版 〒 107 東京都港区赤坂 1 ー 11 ー 41 容 03 ( 3585 ) 0166 FAX03 ( 3505 ) 5838 く資料請求番号 133 〉 応用 C 言語 133

2. 月刊 C MAGAZINE 1992年4月号

め ,SYMDEB て、デバイスへッダを無理やり 先頭に移動させています。 また , TINY モデルて、いろいろと試してみ たのて、すが , MS ー C 6.0 て、は TINY モデルと SMALL モデルの生成コードにほとんど差が なく CRTCOM. LIB を先頭にリンクすること により区別しているようてす。 さらに TINY モデルのアセンプリリみトを 調べてみましたが , TEXT セグメントは D GROUP に属しておらず , TEXT セグメン トを DGROUP に変更してアセンプルし直し ても正常なコードが生成て、きませんて、した。 したがって , EXE 型のデバイスドイラバ として記述しています。 MS ー DOS 3. x て、は EXE 型のデバイスドイラバが定義可能て、あ り , デバイスへッダは EXE ヘッダの直後に 位置する必要があります。 ・テパイスへッダ (sdevhead) MS-C 6.0 にも emit 機能がありますが , TurboC よりも機能が低く , 1 バイトしか定 義て、きません。そのため , ストラテジェントリポインタのポイン タ 割り込み工ントリポインタのポインタ のふたつは領域だけを確保して , オプジェ クト作成後に SYMDEB て、セットするように しました。 ・ストラテジルーチン (strategy) Turbo C のように疑似変数が使用て、きな いため , インラインアセンプリ言語て、記述 しています。修飾子として saveregs と 10a dds を指定しています。 saveregs 修飾子は Turbo C 十十と同じ機 能て、すが , void 型の関数ても AX レジスタが 戻り値として返されるため , AX レジスタを 関数の最後て、 , 呼び出し時の値に戻してい ます。 loadds 修飾子は DS レジスタをセット アップ ( ここて、は DGROUP に設定する ) する 機能て、す。 ・割り込みルーチン ( inthdl) ストラテジルーチンと同様に修飾子とし て saveregs と loadds を指定しています。 94 C MAGAZINE 1 2 4 コンパイラによりレジスタの退避と復帰の コードが生成されるため , ①ローカルスタックの設定 ②旧 SS レジスタをローカルスタックに退 避 ③各コマンドの実行 ④スタックポインタを元に戻す ⑤ AX レジスタを呼び出し時の値に戻す という手順になります。 ・初期設定ルーチン (init) 初期設定ルーチンは Turbo C と同じて、す。 こて、も cputs 関数の代わりに dos cputs 関 数を使用していますが , スタートアップル ーチンをリンクしないようにするために必 要となりました。スタートアップルーチン をリンクすると TEXT セグメントの先頭に 16 バイトの 00h が生成されるため , ますます ややこしくなってしまいます。 ・コンバイル コンパイルは Fig. 3 (a) のように行いま す。 SYMDEB と MAPSYM を使用してデバ イスへッダを作成しています。 devsmpm. c のパターンを変えなければ strategy 関数と i nthdl 関数のアドレスは変わらないため , F ig. 3 ( b ) のようにすることも可能て、す。 LSI C -86 Ver 3.20 用 LSI C ー 86 Ver 3.20 用の非常駐デバイス Fig. 3 MS-C 6.0 用コンパイル・リンク (a) 方法 1 ドライバのテンプレート (devsmpl. c) を付録 ディスクに収録します。 LSIC は TINY モデルをサポートしていな いため , SMALL モデルて記述して EXE 型 のデバイスドライバとします。 ・テパイスへッダ (sdevhead) デバイスへッダはアセンプリインライン 関数て、記述します。引数を持たない関数て、 はスタックフレームが生成されないため , デバイスへッダを先頭にもってくることが 可能て、す。 LSI C て、は最後のパスて、アセンプラて、アセ ンプルされるため , コンパイラにより生成 されるアセンプリソースを思い浮かべて , 関数外に定義した変数を最後に ダースコア ) を付加して直接使用することが て、きます。 ・ストラテジルーチン (strategy) ストラテジルーチンはリクエストヘッダ のアドレスをセットするだけて、す。 far リタ ーンする必要があるため , far 型の関数とし て記述します。 ・割り込みルーチン ( inthdl) 以下の手順を踏んて、います。 ①レジスタの退避 ② DS = DGROUP ③ローカルスタックの設定 ④旧 SS レジスタをローカルスタックに退 cl -J -Gs -W3 -zpd devsmpm. c -link /m/li mapsym devsmpm if exist devsmpm. sys del devsmpm. sys 「 en devsmpm. exe devsmpm. SYS echo m303 LI 2 300 : eW306 strategy inthdl >$$$. dat echO w : q >>$$$. dat symdeb devsmpm. sym devsmpm. sys く $$$. dat del $$$.d@t (b) 方法 2 cl -J -GS -W3 -Zp devsmpm. c if exist devsmpm. sys del devsmpm. sys 「 en devsmpm. exe devsmpm. SYS symdeb / ” m303 LI 2 300 : e306 1 a 00 46 00 : w : q"devsmpm. sys

3. 月刊 C MAGAZINE 1992年4月号

Q ディスクの空き容量を知りた いのですが , どうすればよいでし A ディスクの総容量や空き容量 は getdfree 関数を使うことにより 調べることがてきます。 List 1 にデ イスクの空き容量を調べる関数例 を示しますのて、参考にしてくださ 0 0 158 C MAGAZINE 1 2 4 たとえば , クライアントウインド バーの範囲を指定してください SetScroIIRange< スクロール A スクロールバーが表示されません。 たのですが , 実際に動作させると ールバーを表示させるよう指定し CROLL や WS HSCROLL でスクロ インドウのスタイルとして WS VS しています。 M 引のクライアントウ Windows のプログラムを開発 Q 値を指定することがて、きます。 び出し側に戻るときのレジスタの などとすることてハンドラから呼 bx 0x 1234 , ています。したがって , タを退避した領域そのものを指し Fig. 1 に示された引数は , レジス の内容が関数に渡されます。 ては Fig. 1 のような形式て、レジスタ interrupt 修飾子を使った関数 0 A ますか。 タの値を変更して戻ることはでき 復帰を行ってくれますが , レジス 数は , 自動的にレジスタの退避 , interrupt 修飾子が使われた関 Q ホーランド lnformation from C0mpiler Makers 10 : { 16 : } 19 : ( 1 : 〃 3 : 〃 6 : ″ 11 : ″ 12 : / / 14 : 〃 15 : 〃 16 : / / 17 : / / 18 : / / 19 : 〃 20 : 〃 21 : 〃 38 : / / BorIand C 十十 Turbo C 十十 ウの WM CREATE メッセージの 処理ルーチンに Fig. 2 のような文を 追加してください Q TurbO AssembIer が LEA 命令 を MOV 命令に置き換えてしまうた め , 予想したコードサイズと違っ てしまいます。これを置き換えな いようにはできませんか。 0 と , シンポル情報がみつからない ログラムをデバッグしようとする TurbO Debugger で . COM プ Q 0 してください NK 4.0 を使ってリンクするように orland C 十十に付属している TLI rbo C Ver. 2.0 のプログラムを B が表示されます。この場合は , Tu ようとするとこうしたメッセージ Debugger Ver. 2.5 て、デバッグし and C 十十に付属している Turbo デルて、作成したプログラムを Borl Turbo CVer. 2.0 のラージモ A ーになってしまいます。 がシンポル情報がないというエラ 「 . 2.5 でデバッグしようとしました ログラムを , Turbo Debugger Ve TurbO C Ver. 2.0 で作ったプ Q 0 ってください るときは , SMART 疑似命令を使 ください。再度最適化を有効にす は NOSMART 疑似命令を使って こうした最適化を禁止するために 高速な MOV 命令に置き換えます。 えが可能な場合は LEA 命令をより Turbo AssembIer は , 置き換 A List 1 3 : #include く dOS. h 〉 2 : #include く dir. h> 1 : #include く stdiO. h> 4 : 6 : 8 : 11 : 12 : 13 : 14 : 15 : 17 : 20 : 21 : 22 : 18 : void min() * ( 10 ) dinfO. df 一 * (long)dinfo. df—sclus; return (long)dinfo. df—avail getdfree(drv, 記 infO) : struct dfree dinfo; 9 : 10 getdiskfree(int drv) drv: ドライブ番号 ( 1 = A : , 2=B:, * ディスクの空き領域の大きさを取得する ' A' + cu ー 1. getdiskfræ(curdr の ) : printf("Drive : Xld bytes free%n ” int curdrv = getdisk() + 1 : List 2 2 : ″ Turbo Vision ーネストされたメニューの作成 7 : / / -TMenuItem には 2 つのコンストラクタがあります。メニュー項目の内容は、 メニューを作成する例を示します。 4 : 〃ーこのサンプルプログラムでは、 TSubMenu クラスを使ってネストされた 10. 13 : これらの 2 つのコンストラクタを使って制御されます。 TMenuItem(const char *aName, ushort aCormnd, ushort aKeYC«1e, ushort aHel$-•tx = hcNoContext, char *P ニ 0 , TMenuItem *aNext ー TMenuItem(const char *aName, ushort aKeyCcHe, TMenu *aSubMenu, ushort 1 tx = hcN(ßontext, TMenuItem *aNext ニの : で示されたメニューが呼び出されます。 2 番目のコンストラクタが使われると、メニュー項目を選択すると aSubMenu ことで aCommand で示されたイベントが生成されます。 これらのコンストラクタの最初の形式が使われると、メニュー項目を選択する 22 : #define Uses_MsgBox 23 : #define Uses_TApplication 24 : #define Uses TButton 25 : #define Uses_TDeskT 叩 26 : #define Uses_TDialog 27 : #define Uses_TKeys 28 : #define Uses TMenu 29 : #define Uses TMenuBar 30 : #define Uses_TMenuItem 31 : #define Uses TStaticText 32 : #def ine Uses_TStatusIhf 33 : #def ine Uses_TStatus ltem 34 : #define Uses_TStatus い ne 35 : #define Uses_TSubMenu 36 : #include く tv. h> 39 : 〃コマンド定義

4. 月刊 C MAGAZINE 1992年4月号

嘘新 MS ー DOS プロクラミンク入門 ーズ , AX マシンに対応させたことて、お許し [ 16 ] TTURBO C 十十 1.0 INTRODUCTI DOS ファンクション 06h(Table 3 ) 直接コンソール I / O ください。なお , J ー 3100 シリーズと AX マシ ON 』 , BORLAND [ 17 ] TTURBO C 十十 1.0 USER'S GUID DOS ファンクション 07h(Table 4 ) デバッグし ンは手元にマシンがないため , 直接コンソール入力 ておりません。 E 』 , BORLAND [ 18 ] fTURBO C 十十 1.0 PROGRAMME を使用して表示とキー入力を行っています。 毎回くパスワード > を入力するのがめん R'S GUIDE 』 , BORLAND [ 参考文献 ] どうな場合は特定のキー ( たとえば , + [ 19 ] TTURBO C 十十 1.0 LIBRARY RE 十など ) を押しているとくパス [ 1 ] 中島信行 , 「 C によるメモリ管理技法」 , FERENCE V01.1 , V01.2 』 , BORLAN ワード > を確認しないモードを追加するの 「別冊インターフェース』 , CQ 出版社 C2]fMS-DOS 工ンサイクロペディア Vo [ 20 ] TLSI C ー 86 Ver 3.2 試食版ユーザー もおもしろいて、しよう。今回は機種依存を 避けるため , あえて追加していません。 ズマニュアル』 , 工ノレ・エス・アイジャ lume 1 , 2 』 , アスキー C3]fMS-DOS 3.1 プログラマーズリファレ 複数のコンパイラに条件コンパイルて、対 応したため , リストが見にくくなってしま ンスマニュアル』 , NEC C4]fMS-DOS 3.1 マクロアセンプラマニュ いました。基本的にはコンパイラごとに説 明した手法を用いていますのて、 , 詳細はリ アル』 , NEC [5] 「 MS-DOS 3.1 ューザーズリファレンス ストを参照してください。コンパイルは Fi g. 5 のように行います。 マニュアル』 , NEC [6]fMS-DOS 3.3B プログラマーズリファ まとめ レンスマニュアル』 V01. 1 , V01. 2 , N EC [7] 「 MS-DOS 3.3B ューザーズリファレン 今回は一風変わった常駐しないデバイス ドライバを取り上げてみました。今回の例 スマニュアル』 , NEC て、初期設定ルーチンの最後てフリーメモリ [ 8 ] rMicrosoft C 6.00A ProfessionaI De 開始アドレスを設定するように変更すれば , vel opment System Programming Gu 本来の常駐デバイスドライバを記述するこ ide 』 , Microsoft [ 9 ] fMicrosoft C 6.00A Professional De とがて、きます。 参考として 1991 年 7 月号の特集て取り上げ vel opment System Reference 』 , Mic た ESC/P プリンタドライバを今回の手法て、 rosoft 書き直したもの (escp_prn. c) を付録ディスク [ 10 ] 「 Microsoft C 5.1 Optimizing Compi に収録しました。 ler User's Guide 』 , Microsoft ただし , 常駐するデバイスドライバて、は [ 11 ] 『 Microsoft C 5.1 Optimizing Compi 特集て、紹介した TSR 型デバイスドライバの ler Language Reference 』 , Microsoft 手法のほうが ADDDRV/DEI DRV コマンド [ 12 ] 「 Microsoft C 5.1 Optimizing Compi を使用しなくてもコマンドラインから常駐 ler Mixed Language Programming G 部を解放てきるため , 使い勝手ははるかに uide 』 , Microsoft よいと思います ( プログラムは少し複雑にな [ 13 ] fMicrosoft C 5.1 Optimizing Compi りますが ) 。 ler Run- Time Library Reference 1 , なお , 付録ディスクに収録した ESC / P プ 2 』 , Microsoft リンタドライバ ( e p ー prn. c ) はデバイスドラ [ 14 ] TTURBO C 2.0 USER'S GUIDE 』 , イバという性格上 , 本連載の趣旨に反して BORLAND 機種依存を避けることがて、きません。手元 [ 15 ] TTURBO C 2.0 REFERENCE GUI に資料のある PC ー 9801 シリーズ , J ー 3100 シリ DE 』 , BORLAND 愛読者プレゼント 本連載の筆者 , 中島信行氏から愛読者プ レゼントとして中島信行著 , CQ 出版社刊 ー MS ー DOS メモリ管理ソフト技法』 ゴ C によるメモリ管理技法』 「 MS ー DOS 完全活用法」 3 冊 1 組をご提供いただきました。、ご希望 の方は , 官製葉書に本連載に対するご意 見をご感想・ご要望などを明記のうえご 応募ください。 4 月 18 日消印までを有効と させていただきます。なお , 当選者の発 表は商品の発送をもってかえさせていた だきます。 あて先 〒 108 東京都港区高輪 2 ー 19 ー 13 NS 高輪ビルソフトバンク ( 株 ) C マガジン編集部 「新 MS ー DOS プログラミング入門」係 96 C MAGAZINE 1992 4

5. 月刊 C MAGAZINE 1992年4月号

箱 語具 応の #include く stdio. h > #include く string. h > List 5 if (key = 0x1b Ⅱ key = 125 : 126 : = 9999 ;break; opt 127 : if (key = 0X9 Ⅱ key = 128 : 129 : opt = 9900 ;break; 130 : if (key = 0X8 Ⅱ key = 131 : 132 : opt = 9910;break; 133 : marmnl (mn, opt, A—NORMAL) ; 134 : (key = = KEY—LEFT) opt= --opt く startn ? startn:opt; 135 : if else if (key ー = KEY—RIGHT) opt = + + opt > mnnum 136 : ー 1 137 : ? mnnum ー 1 : opt ・ else if (key = = KEY—DOWN) 0Pt = OPt > = mnnum 4 ? opt : opt + 4 ; 138 : else if (key = = KEY—UP) 0Pt = 0Pt く = startn + 3 ? OPt : OPt-4; 139 : else if (key ! = ENTER & & key ! = KEY—ENTER ) ・ 140 : )whi le(key ! = ENTER & & key ! ニ KEY—ENTER) ; 141 : if ( opt く 900 の { 142 : marmnl(mn, OPt, A—BLINK IA—BOLD) : 143 : 144 : attrset(A_NORMAL) ; 145 : return(opt) ; 146 : 147 marmnl(mn, opt, att) 148 : 149 : struct Gmnstr2 mn[] ; 150 : int opt; 151 : int att; 152 : { attrset(att) : 153 : mvprintw(mncopt] . y, mn[opt) 154 : Xs ” ,mnCopt] mvprintw(mnCopt] . y, mnCopt]. x, . moji); 155 : refresh() ; 156 : return( の ; 157 : 158 256 ) { #include pldwn. h" #include <curses. h > KEY_STAB ) { KEY_BACKSPACE){ #ifdef PROTOTYP E #include "cboxprot. h' #endif wtypew (pw, flname) WINDOW *pw ; char *flname [ 引数 ] * pw ←ウインドウ関連のパラメータを 格納する構造体のポインタ flname ←ファイル名 [ 戻り値 ] ファイルが見つからない場合ー 1 を , 正常終 了の場合 0 を返す。 [ 機能 ] Fig. 2 PC ー 9801 上での wtypew. exe の実行画面 ウインドウ pw にファイル flname の内容を表 示する。 コンバイル 道具箱に追加された関数は , TurboCV er. 2.0 および MS-C Ver. 6.0 上てコンパイ ル可能なものてある (UNIX 用のものは , S UN ワークステーションおよびその互換機て コンパイル可能てある ) 。いずれの場合にも 各プログラムは分割コンパイル用のものな のて , コンパイル後 , オプジェクトファイ ルを読者のライプラリに追加していだきた くくファイルの表示 > > SCROLL. E}<E WTYPEW. JCW . E 1 . BAT SCROLL. JCW CT(X)l-æ. JXW 2. T SCROLL . JCW 3. T BÄS 明は新 町・ EW. EYE Tg8TOSPC. JCW CO 「 , 輝 3 終了 E S C 前画面 B S 選択 C R 次画面 TAB ■ Turbo C TurboC てコンパイルする場合には , コ ンパイルスイッチを以下のように設定する とともに , TurboC コンパイラのディレク トリ下の INCLUDE ディレクトリの中に , C 応用 C 言語 131 wtypew( ) 関数 ( CM920404 , List 4 ) ーーファイルのサプウインドウ内への表示 [ 書式 ] #include "config. h" [ 機能 ] 文字列 ss に含まれるタブコードを tablen 個の スペースに変換し , 文字列変数 ds に格納す

6. 月刊 C MAGAZINE 1992年4月号

速報 米国版 BorIand C 十十 Ver. 3.0 & AppIication Frameworks 天元広海 今回リリースされた米国版釦 d C 十十 . 3.0 は , Turbo C 十十館 Windosws と AppIication mewo 「 ks を加えることにより , 現在もっとも強力 な MS-Windosws プログラム開発環境を提供してくれる。強化された機能 を中心に米国版 B 血 nd C 十十 Ver. 3.0 紹介する。 プルマシン向けに , BorIand C 十十 Ver. ( 以下 BC 十十 2 . 0 ) が生まれた。 New Borland C 十十 3.0 しかし , リーダーて、ありつづけようとす 3.0 ( 以下 BC 十十 3.0 ) が登場しました (Fig. 1 , Fig. 2 ) 。マイナーバージョンアップて、は るには , 停滞はすなわち後退て、あり , 現状 近ごろの BorIand はすごい。何がすごいっ たてつづけ ( といってもよいだろう ) に甘んじているわけにはいかない。あれよ なく , あれよという間に , Borland C 十十のバージ のメジャーバージョンアップて、す。いった たって , Ashton ー tate を吸収したからすごい などといっているのて、はない。最近の Borl い何が B 。 rland をここまて、駆り立てているの ョンは 3.0 にまて、上がった。もはや , コンパ and の広告を見よ。、、 The leader in object- イラの名前がどうのこうのといっている場 て、しようか。 oriented programming" なのて、ある。何し 合て、はない。ぐずぐずしていると , インス BC 十十 2.0 て、は , Windows アプリケーシ トールすら終わらないうちに新しいバージ ョンの作成が可能になったことが最大のウ ろリーダーを名乗るくらいだから , Turbo C 十十ごときて、浮かれているわけにはいかな -PO リて、した。 Resource Workshop など充実し ョンが出てしまうかもしれなし た周辺ツール群をはじめとするすべての機 というわけて、 , IBM-AT とそのコンパチ くなった。かくして , BorIand C 十十 2 . 0 Fig. 2 米国版 Bo 日 and C 十十 Ver. 3.0 のノヾッケージ構成 Fig. 1 米国版 BO 日 and C 十十 Ver. 3.0 のバッケージ ・マニュアル類 BorIand C 十十 3 ℃ User's guide BorIand C 十十 3 ℃ Programmers' guide BorIand C 十十 3 ℃ Library reference Borland C 十十 3.0 Tools & utilities uide Borland C 十十 uick reference booflet Resource wo 「 k op user' s guide ObjectWindows fO 「 C 十十 user' s uide TurbO vision fo 「 C 十十 user' s gui e TurbO debugger 3 ℃ user' s gulde TurbO profiler 2.0 user' s gulde TurbO assembler 3 ℃ user s guide TurbO assembler 3.0 quick reference guide ・フロッピーティスク [ 5 インチティスク ] [ 3.5 インチティスク ] BC 十十 Ver. 3.0 爪 STAL 羽 ON ティスク BC 十十 Ver. 3.0 INSTALLATION ディスク BC 十十 Ve 「 . 3 ℃ No. 2 ティスク BC 十十 Ver. 3 ℃ No. 2 ティスク BC 十十 Ver. 3.0 No. 3 ティスク BC 十十 Ver. 3.0 No. 3 ティスク BC 十十 Ve 「 . 3 ℃ No. 4 ティスク BC 十十 Ver. 3 ℃ No. 4 ティスク BC 十十 Ver. 3.0 No. 5 ティスク BC 十十 Ver. 3 ℃ No. 5 ティスク BC 十十 Ver. 3 ℃ No. 6 ティスク BC 十十 Ver. 3.0 No. 6 ティスク BC 十十 Ver. 3.0 No. 7 ティスク BC 十十 Ver. 3 ℃ No. 7 ティスク BC 十十 Ver. 3 ℃ No. 8 ティスク BC 十十 Ve 「 . 3.0 No. 8 ティスク BC 十十 Ver. 3.0 No. 9 テゴスク BC 十十 Ver. 3 ℃ No. 9 テゴスク BC 十十 Ver. 3 ℃ No. 10 ァイスク BC 十十 Ver. 3 ℃ No. 10 ァイスク BC 十十 Ver. 3.0 No. 11 ティスク BC 十十 Ver. 3 ℃ No. 12 ティスク BORLÅND C + + &APPUCATIONFRAÅAEVORKS FREE 34 C MAGAZINE 1992 4

7. 月刊 C MAGAZINE 1992年4月号

ヒシ感じてやまないのて、あります。あんな , 画面上に何色のどんな箱を表示するとか , そんな空しい枝葉末節のことて , 膨大なコ ードとドキュメントが作られ , 提供される なんて・・・・・・。暖冬も相まって , だるくて , 眠いて、すわ。 そらあ , 私にだって経験ありまっせ。ュ ーザインタフェイスをちょっとこぎれいに しようとすると , もう , コード量も , プロ グラミングの時間も , 相当大きな比重てそ っちへ取られてしまいまっせ。ユーザイン タフェイスといっても , 単に体裁とか形式 という面と , プログラムの機能本質にかか わる部分と , 二つに分かれると思うけど , 今言っているのは ( そして今世間が騒がしい のは ) もつばら前者の方や。て、 , そういう体 裁とか形式とかは , ごく単純なもんて、 OK , という課題が結構多いのてす。 車だって , 車種や年式はどーてもええ , 洗車もろくにせん , しかし仕事の機材運ん だりするのに毎日必要だから , 「車はゴム草 履を履く感覚て乗る」と言えるレベルに達し Fig. 1 ARM 3.1 による「定義」例 int a , C 言語フォーラム 135 て , やっと本物の車乗りと言えるんじゃな いの。まあ , ゴム草履ても , つつかけても , ビーチサンダルて、も , 下駄ても , なんて、も ええけどね。日曜日の半日を車磨きに費や し , やれ BMW, やれミニのと言ってる間 は , しよせん日本人は世界のイナカモンよ。 これと似て , コンヒ。ュータの画面を 1950 年代のハリウッド映画のタイトルバックみ たいなもんにすることにウッツを抜かす今 日は , コンピューティングの超幼稚時代と 言えるてしよう。そういえば当時は , 総天 然色 ~ 総天然色映画〃なんて日本語がありま したな。今はカラー ~ カラー映画〃としか 言わんようてすが。 馬鹿が「車はユーザインタフェイスが統一 されている」などとよく言うけど , あんなも ん , ユーザインタフェイスを統一しようと して統一されたんとちゃいまんがな。だか ら , 技術開発として , 順序が逆や , と私は 言いたいのてす。 もっと高度な , 情報化時代の主役たりう るパーソナルコンピュータの機能性の方を , / * イニシャライサがある * / extern const C = 1 int f(int x) {return x 十 a : } / * 関数本体がある * / st 「 uct s{int a : int b : } : enum{up, down} : Fig. 2 ARM 3.1 による「宣言」例 extern int a , extern const C , int f(int) : struct S を typedef int lnt . / * 関数プロトタイプ * / (df2) (df3 ) (df5) (dcl ) (dc2) (dc4) (dc5) 先に追究していただきたい。インタフェイ スの構造や形式は , そっから勝手に決まっ てくるものてありたい static な データメンバに関するドジ さて , 指のウォーミングアップもそろそ ろ良さそうなのて , 今回の本論に入りまし よう。まず , ドジのきっかけから・・ class f00 { static int bar 上のように , static なメンノヾデータのある クラスが , 某アプリケーションの . h ファイ ルに宣言されていました。 そして , TurboC 十十ては , この宣言が どうやら定義としても機能したらしく , 上 のデータメンバの宣言があるだけて , bar の 名て、参照てきる変数がメモリのどこかに確 保され , すなわち bar を参照しているコード は , 工ラーもウォーニングも出さずに , 無 事にコンパイルされます。 ところが , 同じコードが , BorIand C 十十 てコンパイルすると , リンカの未定義シン ポルエラーが出るのてす。 TLINK の前の版 ても試してみましたから , この点に関して リンカが変わったのてはありません。コン パイラが変わったのてす。私はてつきり最 初 , 「わーい , BorIandC 十十にバグがある ー ! 」と思ってしまいました。 ても , 後ていろいろ勉強した結果 , コン パイラのバグてはなくソースコードのバグ ( 十 TurboC 十十のバグ ) だという点が判明 したのてす。 つまりそのアプリケーションの , どの . c ファイルにも . cpp ファイル ( とくに , クラス f00 のメンバ関数等を実装しているファイル ) static int f00 bar という変数定義が存在しなかったのてす。 それても , Turbo C 十十ては無事コンパイ ルされたのてす。

8. 月刊 C MAGAZINE 1992年4月号

C プログラマための・ というような手順を踏んて、います。 TINY モ 埋め込むためのインライン関数て、 Turbo K コマンドて、リンクする必要があります。 デルて、は C 十十 1.0 て、は disable, enable が emit Turb0 C 十十 1 .0 用 関数を使用して #define マクロて定義されて DS=SS=CS という条件が必要なため , このような手順 Turbo C 十十 1 . 0 用の非常駐デバイスド います。 ライバのテンプレート (devsmptp. c) を付録 デバイスへッダの sde ⅶ ead 関数て、重要な になります。 なお , 割り込みルーチンて、は auto 変数を ディスクに収録します。 ことはスタックフレームを生成しないよう にすることて、す。スタックフレームを生成 使用していないことに注意してください 基本的には devsmpt2. c と同じて、すが , 割 り込みルーチン (inthdl) に saveregs 修飾子 ローカルスタックを設定するため , auto 変 すると 数にアクセスて、きなくなるのて、 , DS レジス を指定しています。これを指定すると戻り push 値以外のすべてのレジスタを保存するコー タて、アクセスする static 変数を使用します。 bp, sp mov ードが , 関数の先頭に生成される ドが生成されます ( void 型の関数ては全レジ というコ また , スタートアップルーチンが実行され スタが保存される ) 。したがって , インライ ためデバイスへッダを先頭にもってくるこ ないため , static 変数の初期値が 0 以外の値 ンアセンプリ言語て明示的に保存する必要 とがて、きなくなります。これを回避するに を持つ可能性があることに注意してくださ い。初期値を仮定する場合は明示的に初期 がありません。そのぶん , devsmpt2. c に比 は , コンパイルスイッチとして -k- を指定し 値を設定しておく必要があります。 べ , スッキリします。 ます。 ・初期設定ルーチン (init) ・ストラテジルーチン (strategy) 実は , Turbo C 2.0 て、も ストラテジルーチンはリクエストヘッダ 初期設定ルーチンはタイトルを表示して , #pragma saveregs て、 huge 関数の全レジスタを保存するコード 前述したプロックデバイス・ユニット数・ のアドレスをセットするだけて、す。 far リタ が生成されるはずなのて、すが , アセンプリ フリーメモリ開始アドレスを設定し , デバ ーンする必要があるため , far 型の関数とし リストを見るとうまくいっていなかったた イスドライバの組み込みを取りやめている て記述します。 ・割り込みルーチン ( inthdl) め ,devsmpt2. c て、はインラインアセンプリ だけて、す。実際のプログラムて、はこの関数 言語て、記述しました。 の最初に処理を記述していくことになりま 割り込みルーチンも far 型の関数として記 ・コンバイル 述します。 す。 コンパイルは Fig. 2 のように行います。 割り込みルーチンがローカルスタックを 初期設定ルーチンしか実行しないため , devsmptp. c はインラインアセンプリ言語を 設定して初期設定ルーチンを呼び出してい 最初の関数テープル 使用していませんが , スイッチー B が必要て、 void ( * functbl[ ] ) (void) るため , auto 変数も使用可能てす。 す。スイッチ -B を指定しないとデバイスへ dos cputs 関数は Turb0 C の cputs 関数が は不要てすが , 本来の常駐するデバイスド ッダ (sdevhead) の strategy と inthdl の参照 機種依存するため作成したものて、す。また , ライバを記述する際の参考にもなるように がうまく解決されません。 最後の 記述しました。 ①最初に全レジスタを退避する int errno , MS-C 6.0 用 はリンクエラーを解消するために定義して ② DS= CS MS-C 6.0 用の非常駐デバイスドライバの ③ローカルスタックを設定する いるだけて、す。 ・コンバイル ④各コマンドの実行 ( ここて、は初期設定ル テンプレート (devsmpm. c) を付録ディスク コンパイルは Fig. 1 のように行います。 T に収録します。 ーチンのみ実行 ) ⑤スタックポインタを元に戻す CC コマンドて、リンクするとスタートアップ はっきりいって MS ー C 6.0 てはデバイスへ ッダを先頭にもってくることがてきないた ⑥全レジスタを元に戻す ルーチンが最初にリンクされるため , TLIN Fig. 2 Turbo C 十十 1.0 用コンバイル・リンク Fig. 1 Tu 「 bo C 2.0 用コンバイル・リンク tcc -c -B -w -mt -k- -zPDGROUP devsmptp. c tcc -c -B -w -mt -k- -zPDGROUP devsmpt2. c tlink devsmptp, devsmptp. sys/t, /c, %TC%*L 旧 tlink devsmpt2, devsmpt2. sys/t, /c, %TC%*L 旧 新 MS-DOS プログラミング入門 93

9. 月刊 C MAGAZINE 1992年4月号

2 盟灯第一一 、 : : ヨ洋立朝三 teps 恥ロ . 印「 1 新 0 ー Fig. 4 Turbo C 十十 for Windows の画面 Windows 開発環境の ノヾワーアップ Hel File Edit Search Run Compile Project B 「 0 e Qptions Wlndow Windows IDE BC 十十 3.0 の発売とほば同時に , Turbo C 十十 for Windows ( 以下 TCW) が発売さ れました。すて、に Turbo Pascal for Wind ows は市場に出回っていましたが , その C 十十 版といった趣て、す。これが , BC 十十 3.0 のパ ッケージにも含まれます (Fig. 4 ) 。 従来の tc. exe を Windows に対応させたと いうことて、すから , こちらには高度なオプ ティマイズはありません。しかし , bc. exe て、 サポートされた AT & T C 十十 2.1 相当の仕 様や Template は , tcw. exe て、も実装されて 0 tcw. exe< は , もちろん Windows アプリケ ーション , Windows DLL の作成がて、きま す。 Windows の環境の中て、 Windows アプリ を作るというのは , 実に正しく , 気持ちの よいものて、す。 Windows 専用のコンパイラて、すから , D OS 版アプリケーションの作成はて、きませ ん。て、きても意味がないて、しよう。 tcw. exe は , Windows のエンハンストモー ドて、動作します。ヘルプには , WinHeIp 形 式のヘルプファイルが提供されています (F ig. 5 ) 。 4.7M バイトもある巨大なヘルプフ ァイルの中には , WindowsAPI のヘルプも は何かと訊ねれば , やはりクラス階層の視 ウも同じだし , 工デイタのキーアサインだ 含まれています。相変わらず印刷された W って同じ。いや , 同じものを選択て、きると 覚的表示しかないて、しよう。 こいつは , は indows API のドキュメントはついてきませ っきりいって便利て、す。もうこれなして、は いうほうが正確か。 んが , これて、なんとかしのぐことはて、きそ このことも手伝ってか , tcw. exe は , Win やっていけません。 うて、す。しかしそうはいっても , やはり印 プラウザがあると , 既存のクラスライプ d 。 ws 環境版コンパイラへ移行する敷居を非 刷されたドキュメントがほしいところてす。 常に低くすることに成功したといえます。 ラリを利用する場合に容易に全体像をつか オンラインドキュメントは , 一種のハイバ むことがて、きます。それだけてなく , 大規 心配していたコンパイル速度も , bc. exe には ーテキストて、すから便利なことは便利なの 若干劣る気がしますが , 十分に速く , 実用 模なアプリケーションになってくると自分 てすが , コンヒ。ュータがないところて、は読 て設計したクラスの階層が入り組んて、きて , には何の問題も感じません。 めないのて。 なんとかすっきりと眺められたらなあ , と 実際に tcw. exe を使ってみると ,DOS 版の . じ、ったことがありませんか ? この願いは , 環境版コンパイラとほとんど違和感なく使 さて , Windows というグラフィカルな環 tcw. exe の、、 Browser ー CIasses" メニューカま あっさりとかなえてくれます。 td. exe にもプ えることに気づきます。 Project のウインド 境においてこそ威力を発揮するもの。それ 0 写 3 5 ( 0 ・介収 Z•A 0 れ 物物物物 VA END Fig. 5 WinHelp 形式のヘルプファイル比較 ・ WinHe ゆ形式のヘルプファイル ( TCW. EXE 用 ) 4696322 Mon Nov 1 1 03 : 00 . 00 51795 Mon Nov 11 03 : 00 . 00 880970 Mon Nov 1 1 03 : 00 : 00 ・従来の形式のヘルプファイル (BC. EXE 用 ) 330455 Mon Nov 1 1 03 : 00 : 00 1991 owlhelp. tch 2409882 Mon Nov 1 1 03 : 00 : 00 1991 tchelp. tch 533048 Mon Nov 1 1 03 : 00 : 00 1 991 tvchelp. tch tcwhelp. hlp 1 991 winsight. hlp 1 991 1 991 workhelp. hlp プラウサ 1 速報 米国版 Bo and C 十十 Ver. 3.0 & Application Frameworks 39

10. 月刊 C MAGAZINE 1992年4月号

Table 1 爪灯コマンドのリクエストヘッダ 常駐しないテパイスドライバの原理 デバイスドライバの INIT コマンド ( コマン ド番号 = 0 ) のリクエストヘッダは TabIe 1 の ようになっています。 [ 十 18 ~ 十 21 ] により CONFIG. SYS の de ⅵ ce = の後の文字を指すポインタが渡されま す。したがって , CONFIG. SYS て、指定され たオプションスイッチを調べられます。 [ 十 14 ~ 十 17 ] は INIT ルーチンが処理の終 十 14 ~ 十 1 7 わりて、セットします。 DOS はこのアドレス て指定された部分まて、を常駐させて残りを 十 1 8 ~ 十 21 こて、 , デバイスドライバ 切り捨てます。 の組み込みを取り止めるためには ①デバイスへッダのデバイス属性 (TabIe 2 ) [ 十 4 ~ 十 5 ] ビット 15 = 0 ( プロックデ バイス ) ②リクエストヘッダのユニット数 (Table 1 ) フセットアドレ 十 3 ~ 十 4 十 0 十 5 ~ 十 12 十 22 十 1 3 内 ル時 コ コマンド番号 レコード長 ( リクエストヘッダのバイト数 ) ( プロックデバイスのみ ) 最初のユニット番号 ( DOS 3.0 以降 ) すポインタ CON 日 G. SYS の DE Ⅵ CE = の後の文字を指 ステータス 容 リ タ ン 時 ユニット数 ( プロックテパイスのみ ) テパイスドライバ占有最終アドレス ( フリーメモリ開始アドレス ) BPB 配列に対するポインタ ( プロックテパイスのみ ) TabIe 2 テパイスへッダ キャラクタテパイス ピット 6 ビット 1 1 ピット 1 2 ピット 1 3 ピット 1 4 ビット 1 5 十 4 ~ 十 5 十 0 ~ 十 3 オフセットアドレス 内 容 [ + 13 ] = 0 をキャンセルするというのはそれなりに納 ユニット数が 0 のプロックデバイスて、常駐 ②または③だけて、よさそうて、す ) メントとオフセットを設定 ( 実際は①と [ 十 14 ~ 十 17 ] = デバイスへッダのセグ ドレス (TabIe 1 ) ③リクエストヘッダのフリーメモリ開始ア DOS ファンクション 25h ( キャラクタ入出力 ) DOS ファンクション 01h—0Ch ただし , INIT ルーチンて、は 得て、きる仕様て、しよう。 92 C M AGAZIN E 1992 4 が , 実際はこれ以外にも使用て、きる DOS フ の条件は参考文献 [ 2 ] に記載されています などの関数を用いる必要がありますにれら putch, getch, cputs, cgets は , のみが使用可能なため , キー入力と表示に ( 割り込みべクタの取得 ) DOS ファンクション 35h (MS-DOS のバージョン番号の取得 ) DOS ファンクション 30h ( 割り込みべクタの設定 ) の場合 ピット 5 , ピット ビット ビット 十 6 ~ 十 7 十 8 ~ 十 9 7 ~ 10 4 3 0 十 1 0 ~ 十 1 7 次のテパイスへのポインタ テパイス属性 = 0 : プロックテパイス = 1 : キャラクタテパイス IOCTLE ット プロックテパイスの場合は先頭のバイトがユニット数を表す キャラクタデバイスファイル名 デバイス割り込み工ントリーポイントのポインタ テパイスストラテジェントリーポイントのポインタ カレント標準入力テパイス カレント標準出力テパイス カレント NUL テパイス カレント CLOCK デバイス 特殊デバイス 予約域 ( 0 であること ) V3.2 ビット OPEN/CLOSE/RM サポート 予約域 ( 0 であること ) キャラクタデバイスの場合 OUTPUT UNTIL BUSY プロックテパイスの場合 NON FAT アンクションがあるようて、す ) 。 非常駐テパイス ドライバのテンプレート 常駐しないデバイスドライバの手法はコ ンパイラにより , 手順が異なるためひとっ Turbo C 2.0 用の非常駐デバイスドライ Turbo C 2.0 用 ずつ説明していきます。 バのテンプレート (devsmpt2. c) を付録ディ スクに収録します (Turbo C 十十 1.0 にも適 用可能て、す ) 。 ・テパイスへッダ (sdevhead) CONFIG. SYS て、登録するデバイスドライ バて , 最重要事項はデバイスへッダ (TabIe 2 ) を先頭にもってくることて、す。このため emit 関数を使用します。 void emit ( argl, arg2, emit ー関数は数値をコードとして直接