國囚圖 CMAGAZ 爪 E 広告資料請求カードをご利用下さい くめ 。たりしたノ「、、 ノ力しスペ ース ソフトウェアテサインエンジニア ☆システム製品・・ MS-DOS 、 Windows 、 WindowsNT 、 LAN 上記のソフトウェアデザインエンジニアの仕事内容に関し、以下 ① ~ ⑥何れかに該当するエンジニアを求めます。 マネージャー等。 ☆アプリケーション製品・・・ MS ー DOS または Windows 用アプリ ① C 、 C + + 、 8086 系アセンプラのプログラミング経験がある方。 ケーションソフトウェアの開発 ( ExceI 、 Works 、 Word 等 ) 。 ② MS-DOS 、 Windows 、 OS/2 、 UNIX 、何れかの知識経験 がある方。 ☆言語製品の開発・・・ MS ー DOS または Windows 用アプリケー ③ Windows 用アプリケーションの開発に経験がある方。 ションソフトウェアの開発環境の提供 ( C 、 MASM 、 FORTRAN 、 ④メインフレーム関連の通信システムの知識経験がある方。 BASIC 、 QuickC 、 QuickBASIC 、 VisuaIBasic 、 Quick for ⑤ RDBMS ( リレーショナルデータベース管理システム ) の知識 Windows 等 )。 経験がある方。 ⑥ネットワークの構築運用に関する知識がある方。 *SNA 関連・ SQL 関連。 以下のエンジニアも同時募集しています。お気軽にお問い合わせください。 ☆製品の工程管理や仕様の決定、開発プロジェクトの管理、海外 ☆各種ソフトウェアのペーパーマニュアル、オンラインマニュアル、学 の開発プロジェクトとの調整等。 習ソフトの企画、編集、原稿作成、工程管理等。 ☆パーソナルコンピュータからネットワー久メインフレームを含んた ☆ソフトウェア開発における品質管理全般、テストプラン立案並び トータルなシステムの提案及びコンサルテーション。 にスクリプトの開発、スケジュール管理、出荷基準のプランニン ☆パソコンメーカーに対する OS のライセンス及びパソコン開発に ☆当社の販売する製品 ( パーソナルコンピュータの各種ソフトウェ ついてのコンサルティング ア ) に関する技術サポート業務。顧客に対し、技術的及び実務的 ☆海外営業の経験者及びライセンスに関する知識がある方。 な問題解決のためのアドバイスをする仕事。 ■ ' 93 年 2 月中旬渋谷区笹塚に本社移転。 ☆サードバーティ ( ハードメーカー、ソフトメーカー等 ) への OS 製品 (Windows 、 Windows NT 、 MS-DOS 等 ) のサポート、 VAR 業 〒 151 渋谷区笹塚 1 ー 50 ー 1 笹塚 NA ビル ・ ' 94 年大学新卒者の採用を予定しております。 者への LAN Manager 等のネットワーク製品のサポート 【募集要項】・資格 / 各職種共に 22 歳 ~ 28 歳位迄■給与 / 経 【応募方法】希望職種明記の上、履歴書 ( 写真貼付 ) 及び職務経 歴書を下記宛郵送。書類選考の止、面接日等を連絡します。※応募 験、年齢、能力、現行給与を十分考慮の上、当社規定により優遇。 の秘密は厳守。※応募書類返却不可。※入社日相談に応じます。 ・勤務地 / 本社 ( 東京都新宿区 ) 、 SE ・ OEM 営業スタッスよ芝オフィ ス ( 東京都港区 ) 。ー待遇 / 昇給年 1 回、賞与年 2 回。ー勤務時間 / 〒 105 東京都港区芝 1 ー 11 ー 11 住友不動産芝ビル 応募宛先マイクロソフト株式会社 9 : 00 ~ 17 : 30 。フレックスタイム制 ( コアダアムは 11 : 00 ~ 15 : 00 ) 。 人事部人材開発課 C ②係谷 03 ( 5484 ) 1420 ・完全週休 2 日制。・他詳細は面談。 ・設立 / 1986 年 2 月 17 日・資本金 / 1 億円■売上高 / 126 億円 ( 1992 年 6 月 期 ) ・代表取締役会長 / 古川享、代表取締役社長 / 成毛真■社員数 / 368 名・米国本社 / マイクロソフト・コーポレーション ( ワシントン州レッドモンド ) く資料請求番号 006 〉 プロクラムマネージャ ユーサーエテコケーション ソフトウェアテスティンクエンジニア テクニカルサポートスタッフ S E ロ EM 営業スタッフ マロソフト株式会社 C MAGAZINE 1993 ・ 2
リ The + 基本中の基本て、す。ライプラリ中のすべて のコンテナクラスは , この Object の派生ク ラスを要素として保持するようになってい るのて、す。 もちろん String も Object の派生クラスて、あ り , だからこそ , なんの疑念もなく List に登 録することがてきたわけて、す。 SortEIem がそうて、あったように , Objec t はそれ自体て、はなにもて、きない , 空つばの 抽象クラスて、す。コンテナクラスの要素と なるべきインタフェイスの原型をこさえる のが目的なのて、す。 Object のメンバ関数は List 12 のようにな っています。さすがに抽象クラスの中の抽 象クラスというべきか , 空つば空つばとい うわりには , まさに五つもの純粋仮想関数 を抱え込んて、いるというご大尽ぶりて、す。 Object を継承したクラスが , インスタン スとして活躍て、きるようにするためには , これらの純粋仮想関数をすべてオーバライ ドしなくてはなりません。さっそく , ひと つ派生クラスを作ってみましよう。 List だと読み出しが降順になってしまいま が添付されていますし , また BC 十十 &AF List 13 は , 単純に int 値を 1 個保持するだ すが , 昇順がいいという場合は , List を Ar X などに添付されている , テキストべースの ray なり DoubleList なりに差し換えればいい けの可愛いクラス IntVaIue に乱数を収め , ウインドウアプリケーションを開発するた だけて、 , 実にささやかな変更て、済んて、しま めのライプラリ TurboVision もあります。 List に 100 個格納してから出力するという , いったいなにに使うのかわからないところ います。 しかし , これらのクラスライプラリはす が味わい深いプログラムて、すい また , コンテナクラス自身も Object の派 べて , 他ならぬこのコンテナクラスライプ , こては ,isA() も nameOf() も使ってい 生クラスとして作られているのて、 , 自分自 ラリをベースとして , その上に構築されて ません。ましてやハッシュ値など , めった 身もほかのコンテナクラスの要素になるこ いるのて、 , まずはそこをしつかり押さえて に御用もないてしよう。にもかかわらず , とがて、きます。つまり , リストのリストだ おくことが , TC 十十 /BC 十十のクラスライ いちいちオーバライドしなくてはならない プラリ活用の筋道て、あるといえます。 ろうと , 配列の配列だろうと , 必要とあら のは , めんどうに感じられるかもしれませ ばハッシュテープルの配列の双方向リスト 次回は , コンテナクラスライプラリを使 ん。確かに多少はめんどうなのて、すが , 「汎 のツリーだろうと , いかなる組み合わせも って , ある程度の規模を持ったプログラム 用性」という錦の御旗の前て、は , 多少の不便 好き勝手に実現することがて、きます。 を組みながら , その利用法についてもう少 はよしとしなくてはならないということて、 し突っ込んて、いきたいと思います。 しようか。 [ 注 ] して宣言されたデータ要素クラスは , ライ さて , かなりの駆け足て、コンテナクラス ライプラリのサワリを垣間見てきましたが , * 1 ここて、の引用は , C/C 十十ともどもオ プラリのほとんどのコンテナクラスに適用 TC 十十 /BC 十十のクラスライプラリは , ま リジナルのプログラムそのままて、はない することがてきます。 SortedArray のよう * 2 B. W. Kernighan, D. M. Ritchie 著「 Th に , 要素として SortabIe の派生クラスを要求 だまだこれだけてはありません。 e C Programming languageJ したりするコンテナクラスもありますが , Turbo C 十十 for Windows には , Objec * 3 TC 十十 / BC 十十て、は , 実際には ostre ごく一部の例外を除くと , あとは List だろう tWindows という Windows アプリケーショ が Array だろうがなんて、もござれて、す。 ン開発を支援するためのクラスライプラリ am withassign クラス。 乱数を List に格納する List 1 : # i nc lude く s td ⅱ b. h > 2 : # i ncl ude <l i st. h> 4 : class IntValue 5 : pub ⅱ c : 6 : i nt va ー ue , 7 : 8 : IntVaI ue ( i n t の { val ue : v : } / / コンストラクタ 9 : classType isA() const { return -firstUserCIass; } char* nameOf() const { return "IntValue"; } int isEquaI (const Object& 0 ) const { return value / / とりあえず hashVaIueType hashValue() const { return value; } void print0n(ostream& 0 ) const { 0 くく value; } 19 : ma i n ( ) L i s t ⅱ s t : 22 : randomize() ; 23 : f or ( i n t i : 0 : i く 100 : i + + ) { 24 . list. add(*(nev IntValue(random(100 の ))): 25 : 26 : 28 : 29 . 30 : 32 : 33 : } public Object { ((IntValue&)o). value; } ListIterator iter(list); vh ⅱ e ( i ter ) { (iter + + ). print0n(cout); cout くく '\n' return 0 : 布石 C + + 入門講座 111
プログラミング言語はプログラムを書く ための言葉て、す。 私たちが普段使っている自然言語て、はあ いまいになってしまいがちな内容て、も , プ ログラミング言語て、はっきりと表現するこ とがて、きます。しかし , そのためにはプロ グラムを書く人が「はっきりと書く」ことを 意識しなくてはなりません。皆さんはこの ことをそれぞれ自分なりに考えてみてくだ 練題 初回から続いている「プログラミングの工 ッセンス」恒例の練習問題て、す。ここの問題 文はあいまいな部分を多く含んて、います。 皆さんはそのあいまいさを自分なりに解釈 して「はっきりと」解いてみてください 【応用 1 】 List 2 と List 3 では switch 文のはっ きりしない例を考えました。それでは , for 文 , while 文 , if 文のそれぞれについて似たよ うな例を作ってみてください。 【応用 2 】 List 4 と List 5 では構造体を使って 「はっきりさせる」方法を考えました。それ では共用体 ( union ) を使ったほうがよい例題 を考えてみてください。共用体を使わない とあいまいになる例と , 共用体を使っては っきりした点をまとめてください。 【調査】あなたがこれまでに書いたプログラ ムを調べて , 「はっきりしない」と思われる 部分をピックアップしてみましよう。それ はどのようにすれば「はっきりする」と思い ますか。 今戸のプログラム 今月のプログラムは , コンヒ。ュータの則 を離れるとき , ほかの人にキーポードをい じられないためのツール , LOCKEY ( ロッキ ー ) て、す。 120 C MAGAZINE 1993 2 A> LOCKEY 席をはずしています コマンドラインから , ちょっと用事があって席を立っときに と入力すると , 画面に , 席をはずしています という文字列が表示され続け , ほかの人は そのコンヒ。ュータを使えなくなります。席 に戻ってきて作業を再開するときには , 正 しくパスワードを入力してやればもとの DO S プロンプトに戻ってくれます。 キーポードをロックするツール LOCKEY のソースプログラムは本誌付録のディスク に含まれています。 対応コンパイラは LSIC-86 Ver. 3.30 試 食版て、 , MS-DOS が動作するすべてのマシ ンて、使用て、きると思います。提供ファイル をひとつのディレクトリに展開した後 , PC A> LOCKEY ラインから , ァイル LOCKEY. EXE がて、きます。 と実行すれば , そのディレクトリに実行フ A> MAKE という部分を削除して , -DPC98 ら MAKEFILE 中の , ー 9801 シリーズならそのまま , ほかの機種な コマンド ません。以降 , 正しいパスワードを入力す す。この状態になったら席を離れてかまい ます。この表示は 10 秒ごとに位置を変えま という文字と現在時刻が表示されると思い HELLO 力す消え , 二度同じパスワードが入力て、きたら , 画面 せるのは , タイプミスを検出するためて、す。 をもう一度入力してください。 2 回入力さ と表示されますから , 入力したパスワード Retype password . ると , ワードを入力してリターンを打ちます。す と表示されますのて、 , ( 自分の好きな ) パス Enter password と入力してみてください。画面に A > LOCKEY HELLO LOCKEY. EXE がて、きた後 , 試しに れます。 とだけ入力すると簡単な使用方法が表示さ るか , マシンをリセットしないかぎりこのコ ンヒ。ュータを使うことはて、きなくなります。 席に戻ったら , まず何かキー ( たとえばス ペースキー ) を一度叩きます。すると画面の 中央に , Enter password と表示されますから , 先ほどのパスワード を入力してください。正しく入力て、きると , DOS のプロンプトに戻ります。パスワード の入力はエコーバックされませんから , CA PS ロックの有無 , カナロックの有無にご注 意ください 関数 demo を修正すれば , キーポードがロ ックされている間 , 画面に表示されるもの を変更することがて、きます。皆さんはこの 関数を好きにいじって , 自分専用の LOCKE Y を作ってみてください このようなキーポードをロックするコマ ンドは UNIX て、は lock, X-window て、は X10 ck などと呼ばれています。 xlock て、はキーボ、 ードがロックされている間 , 画面にきれい なグラフィックスが表示されます。 今月は本連載のまとめを行いました。 れまて、の連載のテーマを振り返り , すべて に共通していた「はっきりさせる」というこ とについて考えました。 プログラミングとは , あいまいて、混乱し た問題を明確にしていき , それをプログラ ムという形にはっきりと表現することのよ うて、す。プログラミングの工ッセンス 本質ーーーは , 「はっきりさせる」ことにある のかもしれません。 さて , まとめをしてしまいました。次回 の最終回は何をしましようか。この連載の 第 1 回は「繰り返し」がテーマて、した。最終回 は「再帰という名の繰り返し」というテーマ て、お届けします。プログラミングの工ッセ ンスは「繰り返し」というテーマを繰り返し て結びに至るのて、す。 それて、は , また来月。
リニアな配列への単純書き込みプログラムの実行時間 TabIe 4 char 配列 long 配列 TabIe 3 文字表示を多用するプログラムの実行時間 画面に表示 4.94 秒 NUL テパイスにリダイレクト 4.01 秒 5.54 秒 0.38 秒 MS-C MS-C 1 .44 秒 ( 3.79 倍 ) WATCOM C WATCOM C 十 RUN386 十 RUN386 数字はかかっているウェイト数を示してい 頻繁に BIOS などのコールを行うプログラム EXE386 Ver. 1 .00m まず , Dhrystone 1.1 を 50000 パスて、実行 る (Fig. 7 に内蔵増設メモリのマシンの結果 て、も同様て、ある。もし DOS などのコールを したときの所要時間 , およびオプジェクト 頻繁に行い , それが律速段階となっている を示したのて、参照してほしい ) 。 のサイズを Table 5 に示す。また , 文献 [ 1 ] プログラムの場合は極力 DOS コールを減ら メインメモリとプロテクトメモリの速度 すようなプログラミングを心掛けなければ の差を観察するためにリニアな char 配列へ て、使用したべンチマークプログラムの実行 単純書き込みを繰り返すプログラムを実行 ならない ( たとえば printf ( ) の繰り返しを sp 時間を計測した結果を TabIe 6 に示す。 DO したところ , TabIe 4 のような結果が得られ S 工クステンダは djgcc は g032 , それ以外は rintf( ) によりバッフアに溜めておくなど run386 に統一した ( 使用したオプションスイ し , 後て、まとめて puts ( ) するなど ) 。 た。確かにプロテクトメモリに書き込むと 遅くなるようて、ある。しかし , 32 ビット処 ッチは Table 7 に示す ) 。 プロテクトメモリの速度 WATCOM 新旧バージョン間て、の速度差 理をさせればさすがに高速て、 char 配列を 10n g 配列に変えた同様のプログラムを試してみ は , Dhrystone べンチマークて、は顕著に現れ プロテクトメモリの種類によってはアク ると , 遅いメモリといえども MS ー C て、の実行 たのだが , それ以外のべンチマークテスト セスがメインメモリよりも極端に時間がか 時間の 0.691 倍と処理速度比は逆転する。 および 486 最適化の効果がはっきり確認て、き かる場合がある。 DOS 工クステンダはロー ドするプログラムのコード / データをそのプ なかった。 3 ノヾフォーマンス比較 ロテクトメモリに置くのだから , 遅いメモ 最新の動向 リを使っている場合 , 実行速度は目に見え WATCOMC の生成するオプジェクトの て遅くなってしまう。これはハードウェア 実行速度をほかの 32 ビットコンパイラと比 の問題なのて、 , コンパイラや DOS 工クステ WATCO M テパッガ 較した。コンパイルオプションとして /4r を ンダて、は対処のしようがない。強いてあげ 本記事の脱稿直前に入った情報によると , つけ , 486 用最適化を行わせた結果も含めて れば , 速いプロテクトメモリと遅いプロテ ある。テスト環境は以下のとおりて、ある。 WATCOM C のマイナーチェンジバーショ クトメモリが混在している場合にはロード ンが本誌の発行される直後の ' 93 年 1 月末には アドレスを調節 ( EXE386 の一 a オプションや < ハードウェア > マシン PC-9801RA (Cx486/20MHz) DOS / 4G の参照する環境変数、、 DOS16M 〃な 発売されそうて、ある。 どにより指定 ) して速いほうから使われるよ これには日本語版のー ATCOM デバッガ 増設プロテクトメモリ 11M バイト うにすることが考えられる。 が付属している。 WATCOMi•バッガは 数値演算プロセッサなし 実は Fig. 6 は , 外部スロットにプロテクト WVIDEOW. EXE Windows 環境用 MS-DOS Ver. 3.30C < DOS 工クステンダ > WVIDEO. EXE それ以外のプラット メモリを増設したマシンにおいて試した結 果て、あるが , やはりメインメモリよりはか DOS/4G Ver. 1.8 ホーム用 の二本立てて、 , とくに WVIDEOW. EXE は W なり遅いことがわかる。カッコて、囲まれた g032 PC ー 9801 用 ver N indows 上て、動作しデバッグ情報を個別のウ 文字がいっぱい インドウて、表示て、きる機能を備えていると これらの 2 種類のデバッガは , 移植作業が 終わり次第 WATCOM CJ9.0 の登録ユーザ に無料て、配布されるそうて、あるから , この 記事が読まれるころには発送が始まってい るかもしれない 6.78 秒 ( 1 .22 倍 ) 2.77 秒 ( 0.691 倍 ) 6.01 秒 ( 1 .22 倍 ) Li st 3 ー 1 : #include く stdiO. h> ー 2 : main() : 0 ; i く 100 ; i + + ) { for (i printf("0123456789abcdefghijklmn 叩 qrstuvvxyzABCDEFGHlJKLMNOPQRSTUVWXYZ%r") : printf( ” 速報 WATCOM C / 386 」 9.0 73
だろう。 もっとも注意を要する変更点は , 構造体 のアラインメントの扱いに関するものて、あ る。 -zp オプションは , 構造体のアラインメ ントを調節するオプションて、 , たとえば -z p2 とすると構造体の各メンバのオフセット は必ず偶数番地となる。 バージョン J9.0 て、は , -zp2, -zp4, -zp8 を使うとき , 旧バージョンて、コンパイルし たオプジェクトと混合してリンクすると誤 動作する可能性があるため , 新コンパイラ によるリコンパイルが必要て、ある。 るためて、ある。 数の評価の仕方が新旧バージョン間て、異な に構造体が含まれる場合 , 非互換性が生ずるのは , その占有バイト 構造体のメンバ Table 1 指定した最適化オプション ンクが完了するが , 製品版て、はそうなって クロ定義しておけば問題なくコンパイル / リ halloc( ) は , 適当な場所て、 Fig. 4 のようにマ たとえば欠けている関数のひとって、ある ンクて、失敗するという奇妙なことが起きる。 て , コンパイルが通って安心していてもリ ライプラリには含まれていない。したがっ ュアルにも項目が設けられているのだが , れているし , ライプラリリファレンスマニ ファイルにはちゃんとプロトタイプ宣言さ g. 3 に示す。これらのうち大部分は , ヘッダ 欠けている関数のうち , おもなものを Fi め , 注意が必要て、ある。 あるが WATCOM C にない関数があるた 互換性はたしかに高い。ただし , MS-C には め , ほかの非 MS ー C 処理系と比べればソース MS ー C 指向の関数群が用意されているた 欠けている関数 MS ー C とのソースレベル互換性 ライフボ、一トによれば , malloc ( ) を使う ソースに書き換えれば near;* インタて、済む ところを , 上記のようなマクロて、対処すれ ば , わざわざ far あるいは huge ポインタを使 TabIe 2 単純関数呼び出し うコードが生成されてしまうため , ノヾフォ ーマンス低下を招くために , あえてリンク が通らないようにしているとのことて、ある。 MS ー C 互換性とコンパイラバフォーマンスの どちらを重く見るかということだろう。 C ソース int addl (int i) 「 eturn i 十 1 int f00 ( ) j : addl ( 20 ) ・ return ー , j : addl(j) ; コンバイル結果 djgcc MS-C @addl : ret lnc @f00 . 再帰呼び出し関数の例 ret call @add 1 call @addl mov ax, 20 addl : push ebp mov ebp, mOV eax, lnc eax leave ret f00 . push ebp mov ebp, push 20 call addl add esp, push eax call addl leave ret esp Cebp 十 8] 4 WATCOM C addl jmp addl call addl mov eax, 20 f00 「 et lnc eax List 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : } 1 int kakutani(unsigned int n) return 1 : if (n & I) { return kakutani(n + 1 + n * 2 ) : / * 3*n + 1 * / } e lse { return kakutani (n / 2 ) : List 2-(a) MS ー C によるアセンプリ出力 処理系 MS-C djgcc WATCOM C 最適化オプション /Ozax/G 「 ー 02 /omaxt @kakutani : $ 1 167 : 16 : $ L20001 : 18 : $ EX165 : push mov test shl add i nc jmp nop shr call POP ret 20 : 19 : 15 : 1 4 : 13 : 9 : 8 : 7 : 6 : 5 : 4 : 3 : 2 : 1 : ax, 1 $ EX165 si,ax 引 167 CX, ax ax, 1 ax, CX SHORT $ L20001 ax, 1 @kakutani S ー 〇最適なコード x ジャンプしない 3*n + 1 ( 8086 では最適なコード ) 70 C MAGAZINE 1 3 2
速報 WATCOM C / 386 J9.0 32 ピットコンバイラ WATCOM C / 386 J9.0 かリリ ースされた。 J9.0 では , 各種 DOS 工クステンダや Win - dows などのマルチプラットホーム開発環境のサポー ト , MS-C Ve 「 . 6.0 互換グラフィックライプラリの 追加など注目すべき機能か追加されている。とくに MS- C Ve 「 . 6.0 とのソースレベルでの互換性とコンバイ ラ自身の最適化機能を中心に紹介する。 べた結果については後て、述べる。 80486CPU 用最適化 はじめに WATCOM FORTRAN 77 / 386 との 386 固有のアーキテクチャに依存した最適 ミックスドランゲージ開発 WATCOM C / 386 J9.0 は , ( 株 ) ライフポ 化はもちろんのことだが , 特筆すべきはタ ートが日本語版を移植・販売している 8038 ーゲットが 486 マシンて、ある場合 , 486 のス 両コンパイラ間て、オプジェクトおよびラ 6 / 80486 専用 32 ビットコンパイラて、ある。 カラ機能を利用するオプティマイズを行う イプラリの互換性が保たれていて , メモリ すて、に本誌て、も参考文献 [ 1 ] において前 ことて、ある。 管理方法も統一されているため , FORTR 版の Ver. 8.5 が紹介されているのて、 , 本稿 Cx486DLC を換装した PC ー 9801 にて 2400 AN プログラムからの C 関数呼び出しやその においては , DOS 工クステンダ DOS / 4G の 行ほどの C ソースについて 486 用オプジェク 逆を行うことがてきる。 解説など旧バージョンと重複する部分につ トと 386 用オプジェクトの比較を行ってみた 386 { DOS-Extender(RUN386)ij いてはそちらを参照していただくとして , が , 逆アセンプリ出力はかなり異なってい 使用可能 前回詳しく述べられなかった点 ( 今回はと るのだが実行時間には有為な差は生じず , オプジェクトサイズもほば同じて、あった。 くに最適化性能について詳しくチェックし Rational Systems 社の DOS 工クステンダ てみた ) , 新しい特長に重点を置いて述べる 後述のべンチマークテストの項て、も 486 最適 DOS/4G 以外に , Pharlap Software 社の D ことにする。 化についての比較を行っているのて、参照し OS 工クステンダ、、 RUN386 クも正式に使用 なお , 本稿て、は MS-C は Microsoft C Ve ていただきたい 可能となった。このコンパイル時のオプシ r. 6.0 を , djgcc は djgcc 1.08 (based on g ョンに、、 /l=pharlap" を加えると RUN386 M S - C とのソースレベル互換性 cc 2.2.2 ) を , WATCOM C はとくに断わら 用のオプジェクトコードが生成される。後 後述するように , 「完全互換」て、はなく , ないかぎり WATCOM C / 386 J9.0 を表す。 に示すべンチマークテストからもわかると 「 32 ビットコンパイラとしてのパフォーマン おり , この RUN386 を DOS ェクステンダと 特徴 スを尊重しつつ MS ー C との互換性を重視した して使ったほうが高速て、ある。 設計」となっている。これは Ver. 8.5 からも ただし , IM バイト以下のリアルモードと の共通メモリの扱いが両者て、異なることに 區われていたのだが , 当時はグラフィック 高度な最適化 注意を要する。 DOS/4G の場合は DOS 工ク ライプラリが付属していなかった。今回 V 386 固有の命令や 32 ビットのリニアアドレ er. J9.0 になり , FMR 版を除き MS-C と同様 ステンダが設定するデフォルトセグメント なグラフィックライプラリが付属するよう ッシングによってプロセッサの性能を効率 のオフセット 0 から 0xFFFFF まて、がそのま よく引き出す高速なコードを生成する。 まリアルモードと共通な物理アドレスに対 になった れについては後て詳述する。 応しているのて、 , たとえばオフセットを 0x また MS ー C と同様な漢字関数も用意されて いる。実際の互換性がどの程度なものか調 A0000 とすればテキスト VRAM 先頭にアク ニ 11 ロ 68 C MAGAZINE 1993 2
歩ア経 進工発 おウ開し なトの開 今フ公 ルソを 一ク 持リ e こる「ク トテ ュけソ植 のづ信移 っ通と 多しの緯 通信ソフト「 WTERM 」開発記 H. ヨ NOU E(NIFTY-Serve FGALWT SYSOP) フト「 WWIVTERM(*I) 」て、した。そこて、早 ータ系の雑誌などの付録に収録さ コンピュ れるなどされており , 現在ューザ数がどれ 速 , 当時ソース ( PascaI) つきて、公開されて WTERM とは !! くらいいらっしやるか把握て、きない状況て、 いた「 WWIVTERM 」を大手 NET からダウ ンロードしました。今のようなフリーソフ すが , 非常にたくさんの方々に使っていた WTERM とは , パソコン通信上て、開発 , だいているようて、す。 トウェアなどという言葉もなく , 全部 PDS 配布されているフリーソフトウェアの通信 市販ソフトと違い , ある意味て、 , 作りつ という名て、呼ばれていたころて、す。前記の ソフトて、す。 ばなしのソフトウェアて、したが , こまて、 ように数万円もする市販通信ソフトと比較 現在 , NECPC-9801/EPSON 用 , 富士通 発展することがて、きたことを , ありがたく して , この通信ソフトは無料。もし使いも FMR/TOWNS 用 ,パナソニックパナコム のにならなくてもそこは単純な算盤勘定て、 用 , 東芝 J ー 3100 ダイナブック / J3300 用 , 沖 思います。 損はしないと軽い気持ちて、ダウンロードし 電気 IF800 用 , NTT BS20 / 21 用 , IBM A WTERM の始まり たのが最初て、した。 T 用 , IBM/ 互換機 DOS/V 用などの各機種 市販ソフトと違い「 WWIVTERM 」に 専用版が発表されています。 は , インストールプログラムのような便利 開発者は , H. INOUE&TOMTOM て、す。 パソコン通信というものに興味を持ち , なものはついていませんが , 最低限の知識 ふたりとも , 趣味て、始めたパソコン通信て、 実際にアクセスを始めたころは , 市販品の したが , その道具となる通信ソフトて、使い 通信ソフトを使用していましたが , 個人的 と機材 ( モデムなど ) があれば使用て、きるよ には , 市販品て、はいろいろ不便な点が多く , 勝手のいいものがなく , 試行錯誤て、自作し うになっていました。 さて , あまり ( まったくといったほうが正 不満を感じていました。 ているうちに , 皆さんの評価 , 意見を得て , また市販品て、ある以上 , 完全なサポート 解だったかもしれません ) 期待もせずに使っ 徐々に改良を加え現在に至っています。 を期待 ( 予測 ) してはいましたが , 初心者に てみると , 開発者が実際にパソコン通信を 素人が作っているソフトて、すが , 日ごろ , は難解な部分も多く , 質問しても満足な回 行っている人だけあって , 発想が柔軟て , パソコン通信をする人間が開発しているた 答が得られないことが多々ありました。当 痒いところに手が届くというのは , このこ め , 市販ソフトとはまた別の角度から開発 時 , 市販通信ソフトの価格といえば , 1 万 ~ 2 となのかもしれないと思いました。 および研究することがてき , それがこの W 万円 ( 実売 ) て、した。今のソフトほど立派な いろいろ市販ソフトて、不満があった点な TERM の特徴にもなっています。 マニュアルがつくほどて、はないにせよ , 最 昨今て、は , 熱心に協力してくださる方々 どがカバーされているてはありませんか。 低申し訳程度の説明書がついていましたが , 「こんな便利な通信ソフトが無料 ! 」と愕然 が増えて , いろいろな角度から意見もいた 使い勝手の悪いソフトが多かったのも事実 としてしまいました。値段だけが , 優劣を だき , 手軽にパソコン通信が楽しめるよう て、す。 判断する決め手て、ないことはわかっていま なソフトになってきました。現在 , 大手 NE そんなときに出会ったのが , パソコン通 す。しかし , 無料のソフトと当時の市販ソ T を始めとする全国のパソコン通信のホスト フトとの性能的な違いは僅差だと思いまし 信上て、公開 , 配布されていたフリー通信ソ に登録され , また , 専用の解説書の出版や , 特別記事通信ソフト「 WTERM 」開発記 145
ー新 MS - DOS プログラミング入門 C プログラマのための 抜粋を List 1 に示します ( 実際のパイプ起動 TabIe 4 グラフィック VRAM ページ切り換え ユーティリティ pipe. c は , プログラムが大き ポート / アドレス 入出力 いために付録ディスクに収録しました。 な A6h 00h お掲載した List 1 は , アルゴリズムの簡単な pipemain. c の抜粋て、す ) 。 本ユーティリティは DOS ファンクション 3Fh(Table 1 ) リードハンドル DOS ファンクション 40h (TabIe 2 ) ライトハンドル をトラップしています。 DOS ファンクション 3Fh て、は標準入力ファ イルハンドル 0 を監視し , DOS ファンクショ ン 40h て、は標準出力ファイルハンドル 1 を監 視します。そして , DOS ファンクション 40 h て、は DS : DX 十 O&CX—I のデータをメモリ ( メインメモリ , EMS メモ リ , グラフィック VRAM) に転送し , また , が , 現在て、は 2 ページ積んて、いるマシンが標 どを参照してください。 EMS のバージョン DOS ファンクション 3Fh て、はメモリから 準て、す。そのため , グラフィック VRAM は は 4.0 て、プログラムしています。 DS : DX 十 O&CX—I の領域に転送します。このようにすれば標 96K バイト x2 の容量となります。 入力用と出力用としてふたつの EMM ハン 準入出力をメモリにリダイレクトした感じ ドルを確保して , 標準入出力のバッファリ なお , ングを行っています。 になります。 E0000h&E7FFFh 残りの処理はリストを見てもらえればわ 今回のポイントは の領域にも拡張グラフィック VRAM を 2 ペー EMM ファンクション 24 (Table 3 ) ジ ( 32K バイト x2 ) 持っているのて、すが , 今 かると思いますが , 以下に簡単に補足しま メモリ領域の移動 回は使用していません。そのため , 筆者の す。 て、す。このファンクションを使用して PC-9801VM ( V30 ) て、も動作します。 バイプ処理バッフア . 標準出力 グラフィック VRAM のページ切り換えは → EMS メモリ メインメモリ EMS メモリ→標準入力 TabIe 4 のようになっており , Fig. 4 のよう far ヒープから入力用と出力用のバッファ という転送を行っています。このファンク に交互に切り換えて使用しています。 ションは初期の EMM ドライバて、はほとんど を獲得して , 標準入出力のバッファリング グラフィック画面の表示を停止していま を行っています。メインメモリを使用する のものが誤動作していましたが , 最近の EM せんから , イネープルになっているとバッ M ドライバて、はまともに動作するようにな と起動するコマンドに渡せるメモリが少な クグラウンドがカラフルになります。 くなるため実用性は低いのて、すが , プログ っています。 今回のような用途て、は非常に便利なファ ラムの原理はもっとも簡単て、す。 ンクションて、す。 とくに難しい点はないと思いますから , 今回はパイプ機能高速化の一例を紹介し 説明は省略します。 バイプ処理バッファ : 。たいしたプログラムて、はありませ グラフィック VRAM バイプ処理バッファ : んが , パイプ機能を RAM ディスク上て、速度 EMS メモリ を比較しても今回作成したユーティリティ PC ー 9801 シリーズて、は のほうが少しだけ高速に動作します。 EMS の一般的なプログラミング法に関し A8000hA-•BFFFFh ドディスク上やフロッヒ。ーディスク上て、比 ては説明すると長くなるため , 参考文献 [ 2 ] の領域にグラフィック VRAM を持っていま 較すれば速度差が体感て、きるて、しよう。 す。初期のマシンては 1 ページだけて、した ( 付録ディスク収録 BUNKEN. TXT 参照 ) な グラフィック VRAM ページ # 0 グラフィック VRAM ページ # 1 グラフィック画面の表示開始 グラフィック画面の表示停止 カ カ カカ 出出出出 01h A6h ODh A2 h OCh A2 h 4 グラフィック VRAM のページ切り換え Fig. # 0 標準 出力 準カ 標入 # 0 標準 出力 まとめ 新 MS-DOS プログラミング入門 103
TEC ′ 0 ′ ma 財 0 System Co ゆ . WDK : 三 B 恤 p %mole Aopiicatio 「ーロ 印新 プログラムマネージャ -[WOKJ こ法気旧ラ多イルのオプシ。 , ン⑩ ウインドウヘルブ , 、目 . 仙 Example を朝い 5 States 釦「 e MYPAL MENIJ DEMO Ⅷ click ⅲ旧前日 ( fo 「 a rrenu Pattern 当 ね wa 「 e ど MUL T IPAD COMBO 日に曰 1 0 ー肥 0 ト 0 田 0 第 TXT OK しト硺を新 Font ・ 新発売 ※写真は開発中のものです。 Win MetaWare 社 HIGH C386 WDK は、 MS-Windows Ver. 3.0 のエンハン ストモードを完全にサポ了トした C 言語コンパイラです。 Windows A 曰の サポートにより、優れた GIJ 陸有するアプリケーションの構築かできます また、 PharL p 社の 38 引 DOS ー Extender にも対応しているので 640KB のメモリ制限を越えた DOS アプリケーションの構築もできます ◆豊富なコプロセッササポート しかも、強力な最適化機能と 32 ビットネイテイプコードの生成 数値演算コプロセッサ 80287 、 80387 、 80486 、 EMC87 、 により、超高速な実行速度を実現。また、漢字対応なので Weitek 1167 / 3167 を完全にサホートしており、高速な 日本語の処理ができます。 3861DOS-Extender の DPMI 規格対応により作成された 浮動小数点演算処理を実現します。 ◆ 32 ビットタイナミックリンクライフラリ DOS プログラムは、 MS-Windows の DOS 互換 BOX で実行 可能です。 DOS 工クステンダブログラムの、デバッグには、ソー 独自の DLL スーパーバイザにより、 32 ビットの DLL fo 「 MS-Windows Ve 「 .3 ℃ (Dynamic Link Library) を生成できるので、多機能 スレベルデバッガが使用できます。 かっスマートな Windows アプリケーションが開発可 Enhanced & 38 DOS-Extender 必要なハードウェア 能です。 ー 6 / 6SX / 4 / 4 SX CPIJÆ載機 ◆ 16 ビットタイナミックリンクライプラリの呼び出し ◆開発効率を向上させるメイクユーティリティ NEC PC 一 0 シリーズ、 EPSON シリーズ、旧 M PC/AT 互換機 ハードディスクと 2MB 以上のプロテクトモードメモリ MWMAKE は、シンカレなマクロと豊富なオプションスイツ call 16 ( ) 関数により MS-Windows SDK でつくられ Wind 。 ws プログラミングに必要なソフトウェア チにより、ソースコードの修正に伴うプログラムのコンパイ た 16 ビット DLL を 32 ビット Windows アプリケーションか ■ Mic 「 0S0 代 W indows Ve 「 .3.0 ルとリンク処理を効率良く行うユーティリティです。 ら使用できます。 ( 但し、 UnIock Data( ) を使用でき - DOS 工クステンダブログラミングに必要なソフトウェア ◆ Windows A 曰サホート ません ) IPharLap 社 & TOOLBOX Ve 「 .4 UMS-DOS Ve 「 3.1 以上または相当品 0 「日本旧 M DOS/V V 4. 以上 ◇ DOS 工クステンダ対応 標準で 600 種類にも及ぶ Windows API 関数を全てサ ※ DOS 工クステンダブログラミング専用の H ℃ H C386 もあります。 ポート OAPI 関数は HIGH C386 WDK に含まれるヘッ 38 引 DOS ー E ender 対応なので、ホインタが 32 ビットに ダファイル ( windows. h ) で 32 ビット関数としてプロトタイプ なり FAR ポインタを使用せずに 4G バイトに及ぶアドレッ 宣言されており、パスカル呼び出し規約に従って使用で シングが可能で、 640KB のメモリの壁を気にせずに、巨 きます。 大な DOS プログラムをスムーズに開発できます。 HIGH 0386 \ 238 , 000 HIGH C386WDK 定価 ( 価格に消費税は含まれておりません。 ) テック情報システム株式会社 〒 261-71 千葉県千葉市美浜区中瀨 2-6 WBG マリフィースト 12F TEL043-297-3061 代 FAX043-297-3060 ( 旧テックソフト & サービス株コンビュータ事業部 ) 製品についてのお問い合わせ 容 043-284-4822 *MS-DOS 、 MS-Wndows 、 MS-Wlndows SDK は M ℃「0S0f【 Co 「 p の商標です。 * その他フ - ログラム名、システム名、コフロセッサ名、 CPU 名は一般に各メーカーの登録商標です。 く資料請求番号 008 〉
キーポードから文字列を入力するときは , scanf( ) の第 1 引数は " % s " , 第 2 引数は文字 列を入れる場所の先頭番地とするのてした。 したがって , 第 2 引数には p ー > name そのも のを使います。 次に , 21 行目て、値段を聞きます。キーボ、 ードから入力した値段は p->price すなわち (*P). price に入れたいのて、す。ところが , 整数を入力 するとき , scanf() の第 1 引数は "%d", 第 2 引数は整数を入れる場所の先頭番地とする のて、した。そこて、 , 先頭番地を求めるアド としているのて、す。 scanf("%d", &(p->price)) ; レス演算子 & をつけて Fig. 1 touroku( ) を何回か呼び出すようす first=1 8C8 (b) 「 C マガ」 980 円を登録 fi 「 st = 0000 (N ULL) (a) 初期状態 これて、 ma 肪 c ( ) て、確保した構造体 * p に 品名と値段が入りました。て、は , この構造 体の次の要素へのポインタ p- > next には何を入れればよいて、しようか。いちば ん簡単な , ふつうに行われていることは , こに現在のリストの最初の要素の番地を 入れてしまうことて、す。そして , 新しい構 造体 * p を今度はリストの先頭とし , そのポ インタ p を変数 first に代入します。これが 2 first , かもしれませんのて、 , 実際に touroku ( ) を何 の意味て、す。 first p- > next 2 , 23 行目の こがちょっとわかりにくい 回か呼び出すようすを Fig. 1 を見ながら頭て、 たどってみましよう。 最初はリストが空て、 , first には初期値 NU LL が入った状態て、す ( Fig. l(a))o 最初に touroku ( ) を呼び出し , malloc() が 18C8 ( 16 進 ) という値を返してきたとしま す。この番地を p に代入し , 構造体 * p に C マガ 980 と登録しました (Fig. 1 (b) ) 。最初 first に入 っていた値 NULL は p->next に移され , fir st には p すなわち 18C8 が入ります。 これ以降 , 次々にデータを登録していく と , リストは前方に延びていき ( Fig. l(b), Fig. 1 ( c ) ) , 最初に登録したデータがリスト の最後の要素になります。したがって , リ next prlCe name 18C8 0000 980 C マガ (c) 「 Oh!PC 」 560 円を登録 first=1 8E6 18E6 18C8 560 Oh!PC 18C8 0000 980 C マカ 問 18 次の C プログラムの説明及びプログラムを読んで , 設問に答えよ。 〔プログラムの説明〕 関数 dprice は , 商品名を入力し , その商品の単価をハッシュ法で素早く検素して 表示するプログラムである。 ( 1 ) 商品名と単価は , 図に示すデータ構造に格納されている。以下に , 例として "PEN-M16" という文字列で表される商品名の単価 1 が表示される場合を示す。 検索の方法は , 次のとおりである。 ①入力した商品名から , そのハッシュ値を求める。この場合 , 商品名を表す文字 列を構成する各文字の内部コードを整数と見なしその総和を整数値 HASHSIZE ( ここでは 63 とする ) で割った余われをハッシュ値とする。 例 : 商品名が文字列 "PEN-M16" で表される場合 , その文字の内部コードが 10 進数で , それぞれ順に 80 , 69 , 78 , 45 , 77 を 49 , 54 であれば ; その総和 - 452 = 80 十 69 十 78 十 45 十 77 十 49 十 54 を HASHSIZE で割った余り 11 がノ、ツシュ値となる。 ②ハッシュ値 n はポインタの配列 hashtab への添字として使用する。 ハッシュ値れの商品名が存在しないとき , hashtab 〔 nJ の値は NULL となっ ている。 商品名のハッシュ値が n である各商品のレコードは , 次のレコードへのポイ ンタ (next), 単価 (price), 商品名を表す文字列へのポインタ (name) から なる構造体である。配列の要素 hashtab[n] は , ハッシュ値が n であるレコー ドのリストの先頭を指している。 next の内容が NU し L であるレコードは , リス トの終わりを示す。 例 : 図では , 商品名のハッシュ値が 11 である商品が複数個あり , それらの商品 レコードがリストにつながれている。そのリストの先頭のレコードを指す hashtab[ll] から出発してをリストをたどると商品名 " 旧 EN - 16 " の商 品レコードが 2 番目に存在するのを発見できるので , その単価 1 が求めら れる。 94 (d) 「月刊 PC 」 650 円を登録 first= 1904 1904 18E6 18C8 C MAGAZINE 1 3 2