恥ずかしな力あドジりました 第 7 回 系統的プログラミングエラーについて C に有のエラーとは ? プログラミング雑誌て、ある本誌を , なん とか「おもしろい」ものにしたい , と願う試 行て、ある本連載も , 早いものて、もう 7 回目て す。 これまては , とくに脈絡もなく , その時 点て、思いっくテーマを取り上げてきました が , 本連載をもっと有意義なものにするた めには , プログラミングエラーとその原因 を , より系統的に展望する必要があるのて、 はないて、しようか ? 系統的といっても , 私はプログラミング 教育の現場に従事する者て、はないのて , プ ログラミングエラーについて多数の事例を 知りうる立場にはありません。ときどき友 人などから聞く話を除けば , ほとんど , 私 個人の経験に基づく話しか書けません。 したがって本連載が , たんに私個人のバ 力さかげんを暴露するだけのものて、あるの か , あるいは広くも尊くも , 人間性全般に 通ずる何かてあるのか , それは神のみぞ , ならぬ読者のみぞ知る , てあります。この キ / コが , 致死の毒キノコてあるのは , 彼 にとってのみだったのだろうカ さて , C のプログラミングエラーを系統的 に見ていこうとするとき , 最初に思いつく 分類法は , ① c に固有のエラーと②プログラ ミング上の論理的なエラーて、す。 C に固有のエラーとは , C 言語に対する知 識が不十分なために起きる錯誤やヘマのこ とてす。これは BASIC など , ほかの言語を 経験した人が犯しやすいエラーだ , ともい えます。たとえば等価を表す関係演算子は = 〃だ , と最初から頭にたたき込まれて 120 CMAGAZINE 19 6 岩谷宏 いた人なら ( C て、は代入演算子てある ) とを誤用することはないてしょ 使えない場合があります。 うまく これまての実用経験がないだけに すぐに理解て、きる概念てすが , なにぶん , があります。どちらも難解な概念てはなく , 彼にとって新しい概念に , 構造体や共用体 たとえば , BASIC 人間が C を学んだとき , ります。 たは理解が浅いために犯すドジやヘマがあ ー第コロロ 次に 旨の特長や機能への無理解 , ま ます。 が捕捉してエラーメッセージを出してくれ とんどのシンタクスエラーは , コンパイラ ンタクスエラーが代表的てす。しかし , ほ 特定の言語に固有のエラーとしては , シ 優先しながら , 扱っていこうと思います。 て , どちらかというと , C に固有のエラーを 本誌は「 C MAGAZINE 」て、ありますの す。 関しての錯覚〃は , こちらの部類に属しま どのことて、す。前回の , ヾ数を数えることに 言語を使っても犯しうる , 論理的な錯誤な 用いる言語の特性には関係のない , どんな プログラミングの論理的なエラーとは , 王 語とメモリの 御という問題 アセンプラてたとえば , head db 6 dup(?) db 122 dup(?) msg のようにメモリを確保すると , head の位ヾイ トと msg の 122 バイトは , メモリ上ても物理 的に連続した領域になります。 そこて , たとえばファイルから head 番地 以降に 1 行を読み込み , 別のファイルに msg 番地以降を出力する , といった処理が可能 てす。つまりこれは , 各行の冒頭の 6 バイト を削除したファイルを別に作る , という処 理てす ( ここて、は , 1 行があまり長くない とを想定しています ) 。 しかし , C のグローバル変数の定義て、次の ようになっていたら , どうてしようか ? char head[6]; char msg [ 122 ] ; C にかぎらず , ほとんどの高級言語が , 変 数のメモリ上の位置やその並び順などにつ いては , プログラマに対して何も保証して くれません。 配列 head にヾイトを超える文字数を読み 込んて、も ( あるいは代入しても ) , C てはエラ ーになりません。こういった点を , ある人 は , 「 C のすばらしい自由」といい , 別の人 は , 「高級言語としての C のバグだ」といいま す。ともかく , サイズを超えた配列アクセ スに対する無チェックという , このすばら しい自由なバグ ( ? ) は , ANSI ても黙認され てしまいました。 しかし , head に長い文字列を読み込んだ 場合 , 6 バイトを超える部分が配列 msg に入 はもっと簡単て , 構造体や共用体を使うま ただし , 上記の特定の例に関しては , 話 いう機構によって満たしています。 プログラマの欲望を , C は構造体や共用体と きには何かしら一体的に扱いたい そこて , 複数の異なる名前の変数を , と 確保します , とは約束していないからてす。 書かれている順序てメモリ上に変数領域を ンパイラはプログラマに対して , ソースに ってくれる , という保証がありません。 C コ
の解放は , f 「 ee ( ) 関数を使用しなくても , プ れていく。 malloc() 関数と ログラムを終了したときに自動的に解放さ また , p 「 intf ( ) 関数を使用して格納された free( ) 関数の使用仞 れるが , サンプルてはていねいに領域の解 領域から読み込みを行っている。ここて、 buffe 「 変数を使用している。 buffe 「変数は , 先ほど 放を行っている。 も説明したように確保した領域の先頭アド m 訓。 c ( ) 関数は , 指定された値をヒープ領 レスを格納している。その先頭アドレスか 域にユーザ領域として割り当てる関数て、あ ら p 「 intf ( ) 関数が読み込んて、いる。ただ , 文 る。 f 「 ee ( ) 関数は , m 訓。 c ( ) 関数によって割 字列が格納されたときは , その先頭アドレ り当てられた領域を解放する関数て、ある。 スタックにどれだけ利用可能サイズがあ スがズレながら格納されていくわけて、はな 実際にサンプルのプログラム ( List1 ) を見 るのか , stackavail( ) 関数を使って調べるこ い obuffer には , つねに m 訓 oc ( ) 関数によっ てみよう。このプログラムは , TurboC と MS とがて、きる。そして , スタック領域を指定 て割り当てられた領域の先頭アドレスが格 ー C て、コンパイルすることがて、きる。たた サイズだけ確保する関数は訓。 ca ( ) 関数を使 納されている。 し , ヘッダファイルがそれぞれ異なってい 用する。ただ , この関数は MS ー C Ver. 5.1 格納した文字列の読み込みが終了すると , るものがあるのて、注意がいる。つまり , Turb0C だけにしかサポートされていないのて , MS 割り当てられた領域を解放するために f 「 ee ( ) ては , alloc. h を使用し , MS-C て、は mal -C Ver. 5.1 以外て、はコンパイルて、きない 関数を実行している。 f 「 ee ( ) 関数には , 領域 10C. h を使用しているのて、ある。そのための プログラム (List2) を見てみよう。メイン の先頭アドレスが格納されている buffe 「を指 ヘッダファイルの選択を # if と # se を使用 関数には void 修飾子がついていて , メイン 定しなければいけない。指定されたた領域 し , コンパイル時に自動的に切り換えてい スタックサイズを調べるサンプルプログラム ただし , プログラムが ANSI に準拠してい るなら , く stdlib. h > のヘッダファイルを選 択すればよいのて、 , そのときは , #if と #else の部分を削除する。 次に , メイン関数て、は返り値がないのて、 void 修飾子をつけ , 引数もないのて、 void を 置いている。 buffer は cha 「型のポインタ変数 て、ある。この変数には , m 訓。 c ( ) 関数によっ て割り当てられた領域の先頭アドレスが格 納される。割り当ては , 10 バイトを指定し ている。もし , m 訓。 c ( ) 関数の実行て、失敗し たなら , 工ラーとして NULL が返されるの て、 if 文ては , NULL に等しいかどうかのチェ ックを行っている。工ラーの場合には , 工 ラーメッセージを出力してプログラムを終 「させている。 次にユーザがスクリーンから文字列を入 力するためのメッセージを p 「 intf ( ) 関数を使 って行っている。メッセージが出力される とカーソルは scanf ( ) 関数のために入力が行 われるまて、ウェイトすることになる。スク リーンから入力された文字列は , 格納先と して buffe 「変数を指定しているのて、入力され た文字列はそのまま確保した領域に格納さ List 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 13 : * / 14 : 15 : #include く stdio. h> 16 : #include く stdlib. h> 17 : #include く malloc. h> 19 : void main ( void ) Char *buffer; 22 : printf("stack avail = %d Yn" 23 : 24 : buffer = alloca( 100 ) : if( buffer = NULL ) 26 : printf("stack allocation failed. Yn") : exit ( ー 32 : 33 : 34 : A. Akitu 1990 ー 04 ー 01 MSC v5. 1 cl /AS /W3 sta. c Programmed by Dated Compi ler Version Purposed 最初にスタックサイズを調べ , スタック領域を指定サイズ だけ消耗させる。 もう一度同じ関数を使ってスタックサイズを調べる。 stackavai 1 ( ) ) : else printf("stack allocation successed. Yn") : printf("stack avail ニ %d Yn", stackavail ( ) ) : 92 CMAGAZINE 1990 6
ライフホート 0 「 m 面 on from (ompiler Ma 「 5 file. dat Lattice C List 1 ー① fcntl.h ファイ・ル extern int read (int, char * , unsigned) : 「 wa 「 ning88 引数の型がプロ トタイプ宣言と一致しません」とい うエラーがでますが , どうしてで しようか ? warning なので無視し てもいいでしようか ? A この Warning は標準のヘッダ ファイルなどに宣言されている関 数のプロトタイプ宣言と実際に関 数が使われるときとて , 引数の型 が異なっていることに対する警告 てす。たとえば , List1- ①のような 例があります。 このとき , 「 ead 関数の第 2 引数は プロトタイプ宣言て、は , char 型へ のポインタて、すが , 実際に使用す るときは , int 型へのポインタにな っています。そのため , この場合 , read 関数を使っているところて , Warning88 が出ます。これは , 無 視してもかまいませんが , この警 告を消したいのならば , List1 ー②の ようにキャストすることによって 消せます。 また , List1- ③のような場合に も , Warning 88 が出ます。 この場合 , 第 1 引数の型が異なる ために , Warning88 が出ます。 れは , キャストして消してはいけ ない警告て、す。「 ead 関数の第 1 引数 は , fopen 関数が返してくるファイ ルポインタてはなく , open 関数が 返してくるファイルハンドルてな ければなりません。 このように , この Warning は無 視してもよい場合と , 無視てきな い場合があります。 Q&A 0 0 。。 f 関数の後で , g 。関数を 使用すると , gets 関数は入力待ち にならずに , すぐに抜けてきます が , これはなぜですか ? また , scanf 関数と gets 関数の間に getch 関数を入れると 'getch 関数 は入力待ちになるのですが ? A これは , scanf 関数と , gets 関 数ての , 駻 n 〃の扱い方の違いによ るものてす。 scanf 関数て、は , 空白文字 ( *n" 〃 t つを見つけるまて 読み込み , いったん読み込んだ空 白文字を ungetc 関数を使って , 戻 します。 キーポードから , 文字列を入力 し , リターンキーを押すと , プロ グラムからみた論理的な未入力文 字として , ヾ \ n クが残っていること になります。また , scanf 関数は , 先頭にある空白文字はスキップ ( 無 視 ) しますから , scanf 関数のみを 使っている場合には , 読み残した 、、 \ n 〃は無視されて , 次の項目が 正しく読み込まれます。 gets 関数は , 駻 n 〃文字を見つけ るまて読み込み , このとき , n 〃 も読み込みます。ただし , 読み込 まれた第 \ n 〃は , プログラムには 渡されず , NULL に変化します。 て、すから , scanf 関数の後 <gets 関数を使用すると ,scanf 関数が読 み残した駻 n 〃を gets 関数が読み 込んて , そのまま終了してしまう のて , gets 関数は入力待ちになら ずにそのまま抜けてくるわけてす。 この場合 , scanf 関数を使用する か gets 関数を使用するかて統一す るか , scanf 関数の後て、 getcha 「関 数を使って , 、、 \ n 〃を読み込んて、お く必要があります。このとき , getchar 関数の代わりに getch 関数 を使用することはて、きません。 scanf 関数 , gets 関数 , getcha 「関 数は MS ー DOS 標準入力 ( レベル 2 入 カ ) てすが , getch 関数は , コンソ ール入力て、 MS ー DOS て、の扱いが違 うためて、す。標準入力とコンソー ル入力の違いとは , コマンドライ ンから , リダイレクト ( < ) てきる かどうかの違いてす。標準入力 は , くを使ってファイルからの入力 切り換えられますが , コンソール 入力は , < を使ってもキーポードか ューザプログラム include く fcntl. h> int fh: int buf[100] : read(fh, &buf[0], sizeof(buf)) : List 1 ー 2 ) read(fh, (char *)&buf [ 0 ] , s izeof(buf)) : main( ) testl . c く例 > らの入力を待ちます。 printf("%n%c*n" C getch( ) : int C : List 1 ー③ ューザプログラム include く fcntl. h> FILE *fp: char buf[100] : read(fp, &buf[0] , sizeof(buf)) : test2 . c A>test1 < file. dat printf("*n%c*n' C getch( ) : int C : main( ) ( ここて、キーポード人力待ちになり lnformation 作 om Compiler Makers 153 A > ( キーポード人力は待ちません ) A>test2 <file. dat ると以ドのようになります ) ます。キーポードから B 〃と入れ
五ロ ニ : ロ はじめて学ぶ 0 プロクラ ミンク ンタ wl を進めておき ( fo 「文のところ ) , その あとに str2 をコピーしています。 9 ー 3 ー 2 ー 2 main 関数の引数 1990 年 3 月号てお約束した main 関数の引 数についてお話しましよう。 3 月号て挙げたサンプルが List14 てす。実 行してみてください。実行例を次に示しま す ( 実行例は環境によって異なります。下の 例は MS ー DOS の場合てす ) 。 A > list14 hello abcde 1 .2345 プロトタイプー体形宣言に対応していない Fig. 5 を見ながら説明しましよう oargc に A:*LlST14. EXE 処理系ては , はコマンドラインの引数の数が渡されてい hello void main(argc, argv) ます。これは実行ファイル名の数も含みま abcde int argc; す。先ほどの例ては , List 14 , he110 , 1 .2345 char * argv ロ abcde, 1.2345 の 4 ってす。したがって a 「 gc いかがてすか , 実行ファイル名 (List14) と と書きなおしてください。先頭は必ずしも の値は 4 となっています。 a 「 gv は引数を含む そのあとにつづけて書いた文字列 (hello, void< なくてもかまいません。というのも 文字列の配列を指すポインタの配列となっ abcde , 1.2345 ) が , プログラム中に取り込ま これは main 関数のヾ戻り値″に依存するた ています。たとえば a 「 gv [ 2 ] は文字列ヾ abcde 〃 れて出力されました。このように C< は ,main めて , ここて問題としていることとは話が の先頭アドレスをさしています。 関数の引数としてコマンドラインに書かれ 異なります。この argc, a 「 gv というのがミ * argv [ 2 ] は ' a ' という 1 文字を表していま た文字列をプログラム中に取り込み利用す ソてす。これらはそれぞれ , argument す。これをひとつ進めると ( a 「 gv [ 2 ] + + な ることが可能てす。 count, argument vectO 「の意味からつけた どとする ) 今度は 'b' をポイントします。同じ この機能を利用するためには , main 関数 変数名てす ( もちろんほかの変数名てもかま プログラムをポインタらしく書いてみます の引数を宣言する必要があります。 いません ) 。それては , コマンドラインの情 ( List15 ) 。これまてに出てきた話がオーバラ VOid main(int argc, char *argv ロ ) 報が , どのようにこれらの変数に格納され ップして , 前回と今回のポインタの総復習 これがその宣言てす。あるいはこのような ているのてしようか。 のようてすね。 main 関数の引数その 1 main 関数の引数その 2 A > list14 hello a bcde 1 .2345 ② ③ ④ プロンプト argv[Ol a 「 gv[l ] argv[21 a 「 V 3 注 ) ・ \ O は文字列の終りを示すコード ・ a 「 gv [ O ] についてはファイル名が フルノヾスで表示されている ・始めは各ポインタも各文字列の 先頭をさしている A:*LlST14. EXE*O h 訓 0 *O abcde \ 0 1 .2345 \ 0 List 1 5 List 1 4 い st15 m a i n 関数の引数その 2 2 : 4 : #include く stdio. h> 5 : 6 : VOid main(int argc, char *argv[]) while (argc- 8 : printf("XsYn" 9 : 2 : い st14 m a i n 関数の引数その 1 4 : #include く stdio. h> 5 : 6 : VOid nain(int argc, char *argv[]) 8 : int i; 9 : for (i 0 : i く argc : 十十 i ) printf("XsYn"' argv[i]) : *argv 十十 ) : main 関数の引数その 4 い st17 m a i n 関数の引数その 4 2 : 4 : #include く stdio. h> 5 : 6 : VOid nain(int argc, char **argv) wh ile (argc- 8 : for ( : **argv ! = ' \ 0 ' 9 : printf("Xc ” (*argv) 十十 : printf("%n"); List 1 7 main 関数の引数その 3 LiSt 1 6 い st16 m a i n 関数の引数その 3 2 : 4 : #include く stdio. h> 5 : 6 : VOid na in(int argc, char **argv) while (argc-- > の 8 : printf("XsYn", *argv + + ) : 9 : はじめて学ぶ C プログラミング 135
TIFF ( タグイメージファイルフォーマ RTF ( リッチテキストフォーマット ) メタファイル TIFF は画像データフォーマットて、ある。 イメージデータファイルの先頭部分にタグ 情報を付加し , イメージデータの内容がア プリケーションソフトて、判別て、きるように なっている。 RTF は , ワープロ文書の標準形式て、あ る 0PostScript と同様に , 制御コードも文字 列となっている。 RTF-J として日本語規格 化が進行中て、ある。 メタファイルは , Windows の表示関連命 令 GDI ( グラフィックデバイスインタフェイ ス ) に対応したファイル形式て、 , 文字 , 図形 などに中間形式として幅広く使われている。 このほか , ExceI などの表計算ソフト , デ ータベースソフト用の BIFF 形式なども , 規 格化の方向にある。 これらのデータを , 複数のプログラム間 て、稼働中にやりとりするための機能として DDE ( ダイナミックデータェクスチェンジ ) が提供されている。 Windows プログラマ 本誌読者のプロ , アマプログラマの方々 の関心事て、ある , ソフトウェア開発者から 見た Windows の利点 , 欠点を解説する。 プログラム設計 Windows て、稼働するソフトウェアを設計 する際の最大の問題点は , 『オプジェクト指 向を活かした設計がなじみにくい』ことて、 ある。マウス , プルダウンメニュー , アイ コン , スクロールノヾー , ダイアログ , リス トボックスといった単語を理解し , Windows の設計思想を理解しなければならない。外 部仕様を決定する際には , Excel や PageMa ker をひととおり使いこなす必要がある。 52 CMAGAZINE 1990 6 外部仕様が決定て、きても , 次に『情報不 明朝体 窓を開く ゴシック体 忘を開く れる。 すると半分以下の期間て、開発て、きると思わ DTP ソフトや作図ソフトも MS-DOS と比較 また , グラフィックスが扱いやすいのて、 , とも可能て、ある。 グして , 画面の遷移や操作性を検証するこ て、 , 画面設計をもとに実際にプログラミン メニューやダイアログも簡単に作れるの ラマには向いていないかもしれない るため , オリジナリティを追及するプログ ただ , Windows は操作性の統一が重要て、あ ば , それて、外部仕様は作成て、きてしまう。 決め , メニュー展開も ExceI のまねをすれ ラムスタイルガイドに沿ってメッセージを とも簡単て、ある。アプリケーションプログ 外部仕様の設計は , 理解してしまうとい ている。 は , これをカバーして余りある利点をもっ しかし , 問題点はこの程度て、 , Windows が咼い。 の大きなプログラムとなってしまう可能性 いと , センスの悪い , オプジェクトサイズ ェイス ) 関数の機能や用途を十分に把握しな API ( アプリケーションプログラムインタフ 機能設計 , モシュール設計も Windows の かもしれない るが , それがわかるまて、に数か月を要する 編集は EditControI という機能て、簡単に行え う問題が生じる。矩形領域内の文字列入力 , 足て、 Windows の資源が活用て、きない』とい プログラミンク プログラミングについては , ま ffWindows の設計思想の理解から入らねばならない Windows のプログラムは , Mac や BTRON 同様 , 『イベント駆動型』て、ある。従来のプ ログラミングて、は , 主役はプログラマて、あ った。自分て、 , ほしいときにキーポードか らデータをもらい , 表示したいときに勝手 に画面にデータを描いていた。 これが , イベント駆動て、は , OS 側が主役 となる。 Windows がアプリケーションプロ グラムに対して , さまざまな要求を突きつ けてくる。やれマウスがどこに動いただの , 画面を再表示しろなどというメッセージが , Windows から飛び込んて、くる 0Windows プ ログラマはその要求をセッセと処理しなけ ればならない。主役て、いたいプログラマに は Windows は向いていない このように , メインループがあり , その 中て、送られてくるメッセージを処理するプ ログラムとなるため , 他人が書いたプログ ラムは理解しづらいものとなる。 また , デバイス依存がない分だけ , 手続 きが複雑となり , プログラムは COBOL のよ うに冗長となる。画面に、、 Hello 〃と表示す るには , MS ー DOS て℃言語を使えば 1 行て、記 述て、きるが , Windows て、は数十行のプログ ラムとなる。 Windows のプログラミングは , 500 種類以 上の API 関数を使うわけて、あるが , 日本て、 Windows アプリケーションがなかなか現れ ない要因は , これらの関数を理解するため の資料が決定的に不足て、あり , Windows プ ログラミングマニュアルの不足て、ある。 関数のリファレンスマニュアルは , fWin dows 開発ツール』という 9 万円のソフトに 1 セットだけしか入っていない。関数リファ レンスはプログラマ 1 人に 1 冊は最低必要な のて , 『 9 万円 x プログラマ人数』の出費を 覚悟しなければならない。 OS / 2 プレゼンテ ーションマネージャのプログラミング関連
v リバティベルⅣの実行画面 マほ。んすく佐助の実行画面 く OS 田一 ロ 719 DAT く OS [ 81 ロロ載 0 IDX ー 04 ー 24 2 いい く OSDBI 81N 39 气マー く 03D 引 く 0SD81 SCR 三 DAT く DS 田 1 く OS ー 三 [DX 売伝 く OS 田一 ー「 e [ESC: abortl ( OS 1 く囎 1 ー 04 ー 24 21 : 18 く DS 田 1 ライ 7 DAT く OS 田 1 ライ t アン : e 新 0 テータ見つかりました . P ) 新 054 ・ 4 7 8 : , 一 93 ー 27 19 : 21 く ETC ・ 4 ー 67 TXT 一 93 ー引 22 : 18 く ETC 54 7 TXT ー 23 ー 39 17 : 28 く ETC 23 テータ見つかりました . 、・造 6 0 ぎ 0 ぎ 0 h4 H 〉 [ ¥ロ , ち半 P54 ー 67 > [ 「馬 54 ー 67 いちおう知らない人のために解説してお 配布ファイル LIB.COM は自己解凍型て、 , が入っています。 これも業界用語て、開店時 きますと , パチスロとはパチ ( ンコ屋に置い 実行ファイル LIB IV. EXE, ゲームデータ に台のビッグボーナスフラグを立てておく てある ) スロ ( ットマシン ) のことて、す ( パチ LIB IV. DAT, 外字ファイル USKCG. SYS ことをいいます。 したがって , 新しくゲー スロ専門店というのもある ) 。 とドキュメント README が出てきます。 必ずポーナスゲームがて、 ムを開始すれば , 遊び方は , コイン 50 枚を 1 , 000 円て、両替し システムの入ったフロッヒ。ーのルートディ きることになります。 レクトリに前者 3 つをコビーして起ち上げ , まして , だいたい 3 枚ずつスロットに入れて 以上 , いったいソフトの説明なのかパチ ドラムを回します。ストップボタンを押し スロの説明なのかわからなくなってしまい A > 凵 B Ⅳ のようにすれば , ゲームの開始て、す。 てドラムを止めます。 3 つのドラムの絵柄の ましたが , 最後はソフトについてひと言述 手もちのコインは 100 枚から始まります。 揃い方によって何枚かのコインが払い戻さ べておきます。 0 のキーを押してコインを 3 枚投入し , 囮→ 使用可能システムは PC ー 9801 , MS-DOS れます。 囘→ 3 の順て、キーを押して , ドラムを「左 , 一般的には、、 777 〃が揃うと 300 ~ 400 枚の てす。 MS ー DOS Ver . 3 . x の場合は 中 , 右」と止めます。キーて、ゲームは終了 コインが出てきます ( ビッグボーナスゲー USKCG. SYS を USKCG16. SYS にリネーム ム ) 。自分て、ボタンを押してドラムを止める し , 手もちのコインは LIB IV. DAT に記録 して使用してください。 このソフトは MS-Quick BASIC のて、すから , マシンに何の細工もないとす されます。 ゲーム中の機能には , 囮キーてフラグ・ ver. 4.5 て、コンパイルされています。同じ作 れば , 目がよくてタイミングさえ合わせら 乱数の表示 , キーて、リール速度の変更 , 者さんのゲームには「センチュリー 21 」のシ れれば , いくらて、も儲かるわけて、すが , そ 囹キーて、オートプレイなどがあります。フ ミュレーション CENSL02 があります。 こはそれ , ちゃあんと出る目にはプログラ ラグというのは , 台の状態を示す用語て、 , ミングがされています。 ポーナスフラグが立っていれば , 多少いい つまり , 投入したコインの数やなんか ( い * 編集部から : 今月から PDS という言葉を 加減に押してもコインが出ます。逆にフラ ろいろあるがよく知らない ) によって , 出る フリーソフトウェアに代えました。詳細は グが立っていなければ , どんなにタイミン ときは出るし , 出ないときはどうやっても 次号にゆずりますが , PDS ( 著作権の消滅 ) グよく押しても出ません。 出ないようになっています。 という言葉が , 日本 ( 法律を含めた ) の状況 「左 , 中」が 77 と続いて出て , 「右」の 7 を目 このパチスロゲームはパチスロの人気機 に合わないと判断したからてす。フリーソ 押し ( ねらって止めること ) したとき , 777 か 種「リバティベルⅣ」の出目をシミュレート フトウェアはコピーライトを残しながら ( コ らひとつずれて止まってしまうことをパチ するソフトてす。作者さんは出目のプログ ヒ。ーレフト ) , ソフトウェアの使用 , 配布の スロ業界て、は「すべった」といいます。 ラムを実際のゲームから解析しているよう 権利を無料て与えるものてす。 ゲーム開始時には「モーニングサービス」 て、す。さっそく遊び方を見てみましよう。 37 フリーソフトウェア最新レポート
CIimbinc Up 蓄 0 Windows 生成します。それのクラス ( 複数 ) は , Win dows の複雑さとオーバヘッドの多くを開 発者から隠蔽するように設計されています。 開発者は Windows のセットアップ作業を 自分て行う必要がなく , 目の前のアプリケ ーションに専念てきます。そしてアプリケ ーションが必要とする機能は , Actor が提 供しているオプジェクトのクラスから継承 するのてす。 Actor のデモは強い印象を与えます。 Windows 上の完全なテキストエデイタが , たった 2 行の Actor のコードて書かれたと 称する Actor の広告を , 誰もが見ています。 だが現実のプロジェクトにとって , どの 程度の実用性があるのてしようか ? Actor が提供しているクラスは , シリアル 通信やファイル管理などのニーズにも拡張 てきるのてしようか ? その性能は , C と 比べてどうて、しようか ? デバッグやメン テナンスはやりやすいてしようか ? 本稿ては , これらの疑問への回答を試み るとともに , Microsoft の Windows SDK や , Actor という開発系を使ってアプリケ ーションを開発する作業が , 実際にどんな 感じなのか , その実感を読者にお伝えした いと思います。本稿は評論てはありません。 つまり製品の批判やバグの指摘はしません ( もちろんそのバグが , これらの製品の設計 上の欠陥を表している場合は別て、す ) 。むし ろ本稿は , Windows アプリケーションを 開発するためのふたつの手法を , 概観的に 対照させることが目的てす。 面と梯子 C ての開発と Actor ての開発を比較す る , 次のような言葉を聞いたことがありま す。「 C<Windows の開発をするときは , 丸太の山を与えられて , それを自分てツー バイフォーに切断し , ウインドウ環境の有 利性に到達するための足場を自分て構築し なければならない。 Actor ては , 最初から梯 子が提供されている」。しかし , この言葉へ の答えはこうてす。「確かに梯子をくれるけ 18 CMAGAZINE 19 6 どね。て、も , その横木に誰かがグリースを 塗ったのさ / 」。このふたつの見方には , ど ちらにも真実があります。 Microsoft の Windows SDK は , Win dows 開発を支援する ( または , 少なくとも 開発を可能にする ) 多くのツールを提供し ています。コードは適当なエデイタて、書い て , 必要な Windows ヘッダファイルをイ ンクルードし , それを MS ー C て、コンパイル します (-Gw など , Windows 用の特殊なオ プションを指定します ) 。プログラムを LINK4 て、リンクし , リソースコンパイラを 走らせてメニュー , アイコン , ビットマップ などを加え , Windows をプートアップす ればアプリケーションのテストがて、きます。 この最後のステップが , Windows SDK の重大な間題てす。 Windows 環境を出た り入ったりということが , 非常にめんどう なのて、す (Microsoft が Windows の開発 者に高速なマシンの使用を推奨しているの は , たぶんそのためて、す ) 。これに代わる策 は , Windows / 386 を使って , 工ディティン グ , ーコンパイル , およびリンク作業のため に DOS ウインドウをオープンすることて、 す。残念ながら Windows/386 はまだ , Win dows / 286 ほど製品として安定していませ ん。それに , W ⅲ dows / 386 は , その DOS ウ インドウに相当なオーバヘッドを課すのて、 す。 DOS ウインドウからコンパイルすると きに , MS ー C コンパイラがメモリ不足のた めに最適化がて、きないと不平をいうことが , よくあります。 対照的に Actor は , それ自身が Win- dows アプリケーションてす。このことは ただちに , ひとつの当然な利点に結びつき ます。アプリケーション開発時に , Win dows を出る必要がないのてす。ただし , 最 終的なアプリケーションを作る時点て、は , やはり Windows を出てリソースコンパイ ラを走らせる必要がある , という点を覚え ておいてください Whitewater Group は Windows のヘッダファイルとリソースコ ンパイラに関するライセンスを , Mi crosoft から取得しています。 Actor には , 工ディットーコンノヾイルー リンクというおなじみのサイクルがありま せん。工デイタをロードしてソースコード をバンバン打ち込むのて、はなく , 最初に アプリケーションをどういうオプジェクト に分割するかを決めます。これがアプリケ ーションを書く際のもっとも重要な部分て、 あり , C の場合の構想よりもはるかに多く の時間を要します。 データと関数をオプジェクトに分割した ら , Actor Browser をロードして , クラス のショッヒ。ングを開始します。 Browser は クラスとオプジェクト用のライプラリアン て、す。これを使って , アプリケーションを その上に構築していくための基礎的なオプ ジェクト ( 複数 ) を見つけます。 Browser は , Actor のコードのフォーマットを知っ ており , よく使ういくつかの Actor 構文の テンプレートを提供してくれます。 クラスのメソッドを完成させたら ( メソ ッドとはオプジェクト指向プログラミング における動詞 , つまり関数のこと ) , Actor の workspace へ行ってそれをテストしま す。うまく動作しなければ , Actor のデバッ ガを使ってコードを調べたり , Browser に 戻ってコードを直したりします。その間 , Windows を出る必要がないのて、すから , ターンアラウンドタイムはかなり高速て、す。 開発は繰り返し作業のような過程になりま す。この方法だと , ほとんどのことに Actor が提供するクラスを使おうという気持ちに なる , という効果もあります。 Actor は , それほどいろいろな Windows オプジェクト用のクラスを提供してはいま せん。たとえば DDE(Dynamic Data Exchange) のような , Windows の特殊な 機構は , マニュアルのどこにも登場しませ ん。 Actor のディスクには DDE の例があ りますが , それを使うためにはプリントア ウトして勉強しなければなりません。 Actor は言語てす。それを効果的に使う には , その世界に飛び込んて , その言語を 学ばなければなりません。 Actor は難しい 言語て、はありませんが , 00P 言語の経験の
ソフトの道具箱シリーズ AQLFT 0 ライプラリ関数のソースコードを完全公開 / きわめて移植性の高いコードですので , コンパイラのバージョン・アップへの対応や異なる コンバイラへの移植作業は , お客様自身の手で容易に行えます。 組み込みロイヤリティーは無料 / 一般的な業務アプリケーションへの組み込みに対するロイヤリティーは , 一切不要です。 まかせて安心ツ - ルーーーーー した保守体制が自気す。 - 耋 C/Dbase 対応言語 : MS-C ()e 「 . 5.1 以上 ) Quick C ()e 「 . 1 . 0 以上 ) Tu 「 bO C ()e 「 . 2.0 以上 ) Lattice C ()e 「 . 4.0 以上 ) C/Window C/Dbase は , 検索ロジックに正当な Bt 「 ee ア ルゴリズムを採用した本格的なテータ・べース構築 用の関数ライプラリです。提供関数群は ISAM 関 数 , Data 関数 , Bt 「 ee 関数の 3 つのグループに 大別されます。 ISAM 関数は , 一般的な定型業務用 テータ・べースの構築に最適です。また , Data 関 数および Bt 「 ee 関数は , きわめて汎用的なテータ・ べース ( たとえば , SQL, カード型テータ・べー ス等 ) の構築を可能とします。 ・ OS / 2 , IJN Ⅸ版はマルチ・プロセス対応ーーレ コードの排他制御およびファイルの排他制御は完璧。 制御を行う関数は MS-DOS 版にも疑似的にサポ ートされているので , あらかじめ排他制御を考慮し て作成されたアプリケーションはそのままソースコ ード・レベルで移植可能。 ・豊富な検索機能ーーキー値によるアクセスに加え , レコード番号によるアクセスも可能。 ・削除レコードの復旧機能ーー削除レコードはファ イルのノヾージを行うまでファイル内に存在するので , 必要に応じて復旧できる。 ・充実したファイルの破壊対策機能ーーファイ丿レの 整合性検証および修復の機能は , ユーティリテイだ けでなく関数としても提供される。 ・高速な検索スピード—Bt 「 ee アルゴリズムを 採用しているので , テータ量が多くなればなるほど , 威力を発揮。 価格 / 動作環境 ・ MS ー DOS 版・・・・・・¥ 98 , 0 対応機種 : 一般の MS-DOS マシン 対応 OS : Ve 「 . 3.0 以上 対応言語 : MS-C ()e 「 . 5.1 以上 ) Quick C ()e 「 . 1 . 0 以上 ) 丁 u 「 bO C ()e 「 . 2.0 以上 ) Lattice C ()e 「 . 4.0 以上 ) 対応機種 : 一般の OS / 2 マシン 対応 OS : MS OS/2 ()e 「 . 凵以上 ) 対応言語 : MS-C ()e 「 . 5 」以上 ) ・ IJN Ⅸ版・・・・・・ \ 198.0 囲 対応機種 : 一般の IJN Ⅸマシン 対応 OS : f ck ( ) がサポートされているもの 対応言語 : 標準の C C/Window は仮想画面をサポートした本格的なオ ーバーラップ型マルチウインドウ・アプリケーショ ン開発用の関数ライプラリです。テキストのみなら ずグラフィックスもサポートしていますの 0 きめ の細やかな画面設計が容易に実現できます。 Dbase-Engine は , MS-DOS 版 C/Dbase ・強力なウインドウ・メカニズムーー最大 100 個ま の常駐化バージョンで常駐部 ( Engine ) と Engine でのウインドウを同時オープン可能。各々のウイン へのアクセス関数ライプラリとで構成されます。関 ドウに対する処理はきわめて簡単。文字列処理 , 図 数仕様は , C/Dbase と完全コンパチです。 形描画 , ビュー表示の移動 , 拡大 , 縮小 , 表示の 0 ・アプリケーションのプログラム・サイズが小さく N / OFF 等の処理はウインドウことに個有なウイン てすむ。 ドウ番号を用いることにより容易に行える。 ・ Engine 部のソースコードが提供されていない分 ・多彩なテキスト操作処理ーースクリーン・エティ だけ安価。 タのような高機能なテキスト処理を実現する関数も 価格 / 動作環境 用意。 ・ MS ー DOS 版・・・・・・¥ 48 , 0 圓 ・豊富な図形描画機能 対応機種 : 一般の MS ー DOS マシン ・メモリ効率の良いグラフィック管理 対応 OS : Ve 「 . 3.0 以上 価格 / 動作環境 対応言語 : MS-C ( Ve 「 . 5.1 以上 ) ・ MS - DOS 版・・・・・・¥ 66 , 0 Quick C ()e 「 . 1 . 0 以上 ) 対応機種 : PC-9801 シリーズ (LT, XA および Turbo C ()e 「 . 2.0 以上 ) XL, 日 L 等の八イレゾモードは除く ) Lattice C ()e 「 . 4.0 以上 ) 対応 OS : Ve 「 . 3.0 以上 対応言語 : MS-C ()e 「 . 5 」以上 ) Quick C ()e 「 . 1 . 0 以上 ) Turbo C ()e 「 . 2.0 以上 ) Lattice C ()e 「 . 4.0 以上 ) Dbase-Engine Window_Engine Window-Engine は , MS-DOS 版 C/WindOW の常駐化ノヾージョンで常駐部 ( Engine ) と Engine へのアクセス関数ライプラリとで構成されます。関 数仕様は , C/Window と完全コンノヾチです。 ・アプリケーションのプログラム・サイズが小さく てすむ。 C/BCD は , お金の計算のように高い演算精度が要 求される処理を実現するための関数ライプラリです。 ・ Engine 部のソースコードが提供されていない分 四則演算しかサポートしていませんが , double へ だけ安価。 の型変換を行えば科学技術計算も可能です。 ・ PC ー 9801 以外の機種もサポート。 ・すべて C 言語で記述されているので , 異 OS への 価格 / 動作環境 移植が容易です。 ・ MS ー DOS 版・・・・・・¥ 33 , 0 ・日 CD 型のテータは C/Döase, Dbase_En- 対応機種 : お問い合わせください。 gine にてサポートされる ISAM ファイルのキー 対応 OS : Ve 「 . 3.0 以上 値としてそのまま使用可能。 対応言語 : MS-C ()e 「 . 5.1 以上 ) ・豊畠な編集機能ーー s 町 intf ( ) のような手軽さで QUiCk C ()e 「 . 1 . 0 以上 ) 日 CD 型のデータを編集可能。 Tu 「 bO C ()e 「 . 2.0 以上 ) 価格 / 動作環境 Lattice C ()e 「 . 4.0 以上 ) ・ MS ー DOS 版・・・・・・ \ 33 , 囲 0 MS-DOS, MS OS / 2 , MS-C, Quick C は米国 Microsoft 社の商標です。 対応機種 : 一般の MS-DOS マシン C は米国 Borland lnternational 社の商標です。 Lattica C は 米国 La せ ice 社の商標です。 UNIX は米国 AT & T 社の商標です。 対応 OS : Ve 「 . 3.0 以上 C/BCD ・お問い合わせ・こ注文は直接下記まで 開発・販売元第第 株式会社 ノ—J レクラフト 〒 1 82 東京都調布市国領町 2-3-15 センチュリー K & AI 102 TEL. 0424 ( 89 ) 0202 FAX. 0424 ( 89 ) 4888 郵便振替 / 東京 9-537910 横浜銀行調布支店 / 普通 1 01 1526 * 価格はいすれも消費税込み
工ル江ス・アイジャパン fo 「 m 面 on from ( 0 pi 「「 5 し引 C -86 し引 C -80 ■ Q&A 0 イプラリを作ったり , 自分好みの コンパイラドライバを作ったりす ることもてきます。また , C 言語初 て、展開します。このマクロはおも の式の値を計算し結果を 10 進数 学えます。するとこのマクロはそ とつだけもち , そこには定数式を マクロ eval はパラメタをひ 開されます。 3142 行目だとすると , ListI ー②と展 出しのあるのがファイル f00. c の たとえば , List1- ①は , assert 呼び 行番号 ( 10 進数 ) に展開されます。 は , 現在読み込んて、いるソースの 展開されます。また , LINE るソースのファイル名 ( 文字列 ) に FILE は , 現在読み込んてい 義されています。 プロセッサによってあらかじめ定 いくっかの特殊なマクロはプリ す。 り知られていない機能を紹介しま れらのほかに cpp がもっているあま ifdef,#if) などを行うことてす。 include), 条件つきコンパイル ( # 換え , ファイルの取り込み ( # くて、てくるマクロ (#define) の置き 具体的な前処理とは C 言語てよ るのもおもしろいかもしれません。 造して新しいユーティリティを作 セッサとしても使えます。これを改 め , たとえばアセンプラのプリプロ いますが , C 言語から独立するた cpp はコンパイルの前処理を行 A るものですか ? プリプロセッサ cpp とは何をす 0 るのて、はないて、しようか。 は C 言語を修得するうえて参考にな 心者には , これらのソースコード List 1 ー 円し E_ : 引 se \ printf("Xs Xd:assertion faiIedYn" #def i ne if (cond) assert(cond) assert (p List 1 ー ( 2 ) List 1 ー ( 3 ) #def i ne #def i ne #def irie N 乢い : リを使用するにあた 152 CMAGAZINE 19 6 テムに合わせて変更し , 新しいラ ソースコードをターゲットのシス ROM 化の場合にはライプラリの す。 コードを再利用することがて、きま 用者は , 安心してこれらのソース かえありません。したがって , 使 ラムを販売してもまったくさしつ 部を引用して新しく作ったプログ 雑誌へ掲載したり , 変更または一 たとえば , 他人に譲渡したり , ん。 扱いにはいっさい制限はありませ す。これらのソースコードの取り ードがパッケージに含まれていま ティリテイプログラムのソースコ lcc, プリプロセッサ cpp などのユー ール make, コンノヾイラドライノヾ プラリのほかにプログラム保守ツ ースコードが , LSI C ー 86 て、はライ LSI C ー 80 て、はライプラリのソ A すが , 取り扱いに制限はあります どのソースコードが付属していま パッケージ中にライプラリな 0 間題はありません。 プログラムを販売してもまったく ルし , ライプラリがリンクされた 必要ありません OLSI C てコンパイ ロイヤリティなどはいっさい しようか ? って , ロイヤリティは必要なので : else printf("Xs Xd:assertion faiIedYn" = NIJ しい ” f00. C ” 燔” #v ” \ n つ , 3142 ) : bar(), の foo(x) V 5 List 1 ー④ foo(V + 3): printf("the val ue of bar(x, eva ー にプリプロセッサのデバッグ用に っくられたのて、すが , インライン 関数て、も使われています。 List1- ③は , List1- ④のように展 開されます。 ・ユーザみなさまへ ◇登録カードの返送はお早めに 返送された「登録カード』をも とにバージョンアップのご案内 , 新製品情報 , 特別割引価格のご案 内などをお送りしております。現 在は LSI C ー 80 のユーザに MS ー DOS クロス , ソースレベル , デバ ッガ LDB ー 80X のご案内をさしあげ ておりますのて , 添付『登録カー ド」をぜひご返送ください ◇住所 , 担当者変更について 登録された住所 , 所属や担当者 などが変更になる場合は , 添付「技 術サービスカード」て変更のご連 絡ください。変更内容を記入のう え , ファクシミリまたは郵便にて お送りください prinf("the value of 5 十 3 is 8 \ n ” ) : ◇技術的なお問い合わせについて 技術的なお間い合わせは添付「技 術サービスカード」をご利用くだ さい。必要事項を記入の上ファク シミリまたは郵便にてお送りくだ ・「 L C -86 試食版」の配布 大好評をいただいております 「 LSI C ー 86 試食版」 ( 「 C マガシン」 創刊号特別付録 ) を 3 , 000 円にて提 供いたします。創刊号を買い損ね た皆様 , ぜひこの機会にご注文く ださい 「 LSI C ー 86 試食版」ディスクに は , read. me ( 試食版仕様の手引 ) , LSIC86. man ( 試食版用マニュア ル ) , order ( 申込購入書 ) が含まれ ております。 申込先〒ー引 東京都渋谷区千駄ヶ谷ト 8 ー 14 工丿レ・エス・アイジャノヾン 「 L C ー 86 試食版」係
PragmaC ノヾックグラウンド このコラムは私的て、独断的なものになる : ARCH, MARION, CAROLE, MAKE の すめることは絶対にしない。なぜなら , そ だろうが , 本文て、ニ ートラルな立場をと のスペック , 通常のべンチマークテストて、 4 個のツールがバウンドされている。 ARCH らなければならないことからくるストレス 平価されるようなスペックに関していえば はファイルアーカイバて、あり , CI のコンパ イラがつねにライプラリのソースを供給し のフィードバック現象としてご了承願たい 決して高いといえないからだ。最適化レベ 一回て、も述べたが , 現在私は , Microsoft ているため , 必然的に添付されているもの ルはあまり高くなく , EXE モデュールの実 だ 0MARION は , オプジェクトライプラリ ( 以下 MS ) の MS ー C ( 5.1 ) と QuickC 三 行スヒ。ードはとりたてて速くない とくに ( 2.0 ) , MetaWare の HI-C(386), そして そのコンパイルスヒ。ードは , ワースト 10 の アン MS ー DOS には LIB が添付されている ComputerInnovations( 以下 (I) の C86 トップにランクされるほど遅い。前述の 4 種 が , 初期のノヾーションにはノヾグが多かった このため , 私は MARION を ( C 以外のライプ PLUS を使用している。 MS ー C と QuickC : のコンパイラて、同一のソースをコンパイル は , おもに業務用のアプリケーションを作 : ラリを作成する場合にも ) 常用するようにな すると , QuickC がもっとも速く , MS-C は 成する場合や , パプリックな ( 本連載のよう り , 今て、は LIB の操作方法を忘れかかってい その 2 倍近くかかる。 HI-C は MS-C の 2 倍か な ) プログラムを作成する場合に , また HI- それ以上かかり , C86PLUS て、は , さらに 2 る。 CAROLE はリンカて、ある。これに関し C は , 386DOS-Extender 上のプログラムを 倍の時間がかかる。つまり , C86PLUS は 三ては , MS の LINK て、もかまわない。 作成するために使用している。そして , C86 : QuickC の約 8 倍の時間がかかるわけだ ( 実際 AKE は保守ューティリテイだ。基本 PLUS は , 他者の使用を考えない , プライベ 的には MS の MAKE と同様の仕様だ はもっと遅い ) 。実際 , C86PLUS を V30 / 10 ・ ートユースのプログラムを作成するために が , より UNIX のものに近い。ファイル名を MHz の PC ー 9801 と通常のハードディスクの 使用している。 : 指定する必要もないし ( デフォルトて、、、 MA 組み合せて、 , ちょっと大きなソース ( 500 行十 私が最初に MS ー DOS マシン (IBM の : KEFILE" を探す ), ファイルの参照関係も 5 個のヘッダ程度 ) のコンパイルを開始する PC515 の用に C コンパイラを購入しようとし 記述順序の制限を受けない。ただし , 問題 と , 信じられないほどの時間がかかる。実 たとき , 選択枝はふたつあった。 Lattice と 用を考慮した場合には , 80386 / 16MHz 十ハ 点をひとつ挙げるとしたら , プログラムサ イズが大きいことだ。したがって MAKE か CI の , ともに最初期のバージョンて、ある。 ードディスク十 2M 程度の RAIV1i•イスクの 私は CI を選んだ。理由は簡単て、ある。 CI に ら呼び出されるプログラムのメモリについ 構成が最低ラインとして要求される。 はライプラリのソースコードが標準添付さ 三ては MS のものより制約を受ける。 S-C(Ver. 4.0 ) や TurboC が普及し始 MAKE についてもうひとこと。 MS は , な れていたからだ。もしこのとき Lattice を選 めたころには , CI のコンパイラを捨 んて、いたなら , その後の遍歴はまったく違 てようかどうかたいへんに悩んだ。しかし , 三ぜ , あのような仕様の MAKE を供給するの ・だろう ? ったもの ( おそらくは , よりノーマルなもの ) こ最近 , 私が MS-DOS や MS の この悩みは , CI が OptimizingC86 から C86 になっていただろう。とにかく , 私は CI の 言語を購入した際 , まず最初に行う作業は , PLUS に名称を変更した段階て、 , ある程度解 コンノヾイラを選び , 最初の C86 から Optimizin 消された。 C86PLUS は , MS ー C コンパチプ : MS ー MAKE を見つけ出して抹消することに こて、どこが悪いと指摘 gC86 を経て , 現在の C86PLUS に至る CI のす なってしまった。 ルのコンパイラとなり , その操作 ( オプショ ンスイッチ ) やライプラリ ()I と MS それぞれ するつもりはない。たんに私が気にくわな べてのバーションにつきあってきた いというだけの問題かもしれないし , 最初 の後しばらくして , MS-C が発売され 固有の関数 , とくに低レベル関数を兼備す から厳格にプロジェクトを組んて、メイクフ たが , それは LatticeC を化粧しなお る ) , そしてオプジェクトのセグメンテーシ しただけのものだったから , 私は興味をも ァイルを作る , あるいはバッチと併用すれ ョンにおいても MS-C との統一が図られてい たなかった。私が MS ー C を意識しはじめたの る。このため , C86PLUS と MS-C, QuickC 三ば , あれて、もいいのかもしれない。どちら は , Ver. 4 . 0 からだ。また , 一度だけ Lattice にしろ , 私にとって MS ー MAKE は煩わし のそれぞれて、コンパイルしたモデュールを のコンパイラを購入したことがある。これ 。もし , 私と同じように MS-MAKE に不 リンクすることも可能になった。 は , GIockenspiel の AdvantageC 十十を使用 : 満がある方は , QuickC を購入してみるとい が CI のコンパイラを購入しつづける するために必要だったからて、ある。 て、あろう理由は , 付属してくるツー いだろう。もう少し , ましな MAKE, NMAKE ただし , ほかの人に対して C86PLUS をす ルが必要だからだ。現在 , C86PLUS には , が得られるだろう。 48 CMAGAZINE 1990 6