プログラミング添削 ゲーム・タイプⅡ ~ 障害物 ( 壁 ) を避ける キャラクタを動かすだけて、はおもしろく ありませんね。画面にあらかじめ障害物を 表示しておき , そちらには移動てきないよ うにします ( 誌面の都合上 , プログラムは付 録ディスクに入っています ) 。 今回のプログラムは PC ー 9801 ( ノーマル / ハ イレゾモード ) 上の以下の処理系て、動作を確 じ、 Turbo C (Ver. 2.0 ) MS-C (Ver. 5.1 ) QuickC (Ver. 2.0 ) Zortech C 十十 (Ver. 1.06 ) さて , 簡単なふたつのバージョンを紹介 しました。これらに少し手を加えることに より , ゲームが作成てきます。これはみな さんの課題としましよう。 「添削プログラム」募集規定 『自作プログラムが期待どおりに動かな 『もっと別なプログラミング方法はな いものか ? 』などのお悩みを解決します。 数値計算 , グラフ理論や組み合わせ問題 などのアルゴリズムに関する間題 , 事務処 理 , データベース , システム・プログラミ ングなど , 分野は問いません。下記必要事 項を明記のうえ , 「 CMAGA セミナールーム」 係まて、フロッヒ。ーディスクにてご応募くだ なお , ご応募いただいたフロッヒ。 ディスクは返却て、きません。あらかじめご 了承ください ( 1 ) 氏名・住所・電話番号 ( 2 ) 使用機種名・コンパイラ名 ( 3 ) 質問・相談事項 ( なるべく具体的に ) 宛先 〒 108 東京都港区高輪 2 ー 19 ー 23 NS 高輪ビル ソフトバンク出版事業部 C マガジン編集部 「 C マガセミナールーム」係 int 77 : 80 : disp(), y, Red, ■ nop() : key = keyin(); switch (key) { if (y 〉 1 ) y-- case UP break : if (y く 23 ) y + + : break; case DOWN 86 : if (x 〉 l) x-=2; break; case し EFT case RIGHT: if (x く 78 ) x + ニ 2 : break; 88 : if ()2 ! = x Ⅱ y2 ! = y) { 89 : disp(x2, y2, White, } while (key ! = RET); 92 : 93 : } 95 : / * プログラムを実行する時、 mod i f i ed + R ET キーと入力しますが、プログラム開始直後は その RET キーを拾ってしまいます。それを無視するための関数です。 * / 97 : void wait(void) 98 : { if (keyscan(0x3) & 0X1 の 99 : while (keyscan(0x3) & 0X1 の 100 : 101 : 102 : } 103 : - 初期処理 - 105 : void initialize(void) 106 : { 107 : 108 : 109 : 110 : 111 : 112 : 113 : 114 : 1 16 : 117 : / * - 118 : void ending(void) 120 : clear_kbuf; c010r(White) : 121 : 122 : cursor (1) : 123 : 124 : } 125 : 126 : / * ー メイン 127 : int main(void) 128 : { initialize(); 129 : 130 : end ing ( ) : 131 : return ( 0 ) : 132 : 133 : } do { x2, y2; 引 s : cursor ( の : wait(); disp( 0.0. CyanlReverse, disp( 4.0. MagentalReverse, " ☆ " ) : disp(28, 0. MagentalReverse, " ☆ " ) : disp( 6.0 , GreenlReverse, ー終了処理ー ” A u t 0 ー G AM E R ” ) : 処ム処 初ゲ終 132 CMAGAZINE 19 12
MS-C Ver. 6 ℃主要功イド 沖田浩一 今後開発稗力、大化する , つれ , 従来のようなコマンドライ ンモードだけでのプログラミングま困難な時代を迎えようとし ている。 MS - C 、。、 9.0 の統合開発 PWB はその問題を解決 するために齠共されたといえるだろう。ここでは MS - C Ver, 6.0 法を心に紹介する。 か提供する統合開発王のま糶能 イタが中心になる。このエデイタからすべ A>MOUSE OFF ての操作が行えるようになっているからだ。 PWB の起ち上げは非常に簡単て、 , 次のよう 操作や環境設定は QuickC の統合環境に似て に行う。 おり , 著しく異なるものて、はない A> PWB MS-C Ver. 6.0 最大の特長のひとつが マウスを使用するときは , PWB 起ち上げ前 もちろん PWB にはいくつかのオプション programmer's Work Bench(PWB) て、ある。 にマウスドライバを登録する必要がある。 がサポートされており , 簡単な説明を参照 新たに搭載されたこの統合開発環境ツール 設定方法は , したいのなら , 次のように入力する。 PWB により , プログラマズエデイタはもと A>MOUSE A>PWB / ? よりコンパイルの指定からリンク , そして だけて、よい。もし , PWB の使用が終了して 簡易ヘルプて、説明が足りなければ , 詳細 実行まて、も PWB の中から行うことがて、き マウスを使わなければ , マウスドライバの 説明をオンラインヘルプて、参照するとよい る。さらにオンラインヘルプ機能の強化拡 解除は , 次のようにするとよい PWB の簡易ヘルプは / ? て、なくても , 変な引 大によってプログラミング効率は一段と高 まった。たとえば , 工デイタて、プログラム Fig. 1 PWB の初期画面 を作成中に p 「 in 廿 ( ) 関数の詳細仕様を知りた いときは , このヘルプ機能を使いその場て、 検索て、きるのて、ある。その使用方法はメモ リ常駐型のポップアップウインドウを開く のに似ている。 。めに Edit リ i search- R リ「 Options B 「旧 し : 判」、 1 自 6 自 H 自 RTI 年 P Ⅱ旧 P 工 save ー 自げ 0 。 引い。ーに Shift + F9 自は + F4 ーーく LNTITLED 〉 Ct 「ト剏 ml ハ悖準ヘッダファイ丿レではない・ / ハ 1 べージの大きさ第 / Sh げ t + F2 、 0 1 WB の基本機能 PWB から使える機能には , プログラマズ 工デイタ , コンノヾイラ , リンカ , デノヾッガ , NMAKE, ユーティリティ , ソースコード プラウザ , オンラインヘルプなどがある。 しかし , なんといってもプログラマスエデ 64 CMAGAZINE 19 12 i f ( 師 ! = 2 ) bdump fi le ” ) : erl 、—exit ( ” usage N 021 圧第を nnen 3 Ne いに { リ F[Äe
特集 MS-C 旧い 新機能インラインアセンプラ のメリット 高村誠之 Tu 「 bO C, QuickC なとに加えて , いよいよ MS - C Ve 「 . 6.0 てもインラインアセンプルか可能になった。ここては , イ ンラインアセンプル機能の使い方を簡単に説明したうえて , その利占注意点を述べる。 asm int もしくは , 21h まじめに い部分だけを最適化したりすることがて、き とくに高速化した 言語て、関数を書いたり , などのアセンプラは必要ない ) , アセンプリ 異なる。またコンパイルに MASM,TASM パチプルて、 ( Turbo C のそれとは少し文法が MS ー C に実装されたものは QuickC とコン がて、きるようになった。 からインラインアセンプル機能を使うこと センカレが可能て、あったが , MS ー C も Ver. 6.0 Turbo C,QuickC などて、はインラインア とをいう。 ソースの中に直接アセンプリ言語を書くこ インラインアセンプラとは , 咼級言語の asm C の文の使えるところにおいて , インラインアセンプラを使用するときは , ごくごく簡単に文法の説明をしよう の文法 ンラインアセンプラ る場合は , とになる。アセンプリ言語が複数行にわた の .. …の部分にアセンプリ言語を記述するこ asm mov ah, 01h のように続けて書くか , asm { mov ah, 01h int 21h 擬似命令は使えないが , C プリプロセッサの 行うマクロ展開は適用て、きる。その際 , マ クロは 1 行に展開されることに注意すべき #define beepmacro \ だ。すなわち , のようにプレース、、 { ドて、くくって記述する。 80286 , 80287 のインストラクションも , / G2 オプションをつけてコンパイルすれば使用 可能て、ある ( 80386 専用の命令は使えない ) 。 asm 文の中て、使える擬似命令に emit と いうものがある。これは , TurboPascal の in ⅱ ne 文に似ており , emit に続く 1 バイトを コードの中に直接埋め込むものて、ある。 これを使えば 80386 の命令も書くことがて、 きる。 コメントは , C のように / * と * / て、くくっ ても , または新しく MS-C Ver. 6.0 から可 能になったコメントの先頭にソ / 〃 ( スラッ シュふたっ , 行末まて有効 ) ても , もともと asm asm asm mov ah, 02h mov dl, 07h int 21h のようなマクロは間題ないが , 次のような マクロを書くとエラーとなる。 #define beepmac 「 0 mov ah, 02h \ mov dl, 07h \ asm { \ int 21h #define beep and set val(val) たとえば , 用して書くときも , この点を念頭におき , マクロの中て、アセンプリ言語と C 言語を混 の MASM< のように も , かまわない asm { / * コメント 〃注釈 Remark 〃 ( セミコロン ) て、 asm asm asm val = 0 ; mov ah, 02h mov 引 , 07h int 幻 h } MS-C Ver. 6.0 のインラインアセンプラ はマクロアセンプラて、はないため , macro } を使わなければならない のように - やクク また , その行の終わりまて影響をおよば すコメント C げやソ / つをマクロの中て、 使うときも , とくに注意が必要てある ( / * ・ * / を使えば大丈夫てはあるが ) 。 定数は , MASM て、使えるものはほとんど 特集 MS-C Ven 6.0 研究 59
LSI C コンバイラ LDB-80X プログラム開発からデバツのま、 咼速、コンパクトなコードを生成 レジスタの最適自動割り付け レジスタによるパラメタ渡し アセンプリ言語の埋め込み記述可 ANSI 準拠・プロトタイプ宣言を完全サポート ROM 化に最適 ターゲット CPU: 8080 / Z80 / 64180 ー MS - DOS 版クロス ・アセンフ。ラ、リンカ付き ・ UNIX の cc と同様の使いやすいコンパイラ・ドライバ ・ UNIX コンノヾチ・プログラム保守ツール make ・ライプラリ、コンパイラドライバ、プリプロセッサのソース付き ・ MS-DOS Ver. 2.11 以上、 384KByte 以上必要 ・価格 398 , 000 円より ■ UN Ⅸ版クロス ・ NEWS 、 Sun-3 、 vsx シリーズ、 Kurama 、 SX-9100 シリーズ、 LUNA 、 HP9000 モデル 300 シリーズ、 ) station200 、 Micro VAX 、 VAX-II ※その他の機種については、ご相談に応じます。 ・ CP / M 版セルフ ・価格 98 , OOO 円 ・ CP/M-80 Ver. 2.2 以上、メモリ 60K CP / M 以上必要 ターゲット CPU : 8086 ・価格 48 , 000 円 三 00 、、 0 , , ー ~ 00 ・ 0 far,near キーワードをサポート UNIX の cc と同様の使いやすいコンパイラ・ ドライバ ・ UNIX コンヾチ・プログラム保守ツール make ・ライプラリ、コンパイラ・ドライバ、フ。リプロセッサ のソース付き ・ MS-DOS Ver. 2.11 以上、 384KByte 以上 必要 LDB-80X は、 LSI C -80 (MS-DOS) て、開発したソフトウェアのデ バッグ環境を、 MS - DOS 上て、実現するためのソースレベル・クロ スデバッガてす。これにより、プログラム環境からデバッグエ程まて : アセンプラを意識することなく C 言語レベルて、のプログラム開発が 行えますのて、、大幅にソフトウェアの生産性が向上します。 ・ LDB -80X には、動作モードとして以下の 3 種類のモードて、 動作します。 1 . 64180CPU ボ、一ドを使う 180 モード 2. V30CPU の 8080 工ミュレーションを使う V30 モード 3. ソフトウェア・エミュレーションモード •Turbo-V システム、または Turbo-18011 システムと併用すれば、 CP / M -80 のアプリケーションソフト (. COM ファイル ) のテンヾッグ が可能て、す。 ・ LDB -80X は、操作性に優れたウインドウ指向デバッガて、す。 5 つのウインドウ ( コード、レジスタ、ウォッチ、コマンド、及びオプ ションウインドウ ) とポップアップ・メニューがあります。 実行中のユーザ・プログラムを任意の時点て、強制的にプレー クさせ、制御を LDB -80X に戻すことがて、きます。 複数のコマンドを組み合わせて、新しいコマンドを構築するマク ロコマンド機能があります。 ー LDB -80X から MS - DOS のコマンドを起動する、サフ。プロセス 機能を持っています。 ・その他、 LDB -80X には、コマンドウインドウの表示コントロール ( カーソル制御、画面消去等 ) 、 I / O の入出力工ミュレーション、 メモ、オプション設定、ロギンク : バッチ等 のコマンドが用意されています。 ・ NIS-DOS Ver. 2.11 以上、 384KByte 以上 必要 ・ NEC PC -9800 シリーズ (PC-98XA, XL, XL2, RL のハイレゾリューションモードも含む ) ・ EPSON PC -286 シリーズ / PC -386 シリーズ LSI C -80 (MS-DOS) 十 LDB-80X セット価格 128 , OOO 円 LSI C -80 ・価格 98 , 000 円 LSI C -86 [ LDB -80X の走行環境 ] 創田円 オプシノ - 覧 創田 - 引日第工 ょ・物 工ル・エス・アイジャパン株式会社 CP/M は DigitaIResearch ⅲ c. 、 MS ・ DOS は Microsoft corporation 、 Z80 は Zilog コ nc. のそれぞれの登録商標です。 〒 1 51 東京都渋谷区千駄ヶ谷 1 丁目 8 番 1 4 号 UNIX は Bell Laborato ⅱ es の米国内での登録商標です。 LDB-80X, Tu 市 0 ・ V / 180 は京都マイクロコンビュータ 容 ( 03 ) 404 ー 1341 ( 代 ) ・ FAX ( 03 ) 478 ー 0576 株式会社の商標です。その他、商品名は各社の商標です。 く資科請求番り・ F03 〉
MS-C ド ルのプロフェッショナルプログラマ要求ま て、 , 柔軟に対応て、きる。 このフレキシビリティに富んだ PWB のカ スタマイズは , オープンアーキテクチャの 採用によるところが大きい。オープンアー キテクチャの採用により , ユーザは独自の ヘルプデータベースの追加や , PWB 拡張の 追加が可能となっている。くわえて , マク ロや多数のスイッチ群が用意されている点 もカスタマイズの幅を広げる要因て、ある。 キーポードアサインメントについても同様 だ。また , PWB には新たなユーザメニュー を追加するというカスタマイズ手段が用意 されている点も特長として挙げられよう。 Fig. 1 MS-C Ver. 6.0 開発環境 そのほかのツール Microsoft Programmer's WorkBench アドバイサ ヘルプファイル MAKE テパッガ CV3.0 工デイタ ユーサによる 機能拡張 ソースプラウザ C6.0 MASM 機能強化された プログラマズエテイタ 三ロ PWB には専用のマルチファイル , マルチ ウインドウ型のヒストリー機能をもったプ た各種機能群のほとんどがマクロ記述能力 ほかのビルドを行い , 結果を View メニュー ログラマズエデイタが組み込まれている。 を備えているため , 使い慣れるとカスタマ コマンドて、確認し , Browse メニューて、間題 イジングの格好の手段となるばかりか , 新 このエデイタは , その前身て、あるマイクロ 箇所のリファレンスが得られる。さらにデ たに装備された Record 機能によって , 簡単 ソフトエデイタを大幅に機能強化したもの バッグ段階て、も , 同じく PWB 上 <CodeView て、 , 基本的にはアップワードコンパチプル にキー操作を記録し , これをマクロとして を起動しプログラムを実行追跡することが だ。 PWB にプログラマズエデイタがインテ セープ使用する道も開けた。 可能なのだ。 グレートされた結果 , ソースコードエディ プログラマズエデイタて、は新たにマウス このプログラマズエデイタには Record 機 ット前後の作業はきわめて便利になった。 の使用が可能となっている ( もちろん , PWB 能を兼ね備えた強力なマクロ機能が装備さ PWB I•て、コンパイル , アセンプル , その 全域て、のマウス使用が可能て、ある ) 。カーソ れている。 Ver. 5 . 1 と比べ大幅に強化され Fig. 2 QuickC ライクにセットした PWB Fig. 3 マイクロソフトエテイタライクにセットした PWB 33 「 ch ー ke Run Op い ( ) 応 Split 「に ont 引 Split 「ー ・ Ct 「い F8 Size Ⅲ国 ー幻面 ze Ⅲ 04 Ct 「い日 9 Ctrl+F4 ロ 0 ? Ⅲ 4 Coupi RnJlts V ・「 5i0 2 OjEt = ー 0 fS 「 0 「 01 = 0 第 ⅲ t ⅵ 7 2 1 部 ー L を第 D : 1 し u 使 凵 0 : : 鉢し旧 モ L ー D : 6*ELP . 0 File Edit D:ü*IN!T*CLFFENT. STS V 「 5 i on = 2 0 「 Oj を ct ゞ” ild 『き印 5 「 0 fS 「 0 を 4 S 「 0 = V 「 fSr 5 「 0 = fRplRe=ø ⅲてⅵ = 7 W24 2 ! 24 i 「 on ] IFCLUtE=D:ü*ItCLUDE L = D : 6 軋旧 モ F ! S = D : 軋詳モ . HLP ttuild) bJild: 0 「 0 : ミョ」 3 ” 3 ” [édit-2 0 0 lj: しⅵⅢ T れ」トに STS V 「 5i0 「 2 proj き 0 て = ”” bu ⅱき 4 fS 「 0 4 5 「 0 = f 印 [ 部 it-2 【ⅱ d ] bJiId: 20 「 0 工” 9 ・ bJiId: 20 「 0 ・ 0 b 「 %k ・” + 酊 Ch for Nb lt ・ ー込一石 . に ilt け対 ( トめ「 izonta いリ at ロ ) 「 特集 MS-C Ver. 6.0 研究 43
DavidIntersimone & Zack UrIocker 便利な機能が拡張されているからて、す。ま さる 10 月 9 日 , 鯨・品川において , ホーランド 00P ワールドッアーかされ た , カプセル化 ( 注 2 ) , 継承 ( 注 3 ) や多義性 ( 注 4 ) た。こしは , これから主流となるであろうオプジェクト指向プログラミング ( 0 などの機能を使って OOP をするのにも , C 十十 (P) について , マネージメント , 00P の , 実際のプログラミングについて は理想的といえます。 解説するセミナーであり , 世界 1 6 新で開かれ , 鯨か地であった。鯨では ということて、 , C プログラマにとっては , 500 名もの参加者か集い , 盛況のうちに幕を閉じた。編集部は , 日の前日に寘 C 十十が将来の主流の言語と考えられます 者にインタビューする機会をもっことができた。 が , ただ , オプジェクト指向言語には , C 十十 のほかにも , いくつもあります。たとえば , インタビューに答えてくれたのは , 講演 の重点は , ANSIC と C 十十を組み合わせる Turbo PASCAL もそのひとって、す。今後 , 者のうち , David lntersimone 氏と Zack 形になっていくて、しよう。 さまざまな OOP 言語が現れてくることと田 ィじ、 そうすると , 今後は , C 十十が主流にな いますが , われわれは OOP 言語としてサポ Urlocker 氏て、ある。 David 氏は米国ポーラン るとお考えでしようか。 ートしていきたいと思っています。 ド社のディレクターて、 , セミナーて、は , イ ントロと , OOP におけるマネージメント , David Turbo C 十十についてはふたつの見 もちろん , 構造化プログラミングもサポ OOP への移行方法 , オプジェクト指向デザ 方がて、きます。 ートしていきます。というよりも , 構造化 ひとつは , ANSI 準拠の C コンパイラとし イン ( OOD ) を担当した。 Zack 氏は , 最近ボ ! ・が基礎となって , ハイプリッド言語と て 100 % 働くということ。つまり , 拡張され ーランドに入社したが , 以前は , ソフトウ して C 十十や PASCAL with Objects が発展 た機能をまったく使わずに , ANSI C のコン ェア開発コンサルタント会社の技術スタッ してきた経緯もありますのて、 , われわれは パイラとして使っていただけます。 フを務めていた。セミナーて、は , PASCAL 両者が , 互いを排除するものとは考えてい with ObjectsGii1) による OOP を担当した。 もうひとつは , やはり , 1990 年からの 10 ません。 年間て、 , C 十十が自然な形て℃言語の後継者 zack OOP 言語といいますと , 多くの人は Turbo シリーズの動向 の役割をはたすだろうと思われます。とい C 十十を思い浮かべると思いますが , PAS うのは , C 十十は , 型チェックやタイプセー CAL with Objects は , OOP を学習するうえ ま $,Turbo シリーズの開発元て、ある米国 フリンケージ , データ抽象化 , 関数や演算 て、は , C 十十よりも簡単だといえます。 ボーランド社ということて、 , 気になる今後 了・の多重定義など , C プログラマにとっても クラスライプラリ の製品動向について尋ねた。 次に , OOP の重要な利点て、あるクラスラ ー今回 , TurboC 十十 Ver. 1 . 0 がリリー イプラリ ( 注 5 ) について尋ねてみた。また , ラ スされたわけですが , Turbo C ver. 3 . 0 を イプラリを利用する際に , 著作権の間題は リリースする予定はありますか。 どのようになるのて、あろうか。 David 現在のところ Turbo C Ver. 3.0 を リリースする・定はありません。 Tu 「 boC 十十のライプラリ ( 注 6 ) について TurboCVer. 2 . 0 については , 初級者向 けと位置づけています。低価格て、使い勝手 ですが , BGI をクラスライプラリの形でまと めていく予定はありますか。 もよいのて、 , 現在て、も売れていますし , 今 David 米国 ZINC Software が , すて、に 後も版売・サポートしていきます。 BGI を用いたクラスライプラリを発売してい これからのわれわれの開発と販売 ただ , S h 0 「 t ー n t e 「 i e W 「初心者には , PASCAL with Objects が向く」 と語る Zac 低 144 CMAGAZINE 1990 12
配列名からの ホインタ生成の例外 前回 , 次の基本ルールを述べた。 ・基本ルール 式の中に配列名が出現するとそれは先 頭要素へのポインタに変換される このルールはたいへん重要なのて、再び強 調しておきたい。ちなみに K&R 第 2 版て、 は , このルールは「ポインタ生成 (pointer generation) 」と呼ばれている。実際には 2 種 類あるポインタ生成のうちのひとって、ある。 ただし , 則回 , このルールには 2 点例外があ ると述べた。後述といいながら説明て、きな かったのは誌面の都合によるものて、ある ( 筆 者がポケて忘れたわけて、はない ( の例外について説明しておこう。 ・基本ルールの例外 その 1 : sizeof 演算子のオペランドに登場 した場合 その 2 単項演算子邸 & ″のオペランドに 登場した場合 このふたつの場合には例外として , ポイ ンタ生成は起こらない 具体例をあげる。 a[100] ; Char という宣言がなされていた場合に , sizeof ( a ) を評価することを考えよう ( なお , この場 合 , sizeof にはカッコはつけなくともよ い ) 。この場合 , sizeof は配列全体のバイト 数を返してくれなければ困る。もし , 110 CMAGAZINE 19 12 ポインタと配列 ( 2 ) 引 mo 第 4 回 前回 , 1 次元配列とポインタに関して述べたか , 誌面の都合でいいつくせなかったので , 引き続 きだあきら という関係て、ある。この例外は古くから存 き , 1 次元配列とポインタに関する話から始めたい。 て、もポインタ生成が起きると , これは sizeof(& a CO] ) と等価になってしまう。この場合に は , それは sizeof(char*) と同値てある ( こ の場合にだけは sizeof にカッコが必要 ) 。 sizeof(char* ) は「 cha 「へのポインタ」のサイ ズて、あり , コンパイラや CPU, メモリモデ ルによって異なるが , 少なくとも , 配列 a 全 体のサイズとは何の関係もない値て、ある。 整理してみよう。 char aCIOO] ; の場合 , sizeof(a) sizeof(&aC0]) sizeof(char [ 18 ] ) sizeof(cha 「 * ) 在していたのて、 , いまさらいうまて、もなか ったのかもしれない 2 点目の例外はアドレス演算子 , すなわち 単項の、、 & 〃が配列名に施された場合て、あ る。実はこの規則は比較的新しい。少し古 い C コンパイラて、は , たとえそれがプロトタ イプ宣言をサポートしていて , いかにも ANSI 準拠風に見せているものて、あったとしても , この演算をサポートしてないものがある。 たとえば , 手元のコンパイラの中ては MS ー C Ver. 5.1 がそうて、ある。これて、配列名に 単項の、、 & 〃を適用すると「無視します」とい う警告がて、る。 ANSI の規格て、は , 配列名に単項の、、 & 〃 が適用された場合には , それは配列全体へ のポインタを得ることになっている。当然 ながら警告など , て、てはいけない。この場 合も , ポインタ生成が起きないことは明白 て、ある。もしポインタ生成が起きたならば , 、、 & a 〃は、、 & & a [ 0 ] 〃と同じことになってし まう。後者はポインタ値 ( アドレス ) のアド レスを取ろうとしており , それは実行不能 て、ある。 手元の MS ー DOS 用のコンパイラて、は , Turbo C Ver. 2.0 と LSI C ー 86 Ver. 3.20 は , いずれもこの演算を ANSI の規定どおり に行っているかのように見える。少なくと も , 、、 & a クという表現はエラーとはならず , それなりの動作をしてくれる。 しかし , List 1 を実行させてみると , これ らのコンパイラの個性が見えてくるのて、あ List 1 が行っていることは単純て、ある。た んに cha 「の 20 要素の配列 a を宣言し a , *a, &a, * &a の sizeof を出力させているにすぎ ない ところが奇妙なことに , 3 つのコンパ イラの出力はすべて異なっている ( なお , れはあくまて、手元のコンパイラによる結果 て、ある。その後 , マイナーなリビジョンア ップが行われていて , 現行のコンパイラて、 は結果が違っているかもしれない。その点 はあらかじめお断わりしておく ) 。 さて , いったいどれが正解かおわかりだ ろうか ( 以下て、は sizeof(char * ) 2 , たとえば MS-DOS sizeof(void* ) のスモールモデルを仮定する ) 。 まず , sizeof(a) これは配列 a 全体のバイト 数て、あるから , 20 てある。そして , sizeof(* a)o この場合には , a は単項演算子ヾ * 〃の
特集 List 5 List 4 をソ Ozax / Fa ″つきでコンノヾイルした出力結果 Static Name Aliases TIT し E tmp. C . 8087 SLI BCE INCLUDELIB SEGMENT WORD PUBLIC 'CODE' _TEXT TEXT ENDS SEGMENT WORD PUB い C 'DATA' _DATA DATA ENDS SEGMENT WORD PUBLIC 'CONST' CONST CONST ENDS _BSS SEGMENT WORD PUBLIC 'BSS' BSS ENDS DGROUP GROUP CONST, _BSS, _DATA ASSUMB DS: DGROUP, SS: DGROUP EXTRN acrtused: ABS TEXT SEGMENT ASSUME CS: _TEXT ; L i ne 1 い ne 4 PUB い C @test_asm PROC NEAR @test_asm push bp, sp mov push dx push register ax register dX List POP ret 〇〇〇〇〇〇〇〇〇 〇〇〇〇〇〇〇〇〇 @test_asm ENDP し i ne 1 1 PUBLIC @test PROC NEAR @test register ax register dx し i ne 12 add し i ne 13 ret nop ENDP @test し i ne 17 PUBLIC main PROC NEAR ma ー n し i ne 18 t110V TliOV ca 1 1 L i ne 19 mov mov call L i ne 20 ret nop ENDP ENDS ax, dX 4 し 1 人 1 ー - cg ー 0 6 ) Cd ・ 0 @) Line 5 6 し i ne L i ne 7 8 L i ne ax, WORD PTR [bp- 幻 add ma 1 n _TEXT END sp, bp mov に , 引数をて、きるかぎりレジスタわたしに するものて、ある。これによってコードは小 さくなり , 実行速度も向上するが , インラ インアセンプラと相性が悪い場合もあるよ または関数の最後にラベルをつけて , そこ 、 0 List 4 のような C ソースを "/Ozax /Fa" へジャンプする 注 1 ] Turbo C のインラインアセンプラ っきて、コンパイルした出力結果を示す (List f00 ( ) て、はエスケープ文字は変換されず , たとえ 5 ) 。これからわかるとおり , せつかくレジ ば 'Yn' はそのまま , 5c6eh とされる。 スタわたしにしているのに , インラインア asm ただし , MASM て、は , 、、 X 〃も、、 X 〃も同 センプラを使った test asm ( ) のほうが使わ asm じだったが , 前者は asm 文中て、は、、 bad ない test() よりはるかにコードの生成効率が asm Jmp token" としてはねられる。 悪くなっている。 asm いずれにせよ , C て、とおるような定数の書 asm き方をしておけば問題はないだろう。 endfoo: ・そのほか 通常このようなことはしないが , 「ライプ また , asm 文中にメモリを db,dw,dd など のデータ宣言擬似命令て、確保することはて、 ラリの高速化」 ( 本誌 ' 89 年 11 月号「特集最新 か , のいずれかを選択する必要がある。 ない。注意していただきたい ライプラリ考察 PART4 」 ) て、述べたよう 0 注 2 ] 関数中て、破壊される場合だけて、な に , 引数を直接スタックから p 叩命令て、取り ・ fastc 訓との相性の問題 く , 参照されるだけて、も push / pop の対象に 出すような一種姑息な方法はインラインア MS-CVer. 6.0 から , 新しい関数の属性 センプラをちゃんとわかっていないと難し なるようだ。 fastcall が登場した。これは , 関数の引数の くなる ( もちろんそのままて、はうまくいかな 順を pasc 引型 ( 引数そのままの順にスタック い ) 。 に積んて、からコールする方法 ) にすると同時 インラインアセンプラには , 上述したほ かにもいろいろと制限がある。高速性を追 求するがゆえに特殊な操作をする場合は , 最初からアセンプラて、作ったほうが賢明て、 あろう。 return : asm asm endfoo 特集 MS-C ver. 6.0 研究 63
データと関数がひとつのパッケージに収ま っているのて、 , 変史を抽象データタイプに 局所化することがて、きます。これは , 実際 に稼働しているシステムのある部分を , ほ かの部分に損傷をえることなく変更て、き ることを意味します〔訳注 : 本稿は C 十十と Turbo Pascal 5.5 に一股を・かけているた め , 術語が不明確になっている場合があり ます。抽象データタイプを C 十十の正式の用 語て、いうなら , 抽象クラス (abstract class) て、す。以下 , タイプとかデータタイプとい う語は , C 十十ューザはクラスと置き換えて 読んだほうがわかりやすいて、しよう oabstract Class の定義と形式は , 「 THEANNOTAT ED C 十十 REFERENCE MANUAL 」の 214 頁にあります〕。 List 1 86 : GetMem(VaIue, し ength(V) 87 : Value 88 : end; 89 : 90 : constructor Editor.lnit(F: string; し : word) : string, し n: word 91 : begin 92 : FileName し i ne 94 : し ineNo 95 : POS i i on 96 : end; 98 : constructor Hierarchy. init; begin end; 99 : constructor Browser し iSt. init; begin end; 100 : 101 : { デストラクタ } 102 : 103 : destructor Editor. Done; begin end; 104 : 105 : destructor DisplayStr. Done; 106 : begin FreeMem(VaIue, し ength(VaIue*) + 1): end; 107 : 108 : destructor BackTrack. Done; begin FreeMem(Value, し ength(Value-) + 1) : end; 109 : 110 : 111 : destructor Hierarchy. done; begin end; 112 : destructor Browser い st. done; begin end; 113 : 114 : { メソッド } 115 : 116 : procedure DispIayStr. DSAction; 117 : var 118 : Ch : char; 119 : begin 120 : writeIn(VaIue ) : 121 : Ch : readkey; 122 : e nd : 123 : 124 : procedure BackTrack. BTAction; begin writeln(Value*); end; 125 : 126 : 127 : procedure Edi tor. Ed itActi on : 128 : var Ch Char , 129 : begin 130 : writeIn(#13, # 10 , 'File wr i te 1 n ( ' い ne 131 : 132 : writeln(' い neNumber= , い neN0) : 133 : writeln('Position ,Position); { ここでエデイタをコールして適切な情報を渡す } 134 : 135 : end; 136 : 137 : procedure hierarchy. init_types; 138 : begin 139 : case し anguage-type Of 140 : beg in 141 : Base_type 142 : Der i ved_type 143 : End-type ・ 144 : end; 145 : beg in 146 : Base-type 147 : Deri ved_type ・ 148 : End-type ・ 、 149 : end : 150 : { case } end : 151 : end; 152 : 153 : procedure hierarchy. init_files; 154 : begin 155 : case し anguage-type Of 156 : FileName ・ cltest. pas ・ OOP の そのほかの機能 継承と多形性という機構によってプログ ラマは , 一群のデータタイプへの共通のイ ンタフェイスを設定しているべースタイプ を作ることがて、きます ( 一群のデータタイプ をこのべースタイプからの継承によって作 るのて、す ) 。派生型 ( 導出型 , 継承によって 作られたタイプ ) について何も知らなくて も , べースのインタフェイスの使い方さえ わかっていれば , 容易にシステムの拡張が て、きます。既存のシステムに新たなタイプ を追加するには , それをベースタイプから 継承すればよいのてす。システムはべース のインタフェイスだけを使っているのて , 新たなタイプの扱い方もただちにわかりま す ( 新しい型の容器は , そのほかの容器とま ったく同じように , 開いたり閉じたりて、き ます ) 。継承はオプジェクト指向プログラミ ングの基本て、あり , きわめて便利な機構て す。 抽象データタイプは , カッチリとまとま りのよいひとつのパッケージてす。それに は , 自動的な初期化と後始末の機能 ( コンス { オプジェクトの階層を表示する } ' , FileName) ; { Pascal } - object'• ニ object(' 'end ・ ・ C 1 ass { Pascal } C 十十や pasc にもプラウザ環境を 23
GN び奮闘記ー第⑨回吉野智興 もうひとつのコンバイラ , トランスレータたち ランスレータて、す。以下の PascaI 処理系の 現在 , 高級言語の主流をなすといわれてい なっています。とくに X68000 ユーザにとっ るのは , おそらく C 言語でしよう ( C を高級言 方言を適切に変換てきます。 て嬉しいのは TurboC てのソースを変換し 語と呼ぶことには抵抗があるにしても・・ て , X68000 上て、実行てきることてす。 1. HP Pascal です ) 。しかしながら , 多くのプログラムは 2. HP PascaI()X Version) この環境ファイルの柔軟性は特筆すべき c 言語以外で記述されていることが一般的に 3. Turbo PascaI Ver. 5.0 占のひとって、 , パラメータは優に 100 を越え なっています。現在 , X68000 用の入手可能 4. UCSD Pascal る設定が可能になっています。 な高級言語と呼ばれるものには , シャープ 残念なことに , p2c は正しく記述されたプ 5. Machintosh Programmer's Work の•xc", おもにパソコン通信で配布されて shop Pascal 2.0 ログラムに対して処理するように設計され いる•GCC", 「 Oh / X 」の付録として配布さ 6. VAX/VMS Pascal version 3.5 ていますから , Pascal 言語上てのエラーを 7. Oregon S0ftware Pascal/2 れた•pure Pascal" などがあります。今回 適切に指摘 , 処理することはしません 0PascaI は C をとおして別の言語を扱う「トランスレ 8. Berkeley Pascal with Sun extension 自体を勉強するには少し使いづらいと思わ ータ」を紹介しましよう。 れます。 9. ModuIa-2 Wirth's Programming in 変換サンプルが List 1-1—List 3 ー 2 てす。 イ Pasc ーを C 言語へ Modula-2 , 3ed edition List 1 ー 1 は PascaI のプログラム例としてはあ PascaI だけてなく , ModuIa-2 もサポート まり適切てはないのてすが , あとに出てく PascaI は美しい制御構造と , 厳しいタイ しています。また p2c は変換規則が環境ファ る f2c(FORTRAN to C) との関連て、作成し プチェック機能をそなえた構造化言語のひ イルによって非常に柔軟に指定てき , この ました。 C と対応させてみると変換の様子が とってす。残念ながら純粋な PascaI 文法て、 ほかの処理系にも容易に対応てきるように よく理解てきるてしよう。 readln や writeln は , 個々のマシンの機能を引き出せない場 Pasca によるサンプルプログラム 1 合があるため , 各処理系ごとにかなりの方 言があります。というより , おおくの PascaI 処理系は標準 PascaI のスーパーセットにな っています。 X68000 の Pascal 処理系として , COh ! X 』 て、配布された Pure Pascal コンパイラがあり ますが , かなり仕様の違いがあり Turbo Pascal などへのソースの移植 , コンパイル などには相当な困難がともないます。 また , GNU プロジェクトて、もボランティ アの手による PascaI コンパイラが作成され つつあることが GNU ダイジェストに紹介さ れていますが , ここて、は GNU の p2c(Pascal プログラムを C のプログラムに変換する ) を 紹介したいと思います。 GNU p2c ( 以下 p2c ) は , 非常に高性能なト 1 : ( * シンプソン公式による近似積分 * ) 2 : ( * for GNU pascal to C sample * ) 3 : 4 : program symp( input' output) : 5 : 6 : var a,b:real; 7 : s,h,x:real; 8 : n,n2:integer; 9 : i : integer : function func(x :real) :real; begin = s i n (x) *s i n (x) + s i n (x) + 1 func : end; begin (*0f main*) 16 : readln (), b, n) : 19 : 20 : n2 : n d ⅳ 2 : 22 : for i : 1 to n2 do 23 : s 十 h/3. 0*(func(x) 十 4. 0*func(x 十 h) 十 func(x 十 2. 0*h)) : 24 : S 25 : x 十 2. 0 ⅶ X 26 : 28 : beg i n end : writeln(' a= end. a n S = 148 CMAGAZINE 1990 12