000 - みる会図書館


検索対象: 月刊 C MAGAZINE 1991年11月号
205件見つかりました。

1. 月刊 C MAGAZINE 1991年11月号

00 ライフラリ開発技法 て , そのセグメントおよびオフセットを求 64K バイト以内の空間を表すためのものて、 V 日 AM のアクセス めることがて、きます。機能概略を TabIe 11 す。てすから , ある固定されたセグメント PC ー 9801 のノーマルモードて、は , 0XA000 に示します。 に対して , その先頭からのオフセットしか 0 番地からテキスト VRAM に割り当てられて Fig. 23 て、解説をしましよう (List 24 は LA 持ちません。たとえば near* インタが 0X12 います。 1 文字が 1 ワード ( 漢字を除く ) に対 T て、も動作しますが , 34 という値を持っているとしても , どこを こて、は LAT 以外の 応しています (Fig. 2 の。 基準 ( セグメントの先頭 ) としての値かがわ 処理系についてのみ解説します ) 。 List 23 は PC ー 9801 のノーマルモードて、 , からなければ , その物理アドレスを求める テキスト画面上一杯に 80X25 個文字 A を ことはて、きません。 (a) オフセットの取得 表示するプログラムて、す ( 文字の属性につい そこて、作成したのが List 24 のライプラリ (unsigned) にキャストすることによ ては考慮していません ) 。 ( ヘッダファイル ) て、す。このマクロにより , り , 下位 16 ビットを取り出すことにな , こて物理アドレス 0XA0000 を表現する方 near;tk インタ , far ポインタの両方に対し ります。 near;tk インタ , far;* インタと 法が , LAT とそのほかの処理系て、異なるこ テキスト画面一杯に ' A ' と表示 ( PC ー 9801 ) とに注意してください。 Fig. 21 に示してい るように , LAT て、は 16 進 5 桁の物理アドレス 1 int main(void) をそのまま far;* インタにキャストすればよ int 3 いのて、すが , それ以外の処理系て、は , セグ unsigned far *vram = (unsigned far * ) 4 #if defined(LATTICE) 5 メント 4 桁・オフセット 4 桁の合計 8 桁て、表し 0XA0000 : 6 #else 7 たアドレスを far;* インタにキャストする必 0XA0000000 : 8 #endif 9 要があります。 10 for (i = 0 ; i く 80 * 25 ; i + + ) Ⅱ 12 *vram 十十 return( の ; 13 List 23 LAT とそれ以外の処理系て、は far ポイン タの表現法が違う Fig. 20 テキスト VRAM ( 文字部 ) の構成図 ( 80 , 1 ) 0XA0000 ポインタとアドレス 次に , 与えられたポインタから , 実際の 物理アドレスを得る方法を考えましよう。 多くの処理系て、 FP OFF, FP SEG というラ イプラリが用意されています。しかしこの ライプラリは , ・処理系によってアドレス算出法が異なる ・処理系によっては far ポインタに対しての み正しく動作し , near ポインタでは意味 をなさない という致命的な欠点があります。 そこて、ライプラリを作成します。 far ポイ ンタて、あれば , セグメントオフセットは何 とかして求めることがて、きそうて、す。しか し near ポインタについてはどうて、しよう か。 Fig. 22 に示すように , near ポインタは ※ 1 文字が 1 ワード ( 2 バイト ) に対応 ( 80 , 25 ) ( 1 , 25 ) Fig. 21 0XA0000 . 0000 番地を指す fa 「ポインタ (void far * ) 0XA0000 LAT (void far * ) 0XA0000000 LAT 以外の処理系 特集ライプラリ開発技法 69

2. 月刊 C MAGAZINE 1991年11月号

・い 0 角 0) *±、露コØ 10 工 一三 12.320 一一一 ( No. ロ Oh 一 PC 6 こ 6.160 三 ( 安 No. 、御ロ 0 = 一 PC ロ Oh 一 X 匪 7.200 三 ( 安 No. 一三 7.440 三 ( No. = = 9.120 三 ( 安 No. ロ、ヾ凵・ 4 戛 一三 7.680 三 ( 安 No. ・冊 0 lt H 0 〈ペワ CÆLANTIMES 一三一 7.760 一一一 ( 安 No. CC MAGAZINE 一三 11 .760 一一一 ( 安 No. 「コー溿」 一三 7.440 三 ( No. 加 4 一 DTHE COMPUTER ・ 15 工 一 ) ◇工 1 ◇コ 8 = 一三 8.160 一一一 ( No. 0h 一 pc 6 こ 4.080 三 ( 安霎 No. 〕ーロま寔蟶 LANTIMES ◇煢コ 18 工薹 Oh 一 X Oh 一 FM TOWNS THE COMPUTER 0 C MAGAZINE Oh 一 Dyna 0 üJL 7 こ斗 7 一 ) 辻

3. 月刊 C MAGAZINE 1991年11月号

EasyCT1 ・ ue"forWindows. 3 0 一員 0 The レⅲ 0 わ c ト 0 れ d Programming 今、「 00P ビデオ」が付いてくる / ′ 年内に TURBO PASCAL fo 「 Wlndows をお買い上げになると、 ビデオ「オプジェクト指向の世界」が無料で添付されます 基本は、ターポパスガレ 完ぺきな Windows アプリケーション開発環境を提供。 付属しています。ここからウインドウやメニュー、ダイア ・動作環境 : PC -9800 シリース ( ハイレゾモード対 その美しい言語仕様かコンヾイラの貴婦人 " と呼 ばれ、多くのプログラマーを魅了してきたパスカルが ログ、コントロールなどを継承すれば、最初からコー 応、 LT は除く ) 、 PC -286 / 386 シリーズ / MS - DOS : Ve 「 ドを記述する必要はないのてす。オプジクト指向の 今、「 Turbo Pascal for Wmdows 」として生まれ 3.1 以上 /MS-Windows 3.0 以上必須 / マウス : バス 拡張がされていない C 言語て、のプログラムより、格 マウス / 要ハードディスク 変わりました。デヒ一当時、その驚異的な低価格と 段に素早く、短いコードて、アプリケーションを作成て、 29 , 800 円 ( 税別 ) コンパイルスヒ。ードの速さ、テッヾッガやエテンタを備え ・価格 た世界初の統合環境て人々を圧倒し、瞬く間に標準 きるようになります。 Turbo Pascal for Windows は、自分自身が Windows のアプリケーションて、あり、 の地位を確立して以来、ターボ、パスカルは常に先進 TURBO PASCAL Windows プログラムのみの作成用に設計されてい の機能を搭載し、言語の世界をリードし続けています。 みリカて、は、大学などの教育機関や研究施設てター FOR WINDOWS ポパスカルを使用することが常識てすし、ヨーロッパや 日本て、もビジネスの分野て、幅広く利用されています。 ド R プログラミングの学習もターポパスカルから始めれ ば、べーシックて、貧弱な言語て、学習したために時間 を無駄にする、ということはありません。しかもそのター ポパスカルが、複雑て難解だったⅥ ndows のフロ グラミングを簡単にしてくれるのて、す。 婀「いト示 ( 面事物リ 0 (t)rn い扣 , 減Ⅳ , 物日を 3 物紐れれーい , ( CO れ 5 ーー 0 、 0 ー ( ーぎ、。一心いム、 00 を de ーを一 uc をー岫 Ed えー 0 ′呶ゃ NEW R き ) リぎン 0 「 寒第 2 羅 CO ⅸ 3 02 , 01 NOW 物に℃第 08 誕 WINDOWS TURBO PASCAL FOR WINDOWS TUROPASCAL FQ 物物 0 淋 5 ー 0 第一義ー 0 プロクラムマージャ ます。ソースコードの編集、コンヾイル、実行、テッヾッグ など、使いやすさて、定評のある統合環境を用い、全て Windows 上て、行えます。タイアロク : メニュー、ビット マッフ : カーソル、アイコン、文字列リソース、アクセレー 夕、フォントなどの Windows リソースを視覚的に作成 したり、編集することがてきるリソースワークショップも 付属していますから、高額な SDK を別途購入する必 プログラムマネージャ 要もありません 0Turbo Pascal for Windows に は、 Windows アプリケーション作成に必要なツール Turbo Pascal forWrndows には、 ObjectWrndows の全てが、ひとつのパッケージに含まれているのてす。 というアプリケーションの骨恪になるクラスライプラリが ※ AII Borland Products are trademarks 0 「 registered trademarks Of Borland lnternatlonal.lnc ◎面ⅲ te 「 n 曲 on コ ※ M 0S0 れ、 Wind0 柄は米国マイクロソフト社の登録商標です。その他、商品名は一般に各社の商標です ・製品に関するお問い合せは、総販売元株マイクロソフトウェアアソシェイツ TEL 03-3486-1411 までお願いします。 く資料請求番号 003 〉 TU RBO PASCAL FOR WIN ユーサ向け情報誌 LANGUAGE EXPRESS プレゼント . この広告をこ・覧になって、製品に関する 資料を請求していただいた方全員に、ポー ランド発行の情報誌「 LANGUAGE EXPRESS 」 をさし上げます。 腿眦リ / 日 / 株式会社ボーランドジャパン 〒 107 東京都港区南青山 7-8-1 小田急南青山ビル TEL. 03-3486-148 イも

4. 月刊 C MAGAZINE 1991年11月号

することがて、きます。 逆に , 80387 がないにもかかわら $set 38 7 = YES とすると , 浮動小数点命令を実行し たときにハングアップしてしまうのて、 , 注 意してください。また ,set 387=QUERY と すると , 自動判定の結果がどうて、あったか が表示されます。 emu387 によるエミュレーションを行って いる場合は , この環境変数は無視されます。 ー 0 ' が指定された場合 , コンパイラはコ ード量および実行時間を減少させることを 試みる。 後述する・ -f' オプションのいくつかはある 種類の最適化を許可 / 禁止する。 出力する。このオプションは時代遅れとな デバッグ情報を古い GDB フォーマットて、 リーズナプルになった ラムのコンパイル時に最適化を行うことが これによりバグがあるかもしれないプログ ることが可能て、あることが明らかになった。 かかわらず最適化された出力をデバッグす ープの外へ移動されている , など ) 。それにも ために ) まったく実行されない , ある文はル の値が定数だったりすて、に計算されている 想もしなかったところへいく , ある文は ( そ 数はまったく存在しない , 制御フローが予 るような結果をもたらすことがある ( ある変 る。最適化されたコードは時々びつくりす U CC は・ -g' と・一 0 ' の同時使用を認めてい ほかの多くの C コンパイラと異なり , GN 作する。 B 用 ( * 16 ) ) 。 GDB はこのデバッグ情報ても動 ム標準フォーマットて、出力する ( DBX や SD デノヾッグ情報をオペレーティングシステ gcc 用環境変数 gccbin ディレクトリのコマンドを優先的に実行し 行する場合に , この環境変数て、指定された リて、す。 gcc. exe は , cpp, ccl, 旧などを実 djgcc の実行形式が入っているディレクト った する。 すべての警告 ( warning ) メッセージを禁止 ます。 誤りがあるように見えても , 正しく動作 があるためて、ある。 以前にデータフローから取り除かれること ことがある。そのような計算は警告の出力 変数に対しても , この警告は出力されない 使用されない値の計算のみに使用される い ジスタに割り付けられていても出力されな 共用体 , 配列変数に対しては , それらがレ 数に対しては出力されない。また , 構造体 , または大きさが 1 , 2 , 4 , 8 バイトて、ない変 宣言された変数 , アドレスがとられた変数 , してのみ出力される。したがって , volatile この警告はレジスタ割り付けの候補に対 は出力されない ( * 17 ) ・一 0 ' を指定しなかった場合 , 単にこの警告 れるデータフロー情報を必要とするため ) 。 合にのみ可能になる ( 最適化時にのみ計算さ この警告は最適化コンパイルを行った場 自動変数が初期化されずに使用された場合 力に加える。 以下の事例に対する警告メッセージを出 Fig. 2 djgcc のコンノヾイル実行例 G 〉 g00 -0 -0 test -foni t - f 「 a 第 e -00i れ t ・「 - test. C 宮 CC vers i on 1.39 日 : / し ANG/DJGCC/BI N/cpp. exe -undef -D—GNUC— -Dunix - Di386 -0-- 聞 【・ st. 0 G: /ccAA_AAA. 0P0 浦一 86-- -0 ー 0 諸 IZE GNU CPP 冊門 ion 1.39 H:/LANG/DJGCC/BIN/cc1. exe G : / ccAA - A. 叩 0 -quiet -dunpbase te を t. 0 - f0 第 i い f me-pointer -0 - 冊「 siO -0 G:/CCAA—AAA. 5 GNU C version 1.39 ( 80386. BSD syntax) conpiled by GNU C 冊「 5i0 れ L39. defau lt い「 g ” itches : - 第 8038 ? H:/LANG/DJGCC/BIN/as. exe -0 te 虹 . 0 G:/ccAA_AÅA. s H : / LANG/DJGCC/BIN/ld. exe -0 tes t 日 : / い NG / DJGCC / い 8 / 0 「 t0.0 t [. 0 - するコードすべてを検出て、きるほど GNUC C がかしこくないため , この警告はオプショ ンになっている。たとえば List 1 ー①のよう なコードが該当する。 y の値が常に 1 , 2 , 3 のどれかて、あるなら ば x は常に初期化されるが , GNUCC はそれ を知ることがて、きない もうひとつのよくある例 (List 1 ー② ) ては save ー y は代入された後にのみ使用されるた めバグはない いくつかのにせの警告を防ぐために , 制 御が返ってくることのない関数をすべて vo latile と宣言するとよい 非 v 引 at ⅱ e 自動変数が longjmp の呼び出しで 変わることがある場合 この警告もまた最適化コンパイル中にの み有効となる。 コンパイラは setjmp 呼び出しのみを検査 する。 longjmp がどこて、呼び出されるかはわ からない ( 実際 , 割り込みハンドラはコード 中のいかなる場所からて、も呼び出される可 能性がある ) 。結果として , 実際には問題が ないような場合 ( longjmp が問題を起こす場 所て、は実際には呼び出されることがない場 合 ) にも警告を受けることになる。 関数が値を返したり返さなかったりする場 合 ( 関数本体の終わりに制御が到達すること は値なしの return とみなされる ) たとえば , この関数はこの警告を受ける。 78 C MAGAZINE 1991 11

5. 月刊 C MAGAZINE 1991年11月号

学 五ロ 想定していない設計になっています。しか も GDC にはワード単位て、アクセスて、きるよ うに , ビットの順番を入れ換えるように結 ああ , 情けない 線してあるという・・ Fig. 6 ビットの並び方 低 位 位 ア ア← 0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 0 1 2 3 4 5 レ ス ス byte 1 byte 0 Fig. 5 メモリ上でデータを拡張する (a) リトルエンティアン 低位アドレス ↓ c のアドレス→ ←移動しなくてよい ' a ' ( 0X61 ) 0X61 0X00 0X00 0X00 ゼロを入れるだけ ↓ 高位アドレス (b) ビッグエンディアン 低位アドレス ー ] O で注意する点 高級言語て、のプログラミングて、は , 通常 はエンディアンの違いはプログラマに見え ません。しかし , C は高級言語とはいうもの の , コンヒ。ュータのアーキテクチャのかな りの部分を言語に反映しているのて、 , とき としてエンディアンが問題になることがあ こて、はそういった問題を取り上 ります。 げます。 位アドレスにきます。つまりアドレスが増 ポインタのキャスト 工ンティアンとピントの関係 えるに従って , ビット番号が減っていくよ C は単項の & 演算子によって変数のアドレ うな並び方になります。または , MSB を bi スを取ることがて、き , さらにそれをキャス t0 とすれば , アドレスが増えればビット番号 こて、はさらに進めてエンディアンとビ トによって別の型へのポインタに変換する も増加することにはなりますが , 通常の番 ットの関係を見てみましよう。 ことが許されています。この型変換の柔軟 号づけとは異なりますのて、ちょっと妙な感 バイトは 8 個のビットて、構成されていて , さが , 逆にエンディアンの間題を引き起こ もっとも上位の ( 重みのある ) ビットを MS じがします。 68000 を採用した Macintosh の す原因となってしまいます。 ツールポックス ( サプルーチン集 ) にはビッ B, もっとも下位のビットを LSB と呼ぶこと たとえば List 1 を見てください。まず i は はご存知て、しよう。通常は LSB を bit0 とし ト操作のためのエントリがありますが , ビ 0X1234 て、初期化されています。関数 main の て , MSB に向かってビットの重みが増える ット番号の指定は MSB を bit0 として数える 中て、は i のアドレスを取っています。このア に従ってビット番号を増やしていきます。 ことになっています。 ドレスの型は int * となりますが , それをキ リトルエンディアンならばこの考え方て、非 メモリをビット列として考えることが重 ャストによって char * に変換しています。 常に素直にすべてのメモリをビット列とみ 要になる場合としてグラフィックスの処理 そしてそれを単項 * 演算子によって間接参 なすことがてきます。 Fig. 6 を見てくださ があげられます。描画などはビット操作て、 照し , そのアドレスの 1 バイトを取り出して 実行されますから , 表示のためのフレーム い。これは 2 バイトをビット列として並べた います。キャストをしてもアドレスの値そ 例て、すが , これをそのまま拡張すれば全メ バッフアをビット列として扱えるように設 のもの ( つまり , ビットパターン ) は変化し モリをビット列とすることが可能て、す。 計することは大切てす。そうしないと高速 ませんから , この操作は簡単にいえば「 i の先 な処理が期待て、きません。 PC ー 9801 シリーズ もちろんビッグエンディアンて、も同様の 頭バイト , つまりもっとも低いアドレスに 考え方はてきますが , 前述の例のように素 のグラフィック VRAM の構成を見てくださ あるバイトの値を取り出す」という動作にな 直にはいきません。ビッグエンディアンて、 い。 PC ー 8801 の設計を引きずったのかどうか ります。 は LSB は高位アドレス側にあり , MSB が低 知りませんが , バイト単位のアクセスしか ↑ c のアドレス→ 0X00 0X00 0X00 0X61 ' a ' ( 0X61 ) ゴミ ァータを移動する必要がある ↓ 高位アドレス C 言語雑学講座 119

6. 月刊 C MAGAZINE 1991年11月号

00 ライフラリ開発技法 TabIe 12 List 25 のライプラリの機能概路 ライプラリ名 fptr(s,o) peek(s,o) peekb(). 0) poke(). 0) pokeb(s,o) のになります。 そのほかの処理系 (a) CS の調査 CS を調査するのはちょっとめんどうて、す。 アセンプラて、あれば , スモールコードメモ リモデルのとき一発て、わかるし , ラージコ ードメモリモデルて、も関数を組んてスタッ ク上にブッシュされているリターンアドレ スを調査すれば一発なのて、すが・・ は , 9 行目の宣言により s という名の SR は , こて、は C 言語のみを使って解決する方法 EGS 構造体を持ちます。 これは内部リンケ code= (segread ( & ージを持ちますから , ほかのソースファイ となりますにこて、カンマ演算子を使う理由 を考えましよう。 8086 用のほとんどの処理 ルの識別子 ( 名前 ) と衝突することはありま は , 「明解 ANSI C 言語入門講座」 ' 91 年 9 月 系には ,segread という関数が用意されてい せん。また 15 行目て、定義されたマクロによ 号を参照してください ) 。まず segread 関数を ます。 segread 関数は , <dos. h> て、定義され s. 呼び出して , り , getCseg は (segread ( & s) , s にセグメントをセットし ている SREGS 構造体に現在のセグメント値 0 と置き換、ら 0 ます ! たと、ば , てもらい , コードセグメントに相当するメ を格納する関数て、す。 getCseg ( ) ンバ cs を返します。これによって無事に現在 List 26 をインクルードしたプログラム COde Fig. 23 ポインタのセグメント値 / オフセット値を得る 機 能 セグメント s, オフセット 0 の値を持つ fa 「ホインタを作成する セグメント s , オフセット 0 のアドレスにあるワード値を得る セグメント s , オフセット 0 のアドレスにあるバイト値を得る セグメント s , オフセット 0 のアドレスにワード値を格納する セグメント s , オフセット 0 のアドレスにバイト値を格納する fa 「ポインタ (a) ポインタ s のオフセット値を得る nea 「ポインタ セグメント オフセット (unsigned) にキャスト (b) ポインタ s のセグメント値を得る セグメント オフセット (void far * ) にキャスト DS 上位 16 ピットを 取り出す 特集ライプラリ開発技法 71

7. 月刊 C MAGAZINE 1991年11月号

ます ) , void print(char (*p) [ 6 ] , int n) の意味を持ちます。 p の指す『大きさ 6 の配 列』の型て、あることを示すために , どちら の記述方法においても 6 を省略することはて、 きません。 p は s [ 0 ] を指し , *p は s [ 0 ] のェイリアスとなります。関数と引数の関 係は , Fig. 6 のようになります。 * p は [ ] 演算子を適用すると p [ 0 ] とも記述て、きま す。 よって p [ 0 ] は s [ 0 ] の別名となり , れて、 p は s と同様に使えます。混乱しないよ うに , 重要な点をもう一度整理しましよう。 ①多元配列は , 配列の配列て、ある。すな わちその要素がたまたま配列て、ある配 列が , 多元配列て、ある。 ②関数の引数として配列の受け渡しを行 うには , 配列の先頭要素へのポインタ という形式て、行う。 ③よって引数として多元配列の受け渡し を行うには , 配列て、ある先頭要素への ポインタという形式て、行う。 このことから print 関数の呼び出し print(), i) ・ の s は , &s [ 0 ] のことて、あって , &s [ 0 ] [ 0 ] のことて、はないとわかります。 Fig. 7 ホインタの配列による文字列の配列 Fig. 5 2 元配列による文字列の配列 p[O] pC2] ” Tu 「 bo ” ” MS ” ” LSI" sCO] sC2] * [ 2 い、 \ 0 Fig. 6 関数呼び出しと引数の授受 多元配列に対して特別なことはない。 たまたま配列の要素が配列になってい ることにのみ留意すればよい ポインタの配列による実現 たとえば char *p ” ABC ” のようにポインタを使って文字列を表せま す。ポインタの三つの配列を定義すれば , 三つの文字列を表せるはずて、す。ポインタ の配列を使って文字列の配列を実現したの が List 7 てす。ポインタの配列は , char * p [ ] pCO] s[O) main 関数 print(), i) LEN] print 関数 char p int n sC2] ・ pC2] 128 C MAGAZINE 1991 11

8. 月刊 C MAGAZINE 1991年11月号

態は盤の色の種類と個数 ( cell. bc ) , 玉の色の る。同様に (x) が単位べクトル ( ひとつの要 種類と個数 ( cell. pc ) て管理 ) 。 2 ~ 3 倍高速化。 素のみ 1 て、あるもの ) の判定 (macro : is elm 最小の素数 ? 一度置いた玉の色は変わらないのて、 , 隣接 ) は ! ( ( x ) & ( x ー 1) ) て、可能て、ある。たとえば x = する玉の色とクポミの色から , そのクポミ 0X3450 なら (x)& (x-l) = 0X3450 & 0X344f = 次の式を見ると , 左辺はすべて素数て、 , 素 に置ける色がなければ試行を打ち切り , 置 0X3440 て、あり , x = 0X0010 なら (x) & (x-l) = 因数分解になっている。左辺をもっとよく見 ける玉の色がひとつに決まればその玉をほ 0X0010 & 0X000f = 0 となる。 ると , 1 ~ 9 の数字を 1 度ずっすべて使って組 かのクポミに使えないように予約しておく 制作機種 , 制作コンバイラ み合わせてある。 ( 関数 update 内 )。 2 ~ 3 倍高速化。 X68000 PRO 2X7X853X6491 = 77515522 隣接点の座標を毎回計算するのはムダな GCC Ver. 1.39 ( オプション : -O) こて、問題。上の例のように , 「 1 ~ 9 の 9 個 のて , 初期設定 ( 関数 init ) て、隣接点の管理情 参考文献 , 参考プログラム の数字を 1 度ずっすべて使って組み合わせて 報 cell へのポインタ (cell. neigh [ 8 ] ) を作成 『マイコンパズル学入門⑨ソリテアの巻』 作った素数の積」が最小になる組み合わせを しておく ( 高速化 2 倍 ? ) 。 小谷善行 , 電子科学 , 70 ~ 75 頁 求めてください。例て、は 4 個の素数の積にな 一度試行した配置は , ふたたび試行しな 感想 っているが , 何個の積てもよい。ちなみに、、 1 〃 いように配置を表 maps に登録し , 表の索引 電脳クラブは毎回楽しませていただいて は素数てはない を高速にするためハッシュ技法を用いる ( 参 おります。教科書的に素直に組んだプログ ついて、にもう 1 問。「 1 ~ 9 の 9 個」てはなく 考文献および関数 put in ) 。ハッシュ関数に ラムは実行に 6 時間かかったが , いくっかの て , 「 0 ~ 9 の 10 個」てはどうなるだろうか。た 高速化技法により , 3 秒を何とかクリアてき よってシノニムの発生確率が若干変わるが , だし , 0 は各素数の最上位桁にはてきない 演算時間を考慮して 2 のべき乗士 1 の素数を 自己満足しております。 定数に選んて、いる ( GCC の定数乗算の最適化 ■正解者からのメッセージ に感謝 ) 。 10 ~ 20 倍以上高速化。 成し , 下記の応募規定に従い , ディスクて、下 色の種類と個数を表すのにべクタ表現を C て、まともにプログラムを書いたのは初め 記の宛先 , または電子メールて、 R & R に記さ 用いる。色の種類を 16 進の桁位置に対応さ てて、すが , とにかくコンパイルエラーをな れている ID 宛に解答をお寄せください。なお せ , 各桁の値てその色の個数を表す。赤 r くすのに苦労しました。答えがひとつだけ 電子メールの場合は , LHA て、の圧縮ファイル というのは意外てした。それだけに今ひと 個 , 青 b 個 , 黄ⅵ固 , 黒 n 個 , 白 w 個のべクタ や ish ファイルて、お送りいただいても結構て、 つ自信がありません。 す。締め切りは 11 月 18 日必着とします。 は 0x000wnybr と表せる。使える玉の判定 ・パズルの標題 , 解答の明記 (macro : nez, 0X77777777 を加算して 8 以 上の桁を見つける ) , 周囲にない色の判定 ・作成するプログラムは C 言語のみ 今回 , 初めて応募します。アルゴリズム (macro : eqz, 0X88888888 から減算して 8 ・使用機種 , コンパイラおよびオプション の桁を見つける ) が簡単にインプリメントて とデータ構造入門 < 第 13 回 > の記事を読ん スイッチの明記 きる。判定した結果は対応する要素が 1 てあ て挑戦してみることにしました。 8 クイーン ・プログラム作成に参考とした文献 , プロ の解法用の高速化のアルゴリズムが思い浮 るようなべクトルて、表現する ( 下記を合わせ グラム ておそらく 10 倍程度の高速化 ) 。 かばなかったのて順番に試すようにプログ ・ 800 字程度のプログラムの説明と感想 着手の選択て、は , べクトルの最右端の要 ・連絡先 ( 住所 , 電話番号 ) ラムしました。実行に VM て、約 3.5 時間かか 素の抽出 (macro : rmo) を 2 進数の性質を用 り , 得られた結果がたったひとってしたが , ・上記をすべてテキストファイルにすること いてインプリメントする。 2 進数 (x) が 2 の補 間違ってはいないと思います。今後も解け なお , お送りいただいたディスクなどは 数て表されるとき , 負数 ( ー x ) は x の 1 の補数 たら応募したいと思います。 返却てきません。ご了承ください ( - x ) に 1 を加えたものだから , 値が 1 て、ある最 ( 茨城県竜ヶ崎市倉田義次 ) 宛先 右端のビットより上位のビットについては 〒 108 応募の規定 ( x ) & ( ー x ) の演算て 0 になる。たとえば x = 0 東京都港区高輪 2 ー 19 ー 13 NS 高輪ビル X3450 とすると -x=0xcba0,-x=(-x) 十 ソフトノヾンク株 1=0xcbb0 なのて , (x)& (-x) = 0X0010 とな パズルの解答を導き出すプログラムを作 C マガジン編集部「 C マガ電脳クラブ」係 今月のノヾズル ( 岩手県盛岡市宇土沢康 ) 0 マガ電脳クラブ 153

9. 月刊 C MAGAZINE 1991年11月号

習′ ief C 言語で組めるマクロ / .3.0 ? ,. プログラミングエラター新世紀。 の第毒 1 、 C080 ( 。 00 の 2 のの 3 習「 i 住 f 全米のプログラマが認めた実力 / アメリカでは「プリーフ」が プログラミング用工デイターとして 最も多く利用されていま魂 1 . datascaling(X 、 "' data) ; mOde var datum 自動構文生成ができる言ま exit(l); 1 : 1 = 00g0 : い、 ) { or ( 1 、、 0 は 0 = 000000 , ⅵロ , 0 、 00-0 、 printf exit(l integer ; = 。、。 pascal 、 or 1 : begin ー k 、 d0t00 [ i ] ・ y* if 00d0 = in 、れ 00 datUmtil ・ Y : for ( ; : 384 : S Z if (fpnt) { getch() : oxOd) れをれ 0 な 0 れ 0 0 ~ , 0 わ 0 02 ~ 日ゴ & e thc e わ 0 ゴ f. 0 な 0 戸 = 1 , 31 21 い ) ' = 工し下 cD ( 5 ) 冫 0 、 00 、 0 、、 00 ー 0 、 22 ( ) 工し下 CD ( 2 ) 0 、、 0 、 0 よりパワ刀レで、よりエレガントな プログラミングのために ・ C 言語で組めるマクロ 使い慣れている C 言語でマクロが組めますから、習得が簡単でカスタマイズも思いのまま です。 ・マクロのスクリーン・デバッガ ソースコードでデバックできます。もちろんプレークポイントやウォッチ・ドッグもセットできます。 ・テンプレート機能く構文の自動生成 > C 、 Ada 、 Basic 、 COBOL 、 FORTRAN 、 MODULA2 、 Pasc 引で構文を自動生成します ・ 300 回ものアンドゥ 各ファイルごとに 300 までの操作を元にもどすことができますので、やり直しの面倒を気に せず、安心して編集できます。 ・安全編集 Bnef は、一定時間キーを操作しないこと最新の編集内容をファイルに自動保存します。だ から編集中に電源が切れても安心です ・その他の主な新機能 キー操作のファイルへのセープとリプレイ、処理可能行数を拡張、リジューム機能、 Ctrl キー・アサイン ( オプション ) 、メニュー ( オプション ) etc 。 0 レ 0 sa 0 obtat ーユれ 4 の 0. 、 0 れをや廴もなお て 0 口 60f 0 , サ プロクラミンク・エテイター日本第版 FulI Screen Editor ! 物、 : 、物物物・第第・物第に第を・第を 第 ! ス洋物 . 第、イート第 . する・今 . 当ま 日システム櫞式会社 アメリカでも日本でも高い評価 ・プログラミング向き工デイターを探している人は、もう探す必要はない。 (Jerry Pournelle /BYTE) ・ソフト開発には強力なツール、 300 回のアンドウは大きな特徴。 ( 日経バイト ) ・既存のエデイターに不満を覚えたら、これしかない。 (Oh! FM) ・まるで夢のようなアンドゥだ - ーーおもわす間違うのを期待してしまいそうだ。 ( The C Users JournaI) ・主な機能 ◆ 55 ウインドウ◆無限のファイル◆自動コンバイル◆自動工ラー・ジャンプ◆自動インデント◆自動テンプレート◆ バッファ書出切換′削除リスト表示◆ファイル名の指定 / 表示 / 変更◆パ、アップ保存◆特殊文字入力◆ 2 行 を 1 行に連結◆ファイル単位の挿入◆増分検索◆各種マーク / 始・終点の入換◆プロックのカット / コピー / ペー スト印刷保存 / 左右へのシフト◆対応する括弧へ移動◆ C 言語のコメント化 / 非コメント化◆ DOS コマンドの実 行◆キー操作記憶 ' 実行◆入力ヒストリー◆英文テキスト整形◆タブのスペース挿入◆拡張子毎に異なった設 定ができるタブ◆検索置換バターンの画面からの入力◆英字の大小文字変換その他 ■ 5 機種対応パッケージ 48 , 000 円 ( 東芝、 NEC 、 AX 協議会、旧 M 、富士通 ) ・ 5 2DD 、 3.52DD デュアルメディア・ MS ー DOS3.1 以降に対応・ 英語 DOS では使用できませんが、英語版 BR 旧 F もセット販売いた しております・お急ぎの方、上記以外のメディア希望の方、英語 BRIEF のセット販売希望の方はユーザー・サポート係までご連絡 下さい。 日本システム槽式会社 ・お問合せは 東京都立川市曙町 1 ー 18 ー 2 ー清ビル立川事業所 Brief ユーザー・サポート係 TEL0425 ー 23 ー 4469 FAX0425-27 ー 6127 く資料請求番号 1 / 8 〉 0 新機能 消費税は含まず )

10. 月刊 C MAGAZINE 1991年11月号

Li st 1 Li st 1 break; default: game-abort ( ” def—sprite-file: 未知のスプライトタイプ” ) : break : 298 : 299 : 300 : 301 : 302 : 303 ・ 304 305 306 307 308. 309 310 311 ・ 312 313 314 315. 316 : 317 : 318 : 319 : 320 : 321 : 322 : 323 : 324 : 325 : Sprite def—sprite_fi le (enum sp_type i nt an ime) 326 : char *fname, 327. 328 : int x, y; 329 : int end x, end_y; 330 : FILE *fp; 331 : Sprite ret—val : 332 : switch (type) 333 : 334 : 335 : case D 16 : end_x = 1 : 336 : 337 : end-y = 1 ; 338 : break ; 339 : case D 32 ユー 2 : 340 : end_x 341 : end—y = 2 ; 342 : break ; 343 : case DOT32 ー 2 ー 1 : 344 : end_x = 2 ; 345 : 346 : break; 347 : case DOT32 ー 2 2 : 348 : end_x = 2 : 349 : end—y = 2 : 350 : break ; case D 48 ー 1 ー 3 : 351 : end_x = 1 : 352 : 353 : break : 354 : case DOT48 ー 2 3 : 355 : end_x = 2 ; 356 : 357 : break; 358 : case D 48 ー 3 ー 3 : 359 : end x = 3 ; 360 : 361 : 362 : break ; case D 48 ー 3 ー 1 : 363 : end_x = 3 ; 364 : 365 : 366 : break; case D 48 ー 3 2 : 367 : = 3 ; 368 : end_x 369 : break ; default: break ; 370 : 371 : 372 : 373 : 374 : 375 : 376 : 377 : 378 : 379 : 380 : 381 : 382 : 383 : 384 : 385 : 386 : 387 : 388 : 389 : 390 : 391 : 392 : 393 : ・ 394 : 395 : 396 : 397 : 398 : 399 : 400 : VO id 401 : move—sprite_diff (Sprite sp, int dy) int dx, 402 : 403 : { int x,y; 404 : 405 : int end—x, end—y; switch (SPD TYPE (sp)) 406 : 407 : case D 16 : 408 : end_x = 1 : 409 : 410 : break; 411 : case D 32 ー 1 ー 2 : 412 : end x = 1 ; 413 : end-y = 2 ; 414 : break; 415 : case D 儺 32 ー 2 ー 1 : 416 : end_x ニ 2 ; 417 : 418 : end-y = 1 : 419 : break ; 420 : case DOT32 ー 2 ー 2 : 421 : end x = 2 ; 422 : 423 : break; 424 : case D 礙 48 ー 1 ー 3 : 425 : end x = 1 ・ end-y = 3 : 426 : 427 : break ; 428 : case D 師 48 ー 2 ー 3 : 429 : end_x = 2 ; 430 : 431 : break ; 432 : case D 48 ー 3 3 : 433 : end_x = 3 ; 434 : end-y ニ 3 : break; 435 : case DOT48 ー 3 ー 1 : 436 : end_x ニ 3 ; 437 : 438 : 439 : break ; case DOT48 ー 3 2 : 440 : 441 : end_x = 3 ; game-abort ( ” def-sprite-file: 未知のスプライトタイプ” ) ; ret—val = (Sprite) 110C (sizeof (struct SP—DATA)) : if (!ret—val) game—abort ( ” dup—sprite: メモリ不足” ) : SPD_TYPE (ret_val) = SPD_TYPE (sp) : SPD_MOVE_FUNC (ret_val) = 0 ; SPD_LIFE (ret_val) = 0 ; SPD_REGIST (ret_val) SPD_ANIME_VTR (ret_val) 0 ; for (y = 0 ; y く 3 ; y + + ) for (x = 0 : x く 3 : x + + ) SPD_BODY (ret_val, x, y) for (y ニ 0 : y く end—y; y + + ) (sp, x, _x; X 十十 ) for (x = 0 : x く end ニ copy—sprite (SPD—BODY SPD_BO DY ( ret_va 1 , return ret val : fp = fopen (fname, if (!fp) game—abort ( ” def—sprite_fi le:File 0 n 工ラー” ) : = (Sprite) 110C (s izeof (struct SP—DATA)) : ret_va 1 if (!ret_val) game-abort ( ” def-sprite—file: メモリ不足” ) ; SPD_TYPE (ret_val) = type; SPD_MOVE_FUNC (ret_val) ニ 0 : SPD_LIFE (ret_val) = 0 : SPD_REGIST (ret_val) SPD ANIME_PTR (ret_val) 0 ; for (y = 0 : y く 3 ; y + + ) for (x = 0 : x く 3 : x + + ) SPD_BODY (ret_val, x, y) = 0 : for (y = 0 : y く end-y; Y + + ) for (x = 0 ; x く end-x; x + + ) SPD_BODY (ret_val, x, y) ニ read_file and mke_sprite (fp, anime) ; return ret val ; 100 C MAGAZINE 1991 11