考えてしまいますが , よく考えると三つあ さい ■ ーションって何だ る IM バイトの領域の 1 番目と 3 番目が解放さ このような , 空き地をかき集めて合計す れた場合には確かに空き地の合計は 2M バイ れば目的のサイズ以上の空きがあるが , 空 「フラグメンテーション」とはメモリの中 トて、すが , 連続して 2M バイトの空間になっ きが飛び飛びの状態て、あるため確保て、きな に空き地が断層上に発生してしまい , 空き ているわけて、はないのて、 , 結局は 2M バイト いときに , 強制的にメモリを移動させて空 確保て、きません。 地をまとめて再利用て、きなくなる現象のこ き地をまとめてしまうという強引な解決方 とをいいます。 これがフラグメンテーションという症状 法もあります。これをコンパクションとい て、す。 たとえば空き地が 5M バイトあるとして , います (Fig. 4 参照 ) 。 実生活て、はフラグメンテーションとは , 2M バイト , IM バイト , IM バイト , IM バ イトと領域を確保した状況を考えてみます 下手なドライバが駐車場に車を止めようと ンの問題 (Fig. 3 参照 ) 。この状態て、 , あらたに 2M バ して隣の車と相当広い間隔を空けて止めて イトを確保しようと思っても , すて、に空き しまう状況に似ています。下手なドライバ しかしながら , 移動をしてしまうと困っ こて、 地がないのて、無理て、す。ところが , が何人もいると , あちらこちらて、車同士の たことに , その移動をさせたメモリがどこ IM バイト確保したものがふたっ解放される 隙間が拡がってしまい , その隙間をうまく かからポインタて、指されていた場合は , 肝 としましよう。単純に考えれば , これて、 IM つめれば 1 台くらいは余分に止められるの 心の指していたメモリが引っ越してしまっ バイト x 2 = 2M バイトが解放されるのだか に , 隙間が分散しているから結局止められ たために不都合やバグが生じます。期待し ら , 当然 2M バイトが確保て、きるて、あろうと ているデータが取り込めなかったり , 関係 ないというような状況を想像してみてくだ のない場所にデータを書き込んて、破壊した りという , おなじみのポインタ関連の不愉 快なバグが発生します。 かといってコンパクションのたびにポイ ンタをいっせいに更新するわけにもいきま せん。そういうことをしようと思えばポイ ンタのすべてを OS に登録しておき , コンパ クションのたびに OS に書き換えてもらうと いうのて、もなければ , プログラムのほうて、 ポインタて、指している場所をいちいち移動 したかどうかを確認しないといけません。 どちらにしても手間がかかる話て、す。 そこて、 TOOLBOX て、は , ハンドルという 「ポインタのポインタ」て、コンパクションが どの時点て、発生しても目的のメモリを見失 わないような封策をとっています (Fig. 5 参 照 ) 。 図のマスターポインタはコンパクション の対象外とします。そうしないとハンドル にした意味がありません ( コンパクション対 策のものがコンパクションて、移動されてし まったらどうしようもない ) 。この不動のマ スターポインタに目的のメモリのアドレス ( ポインタ ) を入れておきます。コンパクシ ョンて、移動した時点て、 TOOL BOX はマスタ 0 つラ ョ テ ラ フ放、 、◆◆・◆学・学′◆学◆◆◆◆◆・◆学◆学◆学◆ ′・マ◆・◆マ◆・・・◆ヤ◆ヤ◆◆・◆・◆◆マ◆、・◆・◆ ◆ - ◆ . ◆ . ◆ . ◆ - ◆ . ・ . ◆ - ◆ - ◆ . ◆ - ◆ . ◆ . ◆ . ◆ . ◆ - ・ 連続して 2M バイト 空いていたので確 保できる。 ミ解放 ( 2 ) ′・マ・マ・す◆マ・・マ◆、 ' ・ヤ◆マ・ヤ・ ' ◆・◆マ◆ヤ◆、 連続して 2M バイト 空いていないので 確保できない 放 解 解放 ( 2 ) ◆ . ◆ . ◆ . ◆ . ◆ . ◆◆ . ・◆あ◆◆◆◆◆ ◆・◆・・・◆◆◆◆学◆◆学◆◆ヤ◆◆学◆学◆◆、 ◆△◆ . ◆△◆ . ◆ . ◆ . ◆◆◆◆◆◆◆◆△◆◆ . ↑ IM バイト , IM バイト , IM バイト , 2 ヾイトと確保した状態 こで IM バイトをふたっ解放する Fig. 4 コンバクション ド◆・◆・◆・・・◆・◆・◆・◆・・・◆・◆・◆・◆・◆・◆・・ ・◆◆◆◆◆・◆◆◆◆◆◆◆◆・◆ 解放 2M バイトの連続した 空き地かできあがる ここを下に移動する この空き地をつめる 解放 ◆・◆・′◆・◆・◆・◆・◆◆◆◆学◆学・、学◆・◆、 ◆ . ・・△◆◆△◆△◆△◆ . ・△◆◆ . ◆△◆△◆△イ ◆△◆△◆△◆ . ◆◆ . ・◆◆△◆△◆◆△◆△◆◆◆△、 C MAGAZINE 108 1993 12
WeIcome to Macintosh mm OX の手続きを説明しておきましよう。 HandIe GetResource (ResType theType, int theID) ; リソースを取り込む手続きて、す。 theTyp e はリソースタイプの指定て、 , theID は ID 番 号の指定て、す。リソースタイプはリソース の属性を決めるものて、通常は英文字 4 バイト て、表現しています。 こて、通常の C 言語の仕様にはない独特の 表記 ( ' STR' ) を行っていることに注意して ください リソースタイプとはリソースの 種類を意味しています。つまりリソースタ イプによって , これから取り込もうとする リソースが絵なのかアイコンなのか音なの かがわかります。 取り込むことに成功すれば , 取り込んだ リソースへのハンドルが戻ってきます。取 り込めなかった場合 ( たとえば目的のリソー スがもともと作られていない場合など ) はヌ ルハンドルが返されてきます。 ヌルハンドルのチェックは必ず行うよう にしましよう [ 3 ] 。 St 「 255C ロ y C 文字列のコビーは strcpy を使うのて、す が , strcpy を Pascal 文字列のコヒ。ーて、使って はいけません。そこて、 Pascal 文字列の特性 を考慮した PascaI 文字列用の strcpy がこれ て、す。 PascaI 文字舛は最初の 1 バイトが文字 列の長さて、あり , 2 バイト目以降に文字のデ ータが並んて、いるのて、 , 1 バイト目にある数 値分だけ文字をコヒ。ーをすれば文字列のコ ヒ。ーがて、きます。 Pascal 文字列を strcpy て、コヒ。ーすると , 見うまくいくように見えるし , これて、いい のだと勝手に錯覚している人が , たまにい らっしゃいます。 strcpy は、、 \ 0 〃 ( すなわち 0 ) があるところま てを無条件にコピーしているわけて、 , たと えば PascaI 文字列を記録している配列のす べてに 0 てない値が埋まっている状態だと , strcpy は , ひたすら 0 が見つかるまて、せっせ とコピーをし , 結果的に配列の外まて、コヒ。 ーを続けて関係のない領域を破壊すること になります。この手のバグは見つけるのに 結構苦労します。 さて , 例題プログラム④て、は Pascal 文字 列の転送先が Str255 型の配列て、あり , 転送元 がリソース (GetResource<' 取り出したもの ) て、す。リソースはハンドルて、あって , ポイ ンタて、表現されていないのて、 , いったんポ インタ化しています。とはいっても , 単に 、、 * 〃をつけているだけて、すが。 St 「 ingPtr, St 「 ingHandle Pascal 文字列の表現は Str255 型て、すが , これへのポインタの表現が StringPtr て、 , ンドルの表現が StringHandIe て、す。具体的 な定義は , typedef unsigned char Str255 [ 256 ] , * S t r i n g P t r , * *StringHandle , となっています ( THINKC パッケージに付 属している Types. h を参照 ) 。これを見て明 らかなとおり ,StringHandle は「ポインタの ポインタ」て、す。 何だ 0 Mac プログラミングをするうえて、混乱す る概念が「ハンドル」て、す。すて、に何度か説 明しましたが , ハンドルとは「ポインタのポ インタ」て、す。ところて、 , C 言語て、誰もが必 ずつまずいたり , 場合によっては立ち直れ ない人が続出するのが「ポインタ」て、すが , これは簡単にいいきってしまえば「データが 置いてある場所」を表現したものて、す。 に得意な人て、あれば , C 言 アセンフラロロロ 語のリストを眺めるよりもコンパイルされ た結果のアセンプラリストを眺めてみると 一発て「なんだ。ポインタとは間接アドレッ シングてはないか」と納得することてしよ う。その延長ていえばハンドルは二重間接 アドレッシングともいえるのて、すが , そも そも , なんて、こういうややこしい仕掛けが 必要なのて、しようか ? Macintosh の TOOL BOX にはプログラム が自由にメモリを確保したり解放する手続 きがあります。上級 C 言語プログラマなら m alloc ( ) , free ( ) という関数を使ったことが あるて、しようが , プログラムがまとめて大 量のデータを取り扱うときに , あらかじめ , どれだけの容量のデータを取り扱うのかが 不明確な場合 , 配列として定義するのて、は なく , malloc ( ) , free ( ) という関数を使っ て , 途中て、必要な容量だけ確保して , それ を使ってしまうという方法が可能て、す。 たとえばワープロやエデイタのようなプ ログラムを例にすれば , わかりやすいと田 ッじ、 いますが , 編集をしようという文書のサイ ズは実にばらばらて、す。 10 バイトもないよ うなものから数 M バイトにいたるまて、 , ま ちまちなサイズて、 , こういったものをあら かじめ固定したサイズの配列て、取っておく と , たとえば 100K バイトの配列を確保した とすれば , 10 バイトのような文書だったら 空き地のほうが大きくてムダが多いし , IM バイトの文書だったら , もっと大きい配列 が必要になって足りないとかいうことにな ります。 Macintosh の TOOL BOX には malloc ( ) , free ( ) に相当する手続きとして , メモリマ ネージャの中に NewPtr, DisposPtr という のが用意されています。これは malloc ( ) , free ( ) とまったく同じものと思っていいて、 しよう。ところて、 TOOL BOX を見ていく と , 同じようなメモリの確保 , 解放をする 手続きとして NewHandIe, DisposHandle というのが , やはりメモリマネージャの中 にあります。これは確保したメモリを「ハン ドル」としてプログラムに返す手続きて、す。 ポインタて、なくハンドルを使うメリットと いうのは , ハンドルとして確保するメモリ は移動可能なのて、フラグメンテーションに 強いという特徴があるからてす。 Mac 専科 107
個人が自主性を発揮して頑張っている」お店 て、はありませんけど , 商技術に長けた老十 都心部における激しい商競争という条件か ら郊外型大型店 ( ひとつの商圏内て、の競争が ほとんどない ) よりは品物がヒ。チピチしてお ります。 競争といえば , コンビニなんかも今は , 、、競争のない〃立地選択をしているて、しよう。 だから , コンビニの食い物はどれもまずい わー。深夜や早朝に , そこだけが「開いてて よかった」だから , 少々まずい食い物て、も売 れる。今のコンビニ見とると , 私なんか終 戦直後の極貧の「何て、も売れる」の世相とオ ーバラップしてしまいますな。一刻も早く 地域のコンビニに健全なる競争状態を ! 今 の 7 ー 11 等のすぐ隣にどんどん出店していく 勇猛果敢なる小売べンチャー経営者よ , 現 昔 , 都心て、よく仕事の徹夜なんかやると , 吉野家の牛丼というのが好きて、したよ。あ の牛丼がかくべつ美味というのじゃなくて , 夜の夜中にああゆう食べ物屋が明るく元気 に営業していること自体が , 平和て、元気て、 嬉しい。それと同じて、 , 私はコンビニの存 在自体は大好きて、すからもっと競争を賑や そこて、 , いよいよ「地ビール」の話て、すよ。 うまい食い物は , 個人の芸術的独断の産物 て、す ( 、、マーケティング的判断の産物〃て、はな い ) 。日本のビールをたとえばヨーロッパの 名品ビールなみに美味くするには , 地ビー ルの振興しかない ! これまて、の , マーケ ティング的 , 八方美人的 , 朝令暮改的 ( まさ に下痢便のごとき新製品ラッシュ ) 味づくり ほぞ に対して「間違っている ! 」と臍を噛んて、お られた名人プリュワーのかたがたが , キリ ン , サッポロなど大手ビール会社には , た ぶん数人すつはおられるて、あろう。そうい うかたがたは , 会社に辞表を叩きつけて独 立すべきて、あります。また , やがてそうい うかたの「弟子」が独立して故郷などて、地ビ ール屋を興すて、あろう。 C 言語フォーラム 117 そして後年の歴史書には , こう書かれる のて、す。「日本人における個の確立は , 地ビ ール製造販売の認可を契機として本格化し 花開いた」なんてね。 印刷は個ンピュータを 夷狄とするや マシン未だふみびとを訪れすして 今たまたま , 私の机の上に居候している UNIX WS(SONY bigNEWS) は , 主記憶 16M バイト , HD524M バイト , 40MHz の R ISC プロセッサて、動作という贅沢者て、すけ ど , awk はいちばん初期の仕様の実装 , C コ ンパイラは ANSI C 非対応て、すから私の日常 の使い物にはなりません。 おまけに (?)grep は , 、、 1 行の最大サイズが 256 バイト〃て、すから , これまた , ふつうの , とくに日本語のテキストファイルに対して はます使えません。 TurboC におまけて、付いている grep も , うんと初期にはこの制限がありました。今 は , 日本語の相当長いパラグラフて、も正し く扱ってくれますが。 がふつうやて、」 人や関心のある人なんかおらんところ のシステムの名前 CUNIX つを知っとる 友 : 「それどころか日本て、は , 自分のところ らんもんね」 にはシステムアドミニストレータがお 私 : 「ほんて、 , 日本のそういう UNIX サイト オフコンの晏惕としか思うとらんもん」 友 : 「そらそうよ。日本のべンダは , WS は 末なもんやね」 ミングしながら使う人にとってはお粗 開発環境とかあるいは自分て、プログラ て、売っとるて、。日本の UNIX WS って , 私 : 「日本の Sun は , WS を C コンパイラ抜き ONY さんには申し上げたい。「ちょいと , 現 象〃。せつかくマシンを貸してくださった S の名も知らぬ null, または、、単なる技術対 以前にひとつの文化。日本て、は UNIX は , そ アメリカて、は UN Ⅸは , 商品や技術て、ある 状の仕様て、は買う気になりませんぜ。開発 環境およびユーティリティ類をめいつばい アップッーデート ( 十めいつばい便利な日本 語環境 ) にしてください。そうしたら私は , bigNEWS を自分の将来のショッヒ。ング候補 リストに記載いたします」 この UNIXWS の上に GNU の主要ソフト ウェアー式をインストールすれば , 何とか 使い物になるかなと思いしども , 標準 SCSI デバイスて、ある ( はず ) の、、 PC ー 9801 シリーズ 用ク CD ー ROM ドライプをマウントて、きず , れも諦めにけり。 主記憶が数十 M バイトもある高速マシン が , その便利な開発環境 ~ ソフトウェア環 境も含めて日常的に使えるようになれば , 私のように日常の仕事の主な対象が「長大な テキストファイル」て、ある者 ( 物書き , 翻訳 家 , 編集者 , 等々 ) にとっては , ほとんど理 想に近いシステムが出来上がるて、しよう。 規模の大きなテキスト処理や辞書参照処理 などを , ほとんどすべてオンメモリて、て、き るのて、すから。 今 , そういう文筆家や編集者のための日 常システムとしてお勧めのマシンはありま すか ? 寡聞にして私は知りません。なぜ , 各社はそういうマシンを作らないのて、すか。 想定される答え まだコンピュータの便利さを知らない文 科系労働者が多いので需要が少ない & その 啓蒙を一私企業の活動としてやる気はない。 て、も , いわゆる高度情報化社会における 家庭や個人の端末としてのコンピュータは , タイプとしてそういう文科系労働者向けシ ステムが基本になるて、しよう。だから , ノ ートブックに代表される小型化の方向以外 に , 現状のデスクトップ機の内容を豊富に するという開発方向があるて、しよう。 私の現有のオンポロ 286 機なんかの場合 , その背後空間におけるケープルや電源コー ドの本数の多さに毎度うんざりしてしまい まっせ ! それは基本インタフェイス装置 や記憶装置のほとんどが内蔵て、なく別の単
ln 川 a ⅱ行町ⅱ計 Ma れ門 ライフボート WATCOM C / 386 WATCOM C32 ません。また , セグメントレジス Q タて、ある ES レジスタにリアルモー putenv 関数を使用して環境変 数を追加しても , プログラムが終 ドアドレスが入ってきますから , 直接 int21H を実行すると , 一般保 了したあと , SET コマンドで , 環 境変数を見ても , プログラムが追 護例外が発生します。そこて、 , リ 加した環境変数が追加されていま アルモード割り込みを呼び出すフ せん。どのようにすれば , プログ アンクション int31H/AX=300H を使って呼び出します。 ラム終了後も環境変数を残すよう 返ってきたポインタは , リニア にできますか。 アドレスに変換 ( DOS / 4G て、は 4 ビ A MS-DOS て、は , プログラム自 ット左シフトすることて、リニアア 身のプロセスの環境およびその子 ドレスになります ) して , 参照して いきます。 MS-DOS Ver. 5 て、は , プロセスの環境を変更することは て、きますが , 親プロセスの環境を MCB のオーナ名が MCB の 8 バイト 目からの 8 バイトの大きさて、入って 変えることはて、きません。そのた いるのて、 , ここを参照して COMM め , putenv 関数を使用して環境を 変えても , プロセスが終了し , 親 AND.COM を探します。 emory ( メモリが不足しています ) 」 MCB を追跡するには , MCB のア プロセス ( 通常 , COMMAND. CO A スタブプ 0 グラムは , DOS/4 ドレスに MCB の大きさ (MCB 十 3 というメッセージを出すコマンド M) に戻ると , 環境も親プロセスの G が立ち上がる前の準備をするプロ ~ 2 バイト , パラグラフ単位 , MC があります。 WMAKE が使用するメ 状態に戻ってしまいます。 グラムて、すから , プロテクトモー B 自体は含まれない ) を加えます。 モリを減らす方法がありますか。 COMMAND.COM の環境を変 ド用のコードを出す WATCOM C/ えるには , メモリコントロールプ COMMAND.COM の MCB が見つ A 386 て、は , コンパイルすることがて、 ロック ( MCB ) を追跡して , オーナ WMAKE は , 約 70K バイトの かれば , その MCB のオーナの PSP きません。従来のリアルモードの が COMMAND.COM て、あるメモ (MCB 十 1 から 2 バイト ) を求めま メモリを必要とします。これを減 MS-DOS 用コンパイラて、コンパイ らす方法はありませんが , 次のよ す。 PSP 十 2CH から環境変数領域 リを見つけ , そのプログラムセグ うな方法て、回避してください が求められますから , そこを書き ルする必要があります。 メントプレフィックス (PSP) から WATCOM C / 386 に添付されて /n と /h オプションをつけて WM 変えます。 環境変数領域を求めて (PSP のオフ いるスタブプログラムのソースコ AKE を起動し , WMAKE の標準出 環境変数を探して , 値を追加す セット 2CH から 2 バイトに環境変数 ードは , WATCOM C16 用て、す。 力をリダイレクトして , バッチフ るサンプルプログラムを付録ディ 領域へのセグメント値 ) , 直接書き ァイルを作成します。オプション / 弊社から英語版 ( AT 用 ) パッケー スク ( Iist0. c ) に収録します。 PAT 換える以外に手段はありません。 n は , コマンドを実行する代わり H に 126 バイト以上の値を設定する ジとして販売されていますが , M しかし , MCB は低位アドレスか に , 実行するコマンドを標準出力 S-C-C もコンパイルて、きます。しか らの追跡は可能て、すが , 逆方向に のに便利て、す。 し , WATCOM C16 固有の関数 ge に表示するものて、す。 / h オプション は追跡て、きません。最低位の MCB は , WMAKE の起動メッセージを tcmd を使っていますのて、 , これを を求めるには , マニュアルに載っ Q WATCOM C / 386 には , DOS/ 表示しないオプションて、す。こう 作成して追加しなければなりませ ていない DOS のファンクション 52 4G 用のスタブプログラム ( ユーザプ して作成されたバッチファイルに H を使います。 ん。 getcmd 関数の例を List 1 にあ は , WMAKE が実行するコマンド ログラムに結合され , 自動的にプ げます。 このファンクションは , ES : B ログラム自身を引数として , DOS/ X レジスタにアドレスを返してきま が並んて、います。 このようにコマンドの実行をバ 4G を立ち上げるプログラム ) とその すが , マニュアルに載っていない Q ッチファイル化することて、 , WM ソースコードがついていますが , WATCOM C / 386 に入ってい DOS のファンクションなのて、 , DO AKE が消費するメモリを節約する これは , WATCOM C / 386 でコンバ るメイクユーティリティ WMAKE を S 工クステンダはこのポインタを , 使っていますが , 「 NOt enough m ことがて、きます。 イルできますか。 自動的には論理アドレスに変換し Fig. 1 MS-DOS Ver. 5 の MCB の構造 0 1 2 3 4 5 6 7 8 9 1 01 1 1 2131415 MCB Owner SIZE Name ↑ M または Z List 1 / * getcmd: * char *getcmd( char *buf ) : buf : コマンドラインを受け取るパッファ * 戻り値 : buf と同じ。 * 概要 : コマンドラインの引数をコマンド自体を除いて , そのまま取得する。 * / char * getcmd(char *P) unsigned char far *fp; i nt i コ mt : char *ret (unsigned char far * ) ( (uns igned long)-psp くく (6) 十 0X80 ; *fp 十十 ; for(i=0;i<lmt;i 十十 ) * p 十十 = * fp 十十 : return ret; lnformation from Compiler Makers 163
Access 明 S 0 w 0 「 2 CO 「「 0 ⅱ on く新製品記念キャンべーン〉 93 年月末日までにⅥ SEP を 購入し夛ーサ登録された方か ら抽選で、 300 名様に当る一 い等 ) 特製 T シャッ ( 2 等 ) オリジナルマグカップ く主要スペック〉 当選者の発表は商品の発送にえます ( 3 等 ) VISEP ロゴ入り FD ( 6 ) ( 1 ) ウインドウ形状までも変更可能なカスタマイズプログラムが付属。 コマンドキー設定、画面配色はもちろん、各種システムメッセージ、 の機能を付加する豊富な外部拡張型マクロライブラリを標準添付。 ファイル印刷 ( MS - DOS 付属のプリンタドライバと 201 系プリンタが必要 ) ( 5 ) マウス操作 ( MS - DOS 付属のマウスドライバとバスマウスが必要 ) と ( 4 ) 編集中のファイルを定期的に保存するオートセーブ機能を内蔵。 マルチウインドウ機能を搭載。 ( 3 ) 最大 12 ファイル、 4 ウインドウまでオープン可能なマルチファイル・ モジュールを、 Microsoft-C 、 Turbo - C 系用にそれぞれ 2 種類用意。 ( 2 ) 外部拡張型のマクロプログラムで利用 ( リンク ) 可能な C 関数ライブラリ マクロ機能とビギナー向けの簡易型内部マクロを装備。 C 言語 (Microsoft-C 、 Turbo-C 、 Borland-C) で作成する外部拡張型の ・ NEC 製 201 系プリンタと MS - DOS 付属のプリンタドライバ ・バスマウスと MS - DOS 付属のマウスドライバ 管理できる 1 M バイト以上の拡張メモリ ・ 640K バイト以上のフル実装メインメモリと EMS システムが マネージャ ( MS - DOS5.0 に付属他 ) ・バージョン 3.3 以上の MS - DOS と仮想 86 モードのメモリ ・ 80386 以上の CPU とハードディスクシステム 対応メディア : 3.5 インチ 2 HD 及び 5 インチ 2 HD 必要メモリ : 384 K バイト以上 MS-DOS バージョン 2.11 以上 ただし初代 9801 ・ LT ・ HA ・ XA は除く : NEC PC -9800 シリーズ ( ハイレゾモード対応 ) ( 7 ) 便利なユーティリテイプログラムとインストールプログラムが付属 推奨システム : 必要 0 S ・ 対応機種 く動作環境〉 物い働一 仕様、内容構成等を変更することがあります。 ※この広告に示された製品仕様・内容等は 93 年 9 月現在のものです。本製品は機能向上のため、予告なく 特に付記していません。 ※その他この広告で示された商品名は各社の商標または登録商標です。登録商標名に ( R ) 、 TM マークは ※、 286 、 3 は米国インテル社の商標です。 ※ NEC 、 V30 は日本電気株式会社のロゴマークまたは登録商標です。 尚、これらの OS 、 C コンパイラ等は本製品には付属しておりません。 ※ MS-DOS 、 Microso 代℃は米国マイクロソフト社の、 Turbo-C 、 Borl 囲 d ℃は米国ポーランド社の登録商標です。 〒 016 秋田県能代市花園町 23-22 TEL 0185-52-5900 FAX 0185-52-7800 AccessByte ( 消費税は含まれません ) 究極の C 言語マクロ搭載 - 最強装備のマルチェデイタ 株式会社 アクセ 70 、イトノ ~ 工ア ハイレゾモード自動対応 \ 28 OOO -9800 シリーズ用 ヴァイセップとお呼び下さい く資料請求番号 003 >
く 7 〉 Browse POINTS. BSC 0 0 ■ー 0 」 Fig. IO プラウザ 便 能ー G 猷 0 Definition 他人のプログラム ( あるいは AppWizard の 作ったスケルトン ) などを見ていると , 関数 の実体がどこにあるかわからず苦労するこ とがよくあります。 VWB て、は , 定義を見た い関数名にカーソルを合わせ , Browser/G otoDefinition メニューあるいは亘を押す ことにより , 定義している場所へ飛べます ( ただし , プラウザデータベースを作成して おかねばなりませんが ) 。 こまて、はありがちな機能て、す。 VW indows 上の環境版て、も , コンパイルには D リコンパイルドへッダ ( stdafx. cpp のコンノヾ B て、はさらに , 型の定義まて、調べてくれま OS 上のものを使用するようて、す。 Project/ イル時に作られる 800K バイトくらいのもの ) す。それも , クラスや構造体の定義だけて、 Build メニューなどを選んて、コンパイルを始 の作成がありますから , まあ仕方ないて、し はなく , 単なる typedef, 果ては #define まて、 めると , < Output > というウインドウがオー もが守備範囲て、す。 Fig. 11 は , TRUE の定 プンし , 処理の状況を刻々と表示します。 そもそも , コンパイル時間はそんなに遅 義を探したところて、す。 TRUE の実体は実 ただ , 英語版 VC 十十の場合 , このコンパ くないのかもしれません。そう , とにかく は # define だったのてすが , 見事に探しあて イル機構が日本語 Windows とは相性が悪い 遅いのは , リンクとプラウザデータベース ようて、 , コンパイルを始めた瞬間 , 画面に の作成なのて、す。 てくれました。 これは超便利て、す。惜しむらくは , 変数の 極彩色のロールシャッハテストを表示しつ AppWizard て、スケルトンを作って , その 定義場所まて、はサポートされていないこと ままコンパイルしたとしましよう。て、きた つ , お亡くなりになってしまいます。ふと て、す。これも調べてくれると , ファイルのサイズを見て , 最初は我が目を さらに便利 、、 WinTee" という言葉が頭をよぎったりし になることて、しよう。 こて、深く触れません。もちろん , ますが , 疑いました。何しろ , EXE ファイルが 1 .2M 英語版 Windows て、は問題なく動作していま バイト ( K バイトじゃないて、すよ ) もあるのて、 すし , 日本語版 VC 十十て、はそんなことはな す。そりや時間がかかっても仕方ないて、す くなるて、しよう。 ね ~ と妙な納得をしたのて、すが・・ くだん 言語仕様などの話は , 本誌 ' 93 年 6 月号の なみに , 件の EXE ファイルをデバッグて、は 遅いピルド なくリリースパージョンとしてビルドして 速報を読んて、いただくとして , こて、はイ 余談はさておき , とにかくビルドが遅い 75K バイトになりました。なんな ンプレッションを書いてみたいと思います。 みると , の , この差は。 のて、す。初回のコンパイルて、は , 巨大なプ VC 十十は , Borland C 十十と異なり , W Fig. 12 開発手順 Fig. 1 1 TRUE 定義の探索 VW B Eile Edit ew Project ßrowse Pebug 1001s Qptions Window Help AppWizard く 9 〉 F:iUSRiSRCiCMWCP14POlNTSiPOIN1 、、 M.CPP く 11 > F. US R C VCPI INTS CPOINTS. H 第 ypedef unsigned long 0 RD ー / / 32 ー 01t リ n519ne0 nunDer 物 ypedef int 日 00 し ; / / 800 L ean ( 0 0 ド ! 0 ) / / を・ pointer tO ヨ 5む・ ing リ p を 02 char FRR• LPSTR; t リ p を 02 ー const char FAR ・ LPCSTR; / / far pointet ・ tO ヨ read-onl / / む、 t ド act itet ・ ation positio ypedef 聞 id ・ POSITION; / Standa•・ 0 constants undef FALSE undef TRUE 物 und ~ 楸ル L efine FAL SE 0 define 1 efine ル L 0 ( みツ / Diaqnostic suppot ・ t T 0 : D eriyed ロ a33 6 raph 宀ト CP0ints CPtrList CObList E お d T 肥砂 ◆ CPoints: :Draw(c1ass CDC 善 ) CPoint CStringList CMapWordToPtr CMapPtrToWord CMapPtrToPtr Definitions 0 CPoints f : 、 us ド、 5 ド c 、 c リ cp12 、 points 、 cp Re 薈 2 ド nce tO Point 0 コ、ノラ Mi ロ 050 Ⅵ su Cf+ ・ POINIS. MAK 完成版の コンノヾイラ AppStudio ClassWizard Debugger く fl 〉 F:\MSVC\MFC\INCLUDEV.FX. 日 M i ロ 05 0 V i 5 u 引 C , ー PO ー N ー S. MAK Fig. 13 ツールノヾー 日 Edit VieW Project ßrowse Debug 工 00 Qptions Window 旦 e ゆ ステータスパー NUM 74 2 NUM 00082 009 42 C MAGAZINE 1993 12
十分な情報を得ているものと思う。 Symantec C 十十は AT & T の日 el. 3 に準拠した , 待望の Macinto そこで , 本記事では , それ以外の sh 用 C 十十処理系である。ただし , 人々 , とくに MS - DOS の上で C / Mac プログラミングのエキスノヾート C 十十コンバイラを使って開発して であれば , すでに使っているか , そ いるが , Mac に乗り換えてプログラ うでなくても , 旧バージョン ( T N ム開発をしてみたいと考えている人 K C Ve 「 . 5.0 ) との差異について , のために , この処理系の紹介をする。 Symantec C 十十 Veru 圧 0 に見る dMacintosh プログラミング きだあきら り , 正規の C 十十も供給することにしたのて、 するようになっている ( ただし , 拡張子を具 あろうか。いずれにせよ , この原稿執筆時 体的にどのようなものにするかは , 自由に 設定て、きるようになっている ) 。当然なが 点て、は , Apple 社の純正 C 十十て、ある MPW ら , 使い勝手を左右する環境部分のプログ C 十十は , まだ ReI. 2.1 べースて、あり , ReI. Symantec C 十十は , 米国 Symantec 社が 3 準拠の処理系は Symantec C 十十だけて、あ 発表した Mac 用の統合 C 十十開発環境て、あ ラムはまったく同じものて、あり , したがっ て , その部分の機能も同じて、ある。両者の る (Symantec C 十十 for MPW というのも る。 Symantec 社は , THINK C, THINK 存在する ) 。この点て、も SymantecC 十十は PascaI という処理系を供給している会社て、 マニュアルも , 環境に関しては一冊て、共通 ある。この THINK シリーズは , Mac 用コン 貴重な存在といえるだろう。 て、ある。 パイラのビッグネームて、あり , ちょうど M 言語仕様的には , ややこしいことに , TH INK C はオーソドックスな C 言語てはなく , S-DOS 上のプログラマには Microsoft C(M それ自身すて、に C 十十によく似たオプジェク S-C) や Borland C の存在が知れ渡っている こて、 , Mac のプログラム開発環境の変 ように , Mac 上て、開発をしている人て、あれ ト指向拡張が施されている。実際 , THINK ば知らない人はいないと思われる。 CVer. 5.0 まて、は , THINKC は C 十十のア 遷の歴史を , 記憶をたどりながらざっと紹 ップワードコンパチて、あり , だから C 十十は 介しておこう。 SymantecC 十十は , 形式的には THINK 初代 Mac の場合 , ROM64K バイト /RAM いらないというようなニュアンスて、あった C Ver. 5.0 のバーションアップということ ( 「アップワードコンパチ」という表現は TH 128K バイトという , 現在の常識からいうと になる。実際には , 同時に THINKCVer. RAM の容量など 2 桁も少ない , 極くわずか INK C のマニュアルなどに記されているも 6.0 も発売開始されていて , THINK C Ve なメモリしか装備していなかった。このた のて、あるが , 筆者としてはいささか疑間が r. 5.0 のユーザには , C 十十にするか Ver. 6.0 にするか , 2 通りのアップグレードバス め , 初代 Mac には純正のセルフ開発環境は ないて、もない ) 。ただし , THINK C Ver. が存在することになる。具体的に両者の違 5.0 がアップワードコンパチだといっている 提供されず , Lisa を用いてのクロス開発環 対象は , あくまて、 AT & T の ReI. 2 の C 十十て、 境が存在するだけて、あった。これはとうて いは , コンパイラ本体のみだけだといって もよいだろう。より正確にいえば , Syman ある。 いアマチュアレベルては対応て、きないため , それに対して , 今回の SymantecC 十十は Forth 系の言語がセルフ開発環境として使わ tec C 十十には , 実は THINK C Ver. 6.0 れたこともあった。 Forth という言語の省メ が含まれている。つまり THINK C と Sym AT&T の ReI. 3 に準拠したものて、あり , te モリ性からて、ある。 mplate も備えている。ただし , exception h antecC 十十のふたつの独立したコンパイラ その後 , Mac 自身のハードウェアも拡張 andling は実装されていない。 C 十十の標準 が伺しているのて、ある。 され , IM バイトの RAM を備える MacPlu が進化してしまったために , さすがに THI ふたつのコンパイラのどちらを使用する NK C をアップワードコンパチといえなくな s が発表された。 RAM の容量の制限は大幅 かは , ソースファイルの拡張子を見て判別 122 C MAGAZINE 1993 12 れ t C 十十の位置づげ a c のログラミンク環境 歴史と現状
「 VB-Scripting 」 株トムズコンピュータ ・対応言語日本語 Visual Basic Ver. 2.0 IBM 版 Windows 3.02 以上 ・対応 OS Windows 3.0A 以上 するマシン ・対応機種 Windows 3.0A 以上が動作 く動作環境 > 管理システム」 ルから指定文字列を探し出す「文字列検索 ・任意のディレクトリ中のテキストファイ 刺管理システム」 ・個人情報の保管とデータの検索を行う「名 テム」 を行う「ディレクトリとファイル管理シス コピー , 移動 , 削除などのファイル管理 ・ディレクトリのツリー表示とファイルの おり。 いるおもなサンプルプログラムは以下のと 集として使用することも可能。収録されて ログラムて、 , そのまま Windows アクセサリ 管理システム , 関数電卓などの実用的なプ ラムは , 簡易画像工デイタ , スケジュール として使用て、きる。また , サンプルプログ VisuaI Basic プログラミング入門の教材 属。 は , Visual Basic て、の作成方法の解説が付 のサンプルプログラム集。各プログラムに 用して作成した Windows アプリケーション 同ソフトは , Visual BasicVer. 2.0 を使 を発売した。 用のサンプルプログラム集「 VB-Scripting 」 株トムズコンヒ。ュータは , VisuaI Basic C-MAGA 「 Win Batch インタブリタ / TEL 045 ( 716 ) 0680 チ処理言語「 W ⅲ Batch インタブリタ / コンパ が開発した Windows 環境用パッ 株工ージーテックは , Wilson WindowW 株工ージーテック コンバイラ」 are, lnc. ・対応機種 Windows 3. IJ 動作マシン く動作環境 > ケーションの実行が可能 ド操作の貼り付けや特定条件て、のアプリ ・指定したアプリケーションへのキーポー 報の取得 , 設定が可能 ・動作中の DOS, Windows に関する各種情 化 , 移動 , サイズ変更などの操作が可能 ・ウインドウに対して , 最大化 , アイコン おもな機能は , 以下のとおり。 環境下て、自動的に実行することがて、きる。 起動 , ファイル操作などの作業を Windows が含まれ , アプリケーションやコマンドの リプト言語。 200 種類以上のファンクション による自動実行機能を追加するためのスク 同ソフトは , Windows 環境にバッチ処理 ノし、 0 イラ」を発志した ・対応 OS Windows 3. IJ く価格 > WinBatch インタブリタ WinBatch コンパイラ 18 , 000 円 68 , 000 円 ケーション開発が可能な ANSI FORTRAN 77 標準規格準拠の 32 ビット専用 FORTRA N コンパイラ。 640K バイトの制限がないた め , いままて、移植不可能だった大規模な FO RTRAN アプリケーションをパソコン上に 移植することが可能となる。おもな特徴は 以下のとおり。 ・ ANSI FORTRAN77 標準規格に準拠し , VAX, FORTRAN90, IBM SAA など各 種言語拡張機能もサポート ・ CPU i386 , i486 のほか Pentium プロセッ サにも対応 ・ WATCOM C のオプジェクト , および ランタイムライプラリと互換性があり , C と FORTRAN を用いたミックスドラン ゲージ開発が可能 ・ DOS 工クステンダ用 , OS / 2 用の両方のコ ンパイラとリンカを搭載し , どちらの環 境て、も各種プラットホーム対応のアプリ ケーション開発が可能 く動作環境 > ・対応機種 PC ー 9801 シリーズ , DOS/V マ シン , PS / 55 シリーズ , J3100 シリーズ ( ただし , いずれも i3 86 以上搭載機種 ) ・対応 OS MS-DOS Ver. 3.1 以上 OS/2 Ver. 2.0 以上 ・ターゲットプラットホーム DOS/4G, 386 ー DOS-EXTENDER, Windows 3.0 以上 , OS/2 Ver. 2.0 以 上 , NetWare v3.11 / v4.0 , AutoCAD R12J ・必要メモリ 3M バイト以上 間い合わせ先株工ージーテック 〒 461 愛知県名古屋市東区東桜 1 ー 10 ー 9 ベルエースビル 4F TEL 052 ( 95D 2706 「 WATCOM FORTRAN7732 J9.5 」 株ライフボート 株ライフポートは , マルチプラットホー ム対応の 32 ビット専用 FORTRAN コンパイ ラ「 WATCOM FORTRAN7732 J9.5 」を発 、 0 同ソフトは , 最大 4G バイトまて、のアプリ く価格 > 198 , 000 円 く価格 > VB-Scripting 19 , 800 円 VB-Scripting&Visual Basic 59 , 800 円 く発売記念価格 > ( ' 93 年 12 月末日まて、 ) VB-Scripting 13 , 800 円 VB-Scripting&Visual Basic 39 , 800 円 問い合わせ先株トムズコンヒ。ュータ 〒 232 神奈川県横浜市南区別所 4-14-32 156 C MAGAZINE 1993 12 問い合わせ先株ライフポート 〒 101 東京都千代田区神田錦町 3 ー 6 TEL 03 ( 3293 ) 4711 ハーソナルメディア株は , FMR ー 50 シリー ノヾーソナルメティア株 ソフトウェアキット」 「電房具 IB / FMR
実践アルコリ路解法のテクニック り返します。もし N が奇数の場合には , 最後 のペアにならないファイルは , そのままに #include く StdiO. h> $include ” sort. h" 33 : } 4 5 : } 6 3 : } 76 : } 86 : } しておきます。 上記のひとまとまりの処理をここて、はパ ス (pass) と呼ぶことにしましよう。 1 回のパスにより , ティスクソートのメインプログラム List 4 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : 1 2 : 1 3 : 16 : 17 : 18 : 19 : 1 : / * file : sort4. c #include * 目的 : テキストデータの整列 ( ヒープソート十マージソート ) * 作成 : 松田晋 ( まつだすすむ ) く string. h> #include く stdlib. h> int ー ine_count; char *bufferCMAX_LINES] : 15 : / * データを読み込んでは、ヒープに格納する * EOF に達した場合は EOF を返す。それ以外の場合は * 読み込んだ行数を返す。 i nt read-and-up-heap(void) i n t i : char Iine-buf[LINE-SIZE] : for (i ニ 0 : i く MAX_LINES & & if (fgets(line-buf, LINE-SIZE, ー ine_COllTlt return EOF; bufferCi] ニ xstrdup(line-buf) : up-heap(buffer, i); return ー ine_count enough_memory() ; 35 : / * 工ラーチェックつきの f 叩 en * / FILE *open_file(const char *file 22 : 23 : 24 : 25 : 26 : 28 : 29 : 30 : 32 : 34 . 36 : 38 : 39 : 40 : 42 : 43 : 4 4 : 4 6 : 48 : 50 : 52 : 53 : 5 4 . 5 5 : 56 : 57 : 58 : 5 9 : 60 : 62 : 6 4 . 6 6 : 68 : 6 9 : 72 : 78 : 8 4 . 8 5 : _name, stdin) = NULL) const char *mode) FILE *f = f 叩 en(file_name, mode); f ⅱ e 行数は 2 倍になり , フ _name) ; : NULL) { fprintf(stderr, " 中間ファイル %s をオープンできません \ n " fprintf(stderr, " 工ラーコード ex i t ( I) : return f; %dYn ” errno) ; 47 : / * ヒープの先頭データを書き込みながら、 ヒープから削除していく void write_and-dovnheap(int n, int result) ニ EOF) ⅶⅱ e (res t > 0 ) { rest ー ine_count : out_file : 叩 en_file(temp-file_name(n), e ー se out_file : stdout; ニ 0 & & result FILE *out_file; int rest; buffer 〔 0] ニ buffer[--rest]; fputs(bufferC0], out-file) : down-heap(buffer, rest) : fclose(out-file); ソートし、中間ファイルに書き込む * / 65 : / * メモリに読めるだけ読んで、 int make-runs(void) i n t resu ; int n_files release_memory() : resu は read_and_up write_and-dovnheap(n files + 十 , } ⅶⅱ e (resu は ! = EOF) ; return n fi les; -heap() : int main(int argc, char *argv[]) return 0 : merge-files(n_files) ; i f ( n- f ⅱ es 〉 l) n_files : make_runs() : init-allocator(); i n t n_ f ⅱ es : result) : / * メモリを解放する * / / * ヒープから順に書き出す * / / * データを読み込みヒープを作る * / / * メインプログラム * / / * メモリ割り当ての初期化 * / / * 中間ファイルを作成する * / / * 中間ファイルをマージする * / ァイルの個数は半分になりますから , トー タルて、は logn 回のパスにより , N 個のファ イルはひとつにマージされ , 結果としてフ ァイル全体がソートされたことになります。 ひとつのパスて、は入力ファイル全体を扱い ますから , そのデータ量は O (n) て、す。これ を log2n 回繰り返しますから , マージソート 全体て、の計算量は O ( n 10g n) になります。 この計算量は , クイックソートやヒープソ ートなど高速なソートアルゴリズムと同じ オーダーの計算量て、す。 しかし , いくらオーダーの上て、クイック ソートと同じ ( 高速な ) 計算量て、あるといっ イトといったところて、しようから , 約 100 倍 行の平均的なサイズは , 30K バイト ~ 60K バ が必要になります。テキストファイル 1000 には , 1000 セクタすなわち 4M バイトの容量 と , 1000 行のテキストファイルを分割する 仮に 1 セクタのサイズを 4K バイトとする とになります。 全体て、非常に大量のスペースを消費するこ 最低 1 セクタを占有することになり , データ ( OS の特性にもよりますが ) 1 ファイルにつき よしんばファイルを作成て、きたとしても XX など ) 場合があるからて、す。 イルの個数に制限がある (MS-DOSVer. 1. なぜなら , OS によっては作成て、きるファ にはこのようなことは不可能て、す。 ァイルが作られることになりますが , 現実 には , 行数と同じだけの ( 数千や数万の ) フ 行 , 数万行に及ぶデータをソートするため N 個のファイルに分割しているのて、 , 数千 ゴリズムて、は , 前述のように N 行のデータを ぎて利用することはて、きません。このアル ても , 前述した操作は現実には効率が悪す 現実的て、はありません。そのため , 現実の のままディスクソートに適用することは , 以上の理由から , 単純マージソートをそ ります。 もディスク容量をムダに消費することにな ディスクソートて、は , 工夫をしています。 節て、説明します。 上記のムダを避ける この工夫については次 実践アルゴリズム戦略 解法のテクニック 67
のみ行うことがて、きます。配列の初期化て、 がふたつあります。似たようなものがふた を表すことになります。初め ( 左側 ) の添字 は , 要素の列は { と } て、括り , 要素はカンマ つあると , たいてい混乱が起こるものてす。 は教科名を意味し , 後 ( 右側 ) の添字は , あ " て、区切ります。最後のセミコロン " 初め ( 左側 ) の添字のほうがゆっくり回り , る教科名の文字列の何バイト目かを意味し を忘れないように 後 ( 右側 ) の添字のほうが早く回ります。 Li ているのて、す。団地て、いえば , 初めの添字 12 行目て、は新しい配列 namae を定義し , st 6 の配列 namae て、いえば , は階数を表し , 後の添字がその階て、の部屋 namaeC0] [ 0 ] [ 4 ] は 初期化を行っています。この配列 namae は 番号を表しているようなものて、しようか。 ニ次元配列になっています。二次元配列と MS ー DOS て、は漢字は「 MS 漢字コード」また namae[1][0] &namae[1]C4] は は添字がふたつある配列のことて、 , ちょう は「シフト JIS コード」という文字体系て、表現 ど TabIe 2 のような形になった変数て、す。ふ 数学 されています。国語の「国」という文字は , たつの添字はそれぞれを [ と ] て、括ります。 16 進て 8D91 という 2 バイトて表現されていま 配列 namae のような二次元配列には添字 す。 C 言語て、は漢字を直接プログラムに埋め 初期化とニ次元配列 List 6 を漢字を使わずに書く namae[2] [ 0 ] &namae[2] [ 4 ] は List List 1 : #include く stdio. h> 2 : 3 : #define MAX TEN 3 4 : 5 : void main(void); 6 : 7 : void main(void) 9 : int sum = 0 , i; 10 : float heikin; int tenCMAX TEN] = { 65 , 90 , 75 ) ; 11 : char namae CMAX—TEN] [ 5 ] 12 : ' \ X91 ' ' *x8C' ' *xEA' 13 : ' \ X94 ' ' *x8A' ' \ X77 ' 14 : ( ' \ X89 ' , ' \ X70 ' ' *xEA' 15 : 17 : for ( i = 0 ; i く MAX TEN : i + + ) { printf("Xs は Xd 点 \ n ” , &namaeCi]C0], ten[i]); 19 : sum + = ten[i]; 20 : 21 : heikin = (float)sum / MAX_TEN; 22 : printf( ”平均点は %. If 点 *n", heikin) ; 23 : 24 : } 1 : #include く stdio. h> 2 : 3 : #define MAX—TEN 3 4 : 5 : void main(void); 7 : void main(void) int sum = 0 , i; 9 : 10 : float heikin; int tenCMAX_TEN] = { 65 , 90 , 75 } : 11 : char namae[MAX—TEN][5] = { " 国語 " , ”数学 " , ”英語” } : 13 : for (i = 0 : i く MAX—TEN; i + + ) { 14 : printf( ” Xs は Xd 点 \ n ” , &namaeCi][0], tenCi]); 15 : sum + = ten[i]; 16 : 17 : heikin = (float)sum / MAX—TEN; 18 : printf(" 平均点は %. If 点 }n", heikin) ; 語学語 国数英 クイズ 3 : 何が表示されるでしようか クイズ 2 : 何が表示されるでしようか List List 1 : #include く stdi0. わ〉 2 : 3 : void main(void); 4 : 5 : void main(void) 8 : 9 : 10 : 11 : 12 : 13 : 14 : 15 : 16 : 17 : 18 : 1 : #include く stdiO. h> 2 : 3 : void main(void) : 4 : 5 : void main(void) int i; 7 : int a [ 1 の : 8 : 9 : for (i = 0 ; i く 10 : i + + ) { aCi] = 11 : 12 : printf("Xd*n ” , aC5]); 14 : ) ・ 1 else { aCi] = aCi printf( ” Xd*n ” 78 C MAGAZINE 1993 12