C のベス N トトト ・ソースコード付属 / 組み込みロイヤルティ無料・ すわ e C ′ a es CCF / 総合コンソルコントロールライプラリ価格 \ 59 , 800 CCF/EX 価格 \ 98 , 000 ◆ CCCFZEXJ では XL 、 XL2 、日 L の八イ キーボード、テキスト画面、グラフィック、マウス、ウインドウ、メニュー、プリンタ、拡張 レゾリューション / ノーマルの両モードに対 関数等 200 以上の関数で構成される総合コンソールコントロールライプラリです。 CG 「 aDhic 応し、一部の関数を除いて、どちらのモード & MouseJ, tWindow & MenLJJ 、 fKey & Dis ay 」とプリンタ関数、拡張関数で構 でも動作するプロクラムを開発することかで 成されています。 きます。 ■「G 「 aphic & MouseJs CWindow & MenLJJs CKey & DisDlaYJ については各製 プリンタ関数 ( 抜粋 ) ■プリンタ関数は日 OS を介してプリンタに文字コード、制御コ 文字出力 / プリンタステータスの取得 / プリ 品の説明をこ覧ください。 ード送り、各種アルファベットの文字印字、拡大、キャラクタモートの切り替え、フォームフ ンタの初期化 / C 日、 LF 出力 / 漢字文字出力 ィード、プリンタ状態の設定 / 検査、印字方向の切り替え、サプスクリプト / スーバースクリ / ANK 文字列出力 / 漢字、 ANK 文字列印字 プト文字の印字、縦印字、強調、アンターライン、ドラフトモードの切り替え、左右マージン / 漢字、 ANK 文字列印字 ( ANK ー > 半角変 の設定、改行幅 / 方向の切り替え、ソフトウェアリセット等の処理を行うことかできます。対 換 / 漢字 / ANK 文字列縦印字 ( ANK ー > 半 角変換レプリンタのリセット / SELECT 、 DESELECT の切り替え / ドラフトモードの 応プリンタは PC - P 日系です。■拡張関数は MS - DOS ファンクションコールを用いたキー 入力関数、文字列処理関数、 y ( es ) / n ( 0 ) の入力を促し、 Shift 、カナシフト、全角、半角 設定、解除 / 片方向、両方向の切り替え / レ 6 インチ改行設定 / レ 8 インチ改行設定 / n 回改行 のいすれの状態でも y / n を判断する関数等があります。 / 漢字モード設定 / 解除他 ! Window & M enu 価格 \ 29 ′ 800 1 Window & Menu/EX 価格 \ 49 ′ 800 ームキャラクタ、フレーム色、ウインドウ内 テキストウインドウ、メニュー関数のライフラリバッケージ。最近のちょっとしたソフトでは の表示色の設定が可能です。この機能により、 大抵ウインドウ機能を備えています。例えはスクリーンエテイタては画面を分割し 2 つ以上の 好みの色、キャラクタを用いたウインドウを ウインドウを開いて編集できるとか、テータベース、業務用ソフト等では簡単な説明や操作ガ 定義可能・横長タイプ、縦長タイプ、羅列 イドをへルプウインドウを開いて表示したりしています。このような表示を行うためのマルチ タイプの 3 タイプのメニューウインドウによ ウインドウ機能とウインドウを利用したメニュー選択機能を提供します。 り、用途に応じたメニュー表示が可能・サ ンプルプログラムメニューウインドウにフ tWindow & Menu/EXJ は XL 、 XL2 、日 L のハイレゾリューション / ノーマルの両モー 引 ドに対応し、互換モード ( 自動判別 ) によりどちらのモードでも動作するプログラムを開発する アイル一覧を表示し、選択されたファイル内 ことができます。また、八イレゾリューションモード時には 31 行 / 25 行モードを選択すること 容を上下左右スクロール機能を持った文字列 ができます。 表示関数により、スクロール表示をおこなう ・ウインドウ / メニューウインドウあわせて 20 個までのウインドウがオープンできる ( 増減可 サンプルプログラムか付属。 能 ) ■オーバーラップ / 切り替え機能オーバーラップにより隠れたウインドウを一番上に表 次の関数の他、 tKey & Displayz の * 印が付いている関数も加わります。 示・移動機能ウインドウを指定された座標へ移動・文字列表示行を指定する関数と、 関数 ( 抜粋 ) 上下スクロールを伴った文字列表示機能がある・スクロールスクロール関数と、文字列表 ウインドウの初期化、終了処理、オープン、クローズ / すべてのウインドウをクローズする / を 示を伴った上下スクロール機能がある・ V 日 AM をアクセスしてウインドウ操作を行っている 表示対象となっているウインドウをクローズする / 表示対象ウインドウを別のウインドウに切 ので高速。ウインドウの切り替えもほぼ時■ウインドウを開き、 y(es) 、 n ( 0 ) の入力を 替える / ウインドウの移動 / ウインドウ内をプランク文字で消去 / ウインドウ内に文字を表示 促す関数と上下左右スクロール機能を持った文字列表示関数によるテキストファイル等のスク / 上へスクロールし、文字列を表示 / 下へスクロールし、文字列を表示 / ウインドウを上、下 ロール表示か可能な拡張ウインドウ機能■カスタマイズド・ウインドウウインドウのフレ にスクロール / ウインドウのフレームタイプを登録 / 文字列を指定行表示ー他 Graphic & Mouse 価格 \ 29 ′ 800 Graphic & Mouse/EX ー。価格 \ 59 ′ 800 ◆ rG 「 aphic & Mouse/EXJC は XL 、 N88BASlC 相当のグラフィック機能とマウス機能を提供するライプラリバッケージです。 XL2 、日 L のハイレゾリューション / ノーマ ルの両モードに対応しており、とちらのモー グラフィック機能はグラフィック画面に点、線、四方形、円、文字等を描画する機能、指定領 叮 ドでも動作する互換モード ( 自動判別 ) もあり 域を切り出す / 貼り戻す等の機能と表示モードの設定を行う制御機能て構成されています。 ます。 マウス関数にはマウスカーソルの表示 / 非表示、色指定、ボタンの押下状態の検査、移動範囲 関数 ( 抜粋 ) の指定、移動距離の検査等の関数があります。 画面のモード設定 / 表示範囲の設定 / 画面色 ・ N88BAS 旧相当のクラフィック関数を提供■高速グラフィック関数高速線分描画、高 速連続線分描画、高速円描画、グラフィック画面への文字表示関数を備えています。 ( ノーマル の設定 / バレットの設定 / グラフィック、テ キスト画面消去 / ドットセット、リセット / モードのみ ) これらの関数はすべて日 EPLACE / CLEA 日 / 0 日 / XO 日の 4 つの描画モ ードのいずれかを選択指定することができます。 (fline, flines. fci 「 cle, g—cha 「 ) ・マ 直線、円、円弧の描画 / ペイント / タイルバ ターンによる塗りつぶし他 ウス関数 RS -232C ライプラリ 価格 \ 49 ′ 800 RS -232C ライフラリ / EX 価格 \ 98 ′ 80 間関係関数、および簡易ターミナルエミュレータ、 XMODEM 送受信プログラム等かサンプ 本製品は C 言語から日 S ー 232C インターフェースを介して、各種周辺装置、コンピュータ等と ルプログラムとして提供されています。製品にはテパイスドライバを含むすべてのソースコー コミュニケーションをとるためのライプラリです。 ドが含まれています。 バッケージには OS を呼び出して行っている「日 S -232C ライプラリムこれに 9861K 用とマ ■用途 / 回線数によって使い分けのできる 3 種類のライプラリ ( EX ) を装備。■マルチサー ルチサーバ用テパイスドライバ版を追加拡張した「日 S -232C ライプラリ / EX ょの 2 種類かあり、 バホードを装着することにより 9 回線までサポート可能 ( EX ) ・「日 S -232C ライプラリ」て 呼び出し方法は共通になっています。 は "Ve 「 . 3.1 以上かっ型番が PS98-127- ? ? ? 以降の MS - DOS でなければならない - という 「日 S -232C ライプラリ」は主に日 OS を呼び出して、日 S -232C のコントロール、送受信を行 制限かあります。 り っています。もちろん、 2 、 3 回線もサポートしています。 関数 ( 抜粋 ) 「日 S -232C ライプラリ / EX 」では日 OS 呼び出し版の他に、使用環境に制限がなく本体はテ ー共通回線の選択、初期化 / 受信バッフア内データ長の検出 / 受信バッフア内のテータを得 バイスドライバ化され、インターフェースライプラリを介して呼び出すテパイスドライバ版と る / 1 文字出力 / 8251 にコマンドを送る / 8251 ステータスを得る / 送信レティ状態の検査 / キ マルチサーバ対応のテパイスドライバが拡張されています。また、各ライプラリ特有の関数 ( ー ャリアティテクトの検出 / 日 S -232C インターフェースのリセット / 文字列入力 / 文字列出力 部 ) を除いて上位関数の入口名、引数は共通なので、リンクするライプラリファイルを変更す / 1 文字受信 / 1 文字送信 / 漢字処理を伴うテータ送信 / モテムの初期化、接続、自動発信 るだけで切り替えることができます。この他、オートダイアル / モテムコントロール関数、時 ・ EX 専用プロック受信 / プロック送信 / 八ンドルのクローズ 1 . ー駅猫 いし・瀚 三 = 日諶
ング添削 プログラ puts を使ったプログラム p 「 in 廿を使ったプログラム List List 1 : # i ncl ude く s td i 0. h > 2 : 3 : i nt ma i n ()O i d ) puts ( " 初めての C プログラム " ) : 5 : return(0) : く stdio. h> 1 : #include 2 : 3 : i nt ma i n ()O i d ) pr i ntf ( " 初めての C プログラム Yn") : 5 : return(0) : 6 : 出力すればいいのて、すが , p 「 intf は誓式指定 文字があるかどうかなどといった感じて、 , 文字列を先頭からなぞっていかなければな りません。 1 文字の出力に p 「 intf を使うのがいかに愚か なことて、あるかがわかったと思います。 ちなみに K & R の例題て、も , 1 文字の出力 に p 「 intf を使ったものはないと思います。 p 「 intf は万能て、すが , puts や putchar の存 在を否定するものて、はありません。 機能な反面 , それなりの欠点もあるわ けて、す。 小さなようで大事なこと・・・ さて , 松林さんが p 「 intf を実際に使ってい る箇所が List 3 て、す。なんだか途中に if 文が 入っていておかしなループて、すね。 これは表示する文字列が , ' ' 1 ECOLOGY ・・・ ' ' 2 VZ " 10 直子の代筆・・ TabIe 1 実行ファイルの大きさ LSI C 6718 5270 Fig. 1 文字列リテラルの格納 MS-C 7289 5253 prin 廿使用版 puts 使用版 printf("*n printf("*n"); printf("*n"); printf("*n"); 文字列について さて printf から話はどんどん進みます。 松林さんのプログラムにはないのて、すが , よく次のようなものをみかけます。 printf("*n") ; \ 0 C 0 C 0 C 0 C 0 これは putchar('*n') ; に置き換えるべきて、す。 (1) を瞽いている人に ( 2 ) のように記述す るように指導しますと , ? という顔をする人 があまりにも多いのて、 , その理山を説明し やたらと文字列リテラルを使わない ・理由その 1 (1) は文字列リテラルを使用しているた ・理由その 2 ・ p 「 intf の数だけ , め , Fig. 1 ( a ) のように のようになっていて , そのまま素直に同じ ( 1 ) の呼び出しは文字列へのポインタ ( 厳 く *nYO 〉の 2 バイトずつが記憶領域のどこ 桁位置に文字列を表示すると , 最後の 10 番 密にいえば先頭文字へのポインタ ) を P ⅱ ntf に かに取られる可能性があります。なぜなら Ⅱだけがずれるからて、す。したがって , ル 渡します。もし , ポインタが 4 バイトて、ある ば , ANSI て、は同・一一文字列を同じ文字列とし ープの 10 回Ⅲ i が 9 のとき ) だけ , 表示する桁 処理系て、あれば , 4 バイトもの値が渡される て扱うという保証がないことが定められて (x) 座標をひとつ減らして表示させようとい いるからて、す ( 最近の処理系は , 別々に書い ことになります。 う意図て、すね。 処理系やその環境によっては ( 例 : Turbo た文字列を同一文字列とみなすかどうかと , こて、よく考えてください。 i が 9 のときだ C のヒュージモデルなど ) , 受け取った p 「 intf いうコンパイルオプションがあるものが多 け特別な処理 ( 座標を変更 ) を行います。 i が 側は渡されたポインタの指す変数 ( この場合 いようて、すね。同一文字列とみなすように 0 から 8 まて、は決まった処理て、す。 i が 0 から 9 指定すれば , Fig .1 ( b ) のように何回て、てき は文字列 ) をアクセスするためにセグメント まて、て、あり , しかも i が 9 のときだけ特別な処 ても 2 バイトて、すみます ) 。 の切り換えなどの負担を課せられます。 理をするということがあらかじめわかって (a) のようになるか , (b) のようになるかは ( 2 ) ならば int 型の大きさのバイト数て、すみ います。 i を 0 から 9 まて、増やしながら , 毎回 ますし , 渡されるのは値なのて、 ( 1 ) のような 処理系によって違うのて、注意してください 毎回それが 9 て、あるかどうかを判断するのは またこの違いは文字列リテラルの書き換え セグメント云々といった負担はありません。 非常にムダがありますね。 10 回のループて が可能て、あるかどうかなどの深い問題と関 ・理由その 3 ・・ 毎回 if の条件判定が行われているのてす。 第 3 に putcha 「は受け取った文字を素直に わってきます。 プログラミング添削 135 (a) 教訓
ル指定をチェックしていくとき , 最後の引 す。 MS ー DOS を使い始めたころは , や findnext( ) が見つけて構造体にストアする 数のひとつ手前て、終了しなければなりませ うワイルドカード文字のあとに普通の文字 ファイル名は , すべて大文字てす。したが * の を指定するなど , まちがった指定をよくや ん。 って , ファイル指定が小文字だと , 一方 ,DELX のほうは , コマンド行の最後 ったものて、す。 ような指定以外は , fname match( ) て、は , の引数も , チェックを要するファイル名指 COPYX と DELX はほとんど同じ構造のプ すべて「非合致」と判断されてしまうのてす。 定てす。ひとつ手前て、終了してはいけませ ログラムなのて、 , 工デイタの複写機能を利 本当はこの対策は , fname match( ) のほ うに盛り込むべきて、した。今回はコール側 用してコードの流用をしています。ところ ん。 以上をお話すれば , 何がドジだったのか が「ほとんど同じ」という油断から , ここて て、いちいちライプラリ関数 st 「 up 「 ( ) をコール もドジを犯しました。 おわかりて、しよう。 して , 文字列の大文字化を図っています。 つまり , COPYX のほうはコマンド行引数 fname match() をさらに堅牢なものにす の最後の引数はコヒ。ー先のターゲットのパ るためには , ファイル指定文字列のシンタ ス名て、す。だから a 「 gv [ ] を読んて、ファイ ックスチェックを冒頭て、やる必要がありま delx. c ー教訓 ほとんど似たような構造のプログラムだか らといってコードを流用 ( reuse ) するとき「こ そ」 , 各種の条件の違いに十分注意しろ ! ついてに , Turbo C のライプラリ関数 fnsp ⅱ 1 ( ) の , 困った振る舞いについてご報告 しておきます。 この関数はパス名をドライプ名 , ディレ クトリ名 , ファイル名 , 拡張子の 4 部分に分 割して , それぞれの文字列にストアしてく れます。 ところが , 指定したパス名が , C:YJAP の ように , ディレクトリの最後に \ が書かれて いないと , JAP をディレクトリと認めて文 字列にストアしてくれないのて、す ( その理由 は fnsplit( ) のソースリストを見るとわかりま 一方 , DOS コマンドのコヒ。ー先指定など て、 C:YJAPY などと入力すると , fnsplit( ) を 満足させることはて、きても , 今度は MS-DOS がエラーメッセージを出してコマンドの実 行を拒否します。 MS-DOS にとっては C: \ JAP て、なければならないのて、す。 C のソースコードの中てこの問題を解決す る方法は比較的簡単て、すが , fnsp ⅱ t ( ) がこう いう振る舞いをすることを知らなかった間 は , デバッグにたいへん苦悩しました ! LlSt 1 : / * DE し X : ひとつのパス上の複数の指定ファイル名に合致しないファイル削除する ( 逆に言うと指定したファイル名のファイルだけが生き残る ) 3 : * 使い方 : DE し X path&file file file . ( ソース引数は複数でも可 , ただしひとつ目以降はファイル名のみ ) 5 : * ver 1. 0 0ct. 1990 , H. lwatani 6 : 7 : #include く stdio. h> 8 : # i ncl ude く d i r. h> 9 : #include く string. h> 10 : #include く io. h 〉 1 1 : #include く dos. h> 12 : #include "fname. h ” 14 : char srcpath[ MAXPATH ] . srcdrive[ MAXDRIVE ] , srcdir[ MAXDIR ]. srcfnam [ MAXFI し E ] , srcext [ MAXEXT ] : 15 : 16 : char pathname [ MAXDRIVE + MAXDIR- 1 ] : 17 : char filename[ MAXFILE + MAXEXT-I ] : 18 : char command[ 128 ] : 20 : main(int argc, char **argv) 22 : struct ffblk finfo; 23 : i nt 広 exp i red : 24 : char *rest of_command : 25 : i f ( argc く 2 戸 26 : printf( "usage: DE し X path&file file file 28 : ex i t ( 1) : 29 : 30 : 31 : 32 : 33 : 34 : 35 : 36 : 37 : 38 : 39 : 40 : 41 : 42 : 43 : 44 : 45 : 46 : 47 : 48 : 49 : 50 : 52 : 53 : 54 : 55 : 56 : 58 : fnsplit( argv[l], srcdrive, srcdir. NU しし . NU しし ) : strcpy( command, / * system ( ) に DE しコマンドを与える * / 切 E し strcat( command, srcdrive ) : strcat( command, srcd ⅳ ) : rest_of-command : command + strlea( command ) : / * コマント・未完成部分 * / fnmerge( pathname. srcdrive, 、 cd i r. findfirst( pathname, &finfo. 0 ) : exp ired while( ! expired ) { for ( n = 1 : n く argc; + + n ) { strupr( argv[ n ] ) : fnsplit( argv[ n ] , NU しし NU しし . srcfnam, srcext ) : strcpy ( filename, srcfnam ) : strcat( filename, srcext ) ; if( TRUE = fname_match( filename. finfo. ff_name ) ) break; = argc ) { / * すべての指定に合致しないので削除する * / strcpy( rest_of_command, finfO. ff-name ) : fnsplit( finfo. ff-name, NU しし NUL し , srcfnam, srcext ) : fnmerge( srcpath, srcdrive, srcdir, srcfnam, srcext ) : strupr( srcpath ) : srcpath ) : printf( "deleting.. XsYn" system ( command ) : / * DE しの実行 * / findnext( &finfo ) : / * ファイル名を次々拾っていく * / expired return 0 : ー教訓 自分が書いたコードに十分な自信があると きは , ライプラリ関数を疑え ! 108 CMAGAZINE 1991 1
ードが格納されています。 LZHUF 法を考え出した当時は本法に関す って元の文字を復元していきます。 次に圧縮ファイルの復元の手順て、す。圧 る資料がまったく手元になく , あとから知 LHarc て、は , 動的ハフマン法による圧縮・ 縮ファイルの先頭からまず 1 文字を動的ハフ ったことて、すが , Knuth のアルゴリズムて、 復元を行う前にすべての文字の頻度を 1 に初 マン法て、復元します。この文字が 0 ~ 255 て、 は , 文字が初めて出現した時点て、その文字 期化しています。これを元に , あらかじめ あれば通常の文字なのて , そのまま出力し に対応するノードを木に追加する手法を取 すべての文字を含んだハフマン木を作って ます。 256 以上て、あれば一致文字列の文字数 っています。通常のファイルて、は , 圧縮率 準備をしておいてから圧縮を始めています。 を示していますのて、 , 253 を引いて文字数と にそれほど差はないようて、す。 また , 根の頻度が 32767 ( = 0x7fff ) になった します。この場合には続いて位置情報が格 時点て , 文字の頻度を半分にして ( 元の頻度 納されていますのて、 , 位置情報を復元しま Ha 「 c のアルゴリズムの詳細 を f とすると , (f 十 1 ) / 2 に変更しています。 す。位置情報の上位 6 ビットの復元は逆変換 これは頻度が 0 にならないようにするためて、 前述したように , LHarc は「移動辞書法十 表を使って行います。下位 6 ビットはそのま す ) , ハフマン木を再構築するようにしてい ま読み込みます。位置情報は現在の位置か 動的ハフマン法」を使って圧縮を行っていま ます。ファイルの性質が途中て変わること らの距離なのて、 , ( 現在のポインタ ) ー ( 位置 す。ここてはふたつの方法をつなぎ合わせ も多いのて、 , もっと頻繁に行ったほうが圧 情報 ) ー 1 て、一致文字列の位置が得られます。 る方法の詳細について解説します。 縮率は向上するようて、すが , 速度との兼ね まず圧縮のアルゴリズムて、すが , 辞書サ この場所から文字数分を現在のポインタの 合いもあるのて , 大きくしてあります。 位置にコヒ。ーして元の文字列を復元します。 イズが 4K バイトの移動辞書法て、 , 3 バイト以 Fig. 5 動的八フマン法 上 , 60 バイト ( 注 2 ) 以下の最大一致文字列を検 この手順を繰り返すと元のファイルが復元 されます。 索します。 2 バイト以下の一致文字列しか見 22 つからなかったときは , ポインタの位置の 新 LH のアルゴリズムの詳細 文字をそのままハフマン圧縮部に送ります。 3 バイト以上の一致文字列が見つかったとき 2 01 1 0 新 LH は , ただたんにハフマン圧縮部のア には , 一致文字数に 253 を加えてハフマン圧 000 001 ルゴリズムを動的ハフマン法から静的ハフ 縮部に送ります。 3 文字一致のときには 256 , ↓ ' E ' の頻度に 1 を加える マン法に変更しただけて、はなく , そのほか 4 文字一致のときには 257 ・・・・・という具合に ① にもさまざまな変更が加えられています。 ハフマン圧縮部に送られるわけて、す。 ハフマン圧縮部て、は送られてきた 0 から これについて詳しく解説します。 まず , 移動辞書法による一致文字列の検 313 ( = 60 十 253 ) まて、の数字を , その頻度に 索部分て、すが , LH て、利用て、きるメモリが十 合わせて前述の動的ハフマン法て、最適なコ 分にあれば 8K バイトの辞書を使うことにし ードに変換して出力します。 ました ( ー 1h5 ー ) 。メモリがたりなければ自動 一方 , 移動辞書法て、得られた一致文字列 的に 4K バイトの辞書に切り換わります ( ー 1h4 の位置は , 簡易圧縮を施してから , コード ー ) 。比較する最大一致文字列長は LHarc の 化された一致文字数に引き続いて出力され 60 バイトから 256 バイトに大きくなりまし ます。ます現在のポインタからの距離に変 5 換します。つまり , ( 現在のポインタ ) ー ( 一 2 さらにこの部分て、は , 1 バイト先の文字列 致文字列の位置 ) ー 1 を計算します。この距 ↓親ノードの頻度一 こ 1 を加える をあらかじめ検索しています。現在着目し 離は辞書サイズが 4K バイトなのて、 , 最大 0X0 22 十 1 ている文字列よりも 1 バイト先の文字列のほ fff となります ( 実際にはプログラム化の都合 うが一致文字列長が長ければ , 現在の文字 上 , さらに 60 程度小さい ) 。 12 ビットて、表現 は不一致として 1 文字を出力します。こうす て、きますのて、 , 上位 6 ビットを変換表て、コー ることにより , さらに圧縮効率を上げるこ ド化して簡易圧縮し , 下位 6 ビットはそのま ま出力しています。この変換表 ( 注 3 ) の C コー とがて、きました。たとえば次のようなファ ドを List 1 に示しました。配列 p len にはコ イルがあって , マークをつけた、、 F 〃の位置か ード長が , 配列 p code には左詰めにしたコ ら一致文字列を検索する場合を考えてみま 8 3 8 1 22 、 \ / 6 び 5 0 8 14 3 8 十 1 ↓ ノードの入れ換え 22 8 十 1 6 14 8 ② 3 1 14 十 , 8 W 0 8 6 1 100 1 101 5 ③ 1 66 CMAGAZINE 1991 1
プログラミングパワー全開 すべての歯車が噛み合って 入出力からグラフィックまで BusinessTooIKit (QuickT00L-98/C + QuickFILE/db + サンフルアプリケーション ) 高レベルから低レベル関数まで PC ー 9801 のすべてを制御するマルチライプラリ OUick 90 し 98 / C PC ー 9 1 シリーズのユーザーインターフェスを一手 に引き受ける入出力に加え、グラフィック・テキスト・キ ーポード・プリンター・ RS ー 232C ・マウスとすべての I / 0 ハンドラを完全装備したマルチババスライプラリ ・入出力ハンドラ 固定長文字列・右詰めカンマ区切り数値・邦暦日付等 の基本データの人出力をすべてサポート。位置・状態別 表示属性・長さ等のフォーマットを指定して入出力。 入力時にはダイアモンドキー・カーソルキー・ファンク ションキーによる抜け出し等サポート。さらに簡易 UNDO 、変更・終了キー等ステータスも得られます。 ・グラフィック・ / 、ンドラ P C ー 9 1 の G L 1 0 を利用したグラフィックハン ドラを供給。モード・カラー・ライン・サークル・ペイン ト・文字表示・スクロール等フル装備。さらにテキスト 画面属性を考慮したハードコピー関数を実装。 ーテキスト・ハンドラ テキスト画面の一部・全部をファイルに、または最大 33 枚を GVRAM に退避 + 復帰。行スクロール・領域の 移動・表示属性の変更等、説得力のある画面作りに。 キーの 1 文字人力 / センス・一シフトキー状態のセン スの他、キーボード入力の禁止等をサポート。 ・プリンタ・ハンドラ PC ー PR201 と ESC / P の命令系プリンタに対応。 プリンタをマニュアル通りに使う為、ダイレクトドラ イプ I /F を装備。全角間に間延びの無い印字が可能。ま た半角文字を全角文字の 1 / 2 サイズにして全角半角比 2 : 1 での印字をサポート。本体の 16 ドットフォントを使 った縮小印字もサポート。 A T O K 5 / 6 の G A I J フ ァイルの登録等多彩 ■ RS ー 232 C ハンドラ R S ー 232 C の入出力・バッファステータス取得・ラ インコントロール等をサポート。 マウス・′、ンドラ Ⅸ ) S 標準添付の MOUSE ・ SYS をコントロール。 各種ハンドル関数の他、 4 種類のマウスカーソルを装備。 ■日付操作 西暦・邦暦の日付を標準的な 1 。 ng で処理する機能。 入出力・文字列変換の他、日付の演算も可能。他にシ ステム日付や曜日、閏年や実在日付のチェック等 ーその他 150 余種の関数群があなたをフルサポート ■キーポード・ハンドラ 機種依存の無い自由度の高いデータベースライプラリ OUick FILE/db 標準的なデータフォーマット 大量のデータ処理が可能高いフレキシビリティ ■特徴 ます。 は使いたくない、などという方にすぐれた効果があり ョンをマシンの台数分買う予算がない、 C 以外の言語 ラでとうとうメモリが足りなくなった、アプリケーシ した大量のデータを C で加工したい、 dB 系コンバイ 理難題、締切間際のやつつけ仕事、 dBASE Ⅲで蓄積 アプリケーションに強力な 1 本です。突然の上司の無 立させた QuickFILE/db0 虚弱体質のデータベース BusinessToolKit からデータベース管理関数群を独 QuickTOOL-98/C と QuickFILE/db のベストカップ リングすべての C ューザーに実戦的な開発環境をこの 1 つで供給いたします。 BusinesToolkit とうたっ ただけに供給される関数群もデータベースに必須なフ ァイルアクセス関数からグラフィックなどのユーザー インターフェースまですべてを網羅しました。 ■サポートファイル データファイル インデックスファイル メモファイル それぞれのファイルは、 相互に読み書き可能。 ■サポート関数 (. D B F ) (. N D X ) (. D B T) d B A S E Ⅲのファイルと Graphics BTK 0 ノ lnö dbf File ndx File dbt File Ja panese Calendar データファイル・アクセス関数 インデックスファイル・アクセス関数 メモファイル・アクセス関数 I SAM 関数フィールド変換関数 ■フィールドタイプ ConsoIe I/O Printer Text Screen ー共通仕様 文字型 数値型 日付型 論理型 メモ型 ( 1 ~ 254 ノヾイト ) ( 1 ~ 19 バイト ) ( 8 バイト ) ( 1 バイト ) ( 10 バイト ) RS-232C Terminal Mouse ・データファイルの仕様 ファイルサイズ オープンファイル数 フィールドサイズ フィールド数 レュードサイズ レコード数 最大 10 億レコード 最大 4 ( Ⅱレヾイト 最大 128 フィールド 最大 254 バイト M S ー D O S の制限 M S ー D O S の制限 ・ライプラリで供給します。ーソースは別売です。 ・ p c ー 9 1 / 2 / 3 シリース対応 ( ハイレゾ LT を除く ) ・ PC-PR201 ・ ESC/P(J82 以降 ) と互換なプリンタ ・製品への組み込みはロイヤリティは無料 ・サポートコンバイラ ① Microsoft C 5.1 Quick C 1.1 / 2.0 ② Turbo C 1.5 / 2.0 ③ Lattice C 3. x ④ Lattice C 4. x ・価格 ( ① ~ ④各コンパイラとも ) QuickFILE/db QuickTOOL-98/C BusinessToolkit 定価 36 , 000 円 定価 12 , 800 円 定価 28 , 000 円 OUick 90 し % dBASE QuickTOO し 98 は dBASEIII/IIIPLUS ・ QuickSilver から PC ・ 9801 の様々な機能を利用し、より高機能な VAR 製品を開発する目的で作られた関数・モジュール 集です。高機能な命令はあなたのデータベースアプリケー ションの可能性を飛躍的に高めてくれることでしよう。 dBASEIII/IIIPLUS ではモジュールを CALL 命令に より利用します。また QuickSilver では CALL 命令の 他に CCALL 命令でさらに強力多種な関数群を利用い ただけます。 ◆グラフィック GLIO を利用したグラフィック命令 を供給。モード・カラー・ライン・サークル等を装備。 ◆プリンタ pc - PR201 系と ESC / p 系のプリンタに 対広プリンタをマニュアル通りに使う為にダイレクト I /F を装備。全角間に間延びの無い印字が可能。また半角 文字を全角文字の 1 / 2 サイズにして全角半角比 2 : 1 での 印字をサポート。本体の 16 ドットフォントを使った縮 小印字もサポート。一般的な ATOK6 の GAIJ ファイル の外字フォントを PC-PR201 にするヒもあります。 BusinessToolkit EX ( 全ソース ) 定価 180 , 000 円 QuickFILE/db EX ( 全ソース ) 定価 130 , 000 円 QuickTOOL-98/C EX ( 全ソース ) 定価 50 , 000 円 定価 36 , 000 円 用モジュール Quick SiIver 用ライプラリ ◆ RS -232C RS-232C の入出力・バッファステータス 取得・ラインコントロール等をサポート。 ◆邦暦日付 CCALL で邦暦の日付の入出力・文字列変 換等をサポート。邦暦テープルはテレベルで修正可能 ◆その他強力な入力処理、出力処理、テキスト画面制 御、 FEP 処理など CALL で 30 、 CCALL では余り に及ぶ強力な機能を用意しています。 ・ PC ー 9 1 / 2 / 3 シリース対応 ( ハイレゾ LT を除く ) ・ソース・実用サンプルプログラム「電話帳」付き 製品への組み込みロイヤリティ無料 上記商品は全国のソフトショップ、パソコンショップでお求めいただけます。秋葉原常備店・ヒロセムセンパーッセンター 3 号店、ソフトハウス COM 、 LAOXTHECOMPUTER 館 Soft house 千葉市中央 1 シャンポール第 2 千葉中央 4 0 8 TEL 0472 ( 22 ) 9801 FAX 0472 ( 25 ) 8180 土・日・祝祭日を除く 10 : 00 ~ 17 : 00 Crescendo ・ CO ・ クレッセンドカンパニ ( 注 ) 記載されている商品名等は、各社の商標または登録商標です。記載されている価格には消費税は含まれておりません。 く資料請求番号 15902 〉 QuickBAS ℃用の ISAM データベースライプラリ、、 Q 、 F M ′′ 90 年 12 月発売中 定価 37 , 000 円
アプリケーション アプリケーション AP 生まれの AP 育ち C 言語用プログラミンク、支援ツーノレ 「簡単シリーズ」十「作ろうシリース」※開発ェ数削減と標準化のために 「キー入力か簡単」 、テ、一タテ います。 キャン関数、 V 一日 AM のリード / ライト関数等も用意して リアルタイム・クロック表示関数や、ダイレクト・キース BS ・ HELP ・ HOME e 十 c の特殊キーも全て取得 OK 。 文字列を任意の色で表示できます。ロールアップ / ダウン・ 示 / 非表示も設定自由、 PF キーガイドラインには任意の タ表示色・アトリヒュートも、 PF キーカイドラインの表 ます。カーソルは、現在入力中の位置に表示します。テー 力したいところではフロントエンドプロセッサを立ち上げ アに格納します。入力テータタイプもチェックし、漢字入 された桁の入力を受けつけ、入力テータを指定されたエリ 数を提供します。キー入力関数は、指定された位置で指定 キー入力関数・テキスト画面制御関数・カーソル制御関 VER. 2.0 ーー \ 28 , 000 VER. 1.0 ーー \ 14 , 000 「ク、ラフか簡単」 「印字が簡単」 VER. 2.0 ーー \ 18 , 000 データ出力関数・ピットイメージ出力関数・プリンタス テータスチェック関数を提供します。文字列テータはもち ろん、罫線テータも同時に出力できます。文字列も罫線も、 画面のように桁・行て印字位置を決めるのて桁合わせは不 要。文字列は、拡大・下線・網掛け等の特殊効果を同時に 指定可。罫線は実線 / 破線それそれに太 / 細の計 4 種類を サホート、ヒットイメージを出力して引く罫線よりも高速 に印字します ( 社内テスト結果 : ヒットイメージ出力で 10 分かかった表が、 6 分で出力完了に〃 ) 。また、文字と罫線を 同じ桁・同じ行に出力できるのて、ムダのない帳票を設計 できます。もう、制御コード出力処理だらけの読みにくい プログラムとはオサラバです。 「ウインドウか簡単」 VER. 1.0 ーー \ 28 , 000 各種のウインドウ制御関数と、 N88BA 日 C を基本にし たグラフィック関数を提供します。最大 20 個のオーバーラ ップ・ウインドウをオープンできます。テキストモードとグ ラフィックモード双方向をサポート、ウインドウ内てのキ ー入力関数・テキスト画面制御関数・カーソル制御関数も そろっています。文字列表示関数は、ウインドウ・サイズに 合わせた自動改行機能を持っているのて、プロクラミング の手間もくっと省けます。通常のウインドウに加えてメニ ュー選択処理のためのメニューウインドウや、 Y/N のキー 入力を受けて返せるメッセージウインドウもサポート。ユ ーサー・インターフェイスの優等生・ウインドウ処理を、 メモリ操作なしのお手軽プロクラミンクて実現できます。 ーフリレをセットして、関数をコー丿レする グラフ描画関数と、 N88 日 A 日 C を基本にしたグラフィ ック関数を提供します。描画できるグラフは、棒グラフ ( 縦・ 橫 ) 、折れ線クラフ ( 縦・横 ) 、円グラフの計 5 種、棒グラフ と折れ線グラフは重ね合わせも可能。色やラインバターン の設定は自由です。描画のためのテータテープルをセット して関数をコールすれは、クラフ本体はもちろん、タイト ル・グリッド・単位・凡例まで、全て関数内で計算・描画 するので、メインプログラム側ての計算処理は何一つ必要 ありません。「簡単シリーズ」は全て併用可能ですから、「ウ インドウか簡単」と「グラフが簡単」を併用すると、グラフが 出るウインドウを画面上にオープンする、なんてことも、 あっとオドロク簡単さでできてしまいます。 「作ろう」シリ だけ 「マウスが簡単」 VER. 1.0 ーー \ 18 , 000 マウスドライバとのインタフェース関数を提供します。 「キー入力か簡単 V2.0 」と「ウインドウか簡単 VI . 0 」と併用 すると、プルダウンメニュー関数や、タイアログ関数 ( 文 字列、メニュー、リスト・ホタン、シートなとの豊冨なア イテム ) 、マウス情報取得関数が使用できます。 マウスのアクションに対して各関数か返す値として、任意 の値をあらかしめ設定することもできます。このことを上 手く利用すれば、マウスとキーホードを併用するアプリケ ーションを作る際、マウス用のロジックとキーホード用の ロジックか一本化できるのて、プログラムか長くならずに 済みます。高い機能を短いステップで、簡単シリーズの身 上です。 ワ、一ドコピーか簡単」 VER. 1.0 ーー \ 22 , 000 グラフィック画面をモノクロ 8 階調または、カラープリ ンターにハードコピーします。領域指定や色指定など豊富 なオプションも用意。その他、アプリケーション実行中に 現在の画面を Disk にセーフする常駐プログラムと、セー プしたテータを圧縮するプログラム、更にそれらのテータ を再表示したり、印字したりするプログラムも装備してい ます。 苦労して作った美しい画面の利用範囲が広がります。 ーズ ・「住所録を作ろう」 「キー入力 V2.0 」と「印字 V2.0 」使用 ・「スケジューノレ表を作ろう」 「キー入力 V2.0 」と「印字 V2.0 」と「ウインドウ VI . 0 」使用 ・「こづかい帳を作ろう」・ 「キー入力 V2.0 」と「印字 V2.0 」と「ウインドウ VI .0 」と「クラフ VI . 0 」使用 ・「らくカゞき帳を作ろう」・ ・・ V R. 1.0 ー Y8 , 600 ・・ V R. 1.0 一 Y7 , 200 ・・ V R. 1.0 ー Y6 , 400 ・・ VER. 1.0 ー Y9 , 800 イアウトの印字も可能。 入力すると、定義テープルがソースコードとして出力され、さらにファイル・レ イタ。テータファイルのコードサイズ、各テータ項目のタイプ・長さ・名称等を ソフトウェア・システムを開発する際のテータ・ファイル設計を支援するエテ VER. 1.0 ーー \ 18 , 000 「ファイ ) レ・エテイタ」 シリーズの部分以外 ) ですので、これを基にあなただけの AP が作れます。 簡単シリーズのノウ八ウをつめ込んだ例題集です。わかり易いソース付き ( 簡単 「キー入力 V2.0 」と「ウインドウ VI .0 」と「マウス VI .0 」と「ハードコピー VI .0 」使用 「簡単ツールエテイタ」 VER. 1.0 ーー Y22 , 000 「簡単シリーズ」のテータテープルを編集するための、専用工テイタてす。 画面上で、マウス ( なくてもかまいません ) やキーボードを使って、実行画面や帳 票のイメージをワープロ感覚て入力すると、そのまま使えるソースコードが出力 されます。これ 1 本で「キー入力 ( V2.0 ) 」「印字 ( V2.0 ) 」「ウインドウ ( VI . 0 ) 」「グ ラフ ( VI . 0 ) 」をサポートしています。データ編集中に、擬似テータを使って表示 したり印字したりできるので、テストランの必要もなく、簡単シリーズを更に簡 単にお使いいただけます。 ロシステム構成 ( 共通 ) ・本体 . PC -9801 (XA/XL/XL2/Rl-J\ イレソ / LT を除く ) ・ OS . MS-DOS V3.1 / 3.3 ( F ・ PMS ー DOS に添付のもの ) ・プリンタ : NEC PC-PRIOI 系、 PC ー P 日 201 系 ( 但し、ファイル・エテイタ は 201 系のみ ) ・コンバイラ Micosoft-C/Lattice-C/Tu 「 bo-C/Quick-C ( 簡単シリーズは、御使用のコンバイラを指定して下さい。 ) ・メティア : 5 ・ 2HD / 3. 2HD ( 御希望のメティアを指定して下さい。 ) ※全商品プロテクトなし、サンプル付きです。 ※記載されている内容は、将来予告なしに変更することがあります。 ※ MS-DOS 、 Microsoft-C 、 Quick-C は、米国 Microsoft 社の 登録商標です ※ Lattice-C は、米国 Lattice 社の登録商標です。 ※ Turbo-C は、米国 BorIand te 「 nation 社の登録商標です ※お問合せはお近くのマイコン・ショップか、私どもへどうそ 工 1 ジステ必工ユニ鱸ユ 〒 790 愛鰀県松山市北藤原町 1 ー 26 TEL : ( 0899 ) 31 ー 2886 FAX : ( 0899 ) 41 ー 0336 LJ ターン者募集 / ・株式 会社 く資料請求番号 195 〉
に近い圧縮が可能て、すが , 局速アルゴリズ ムが考案されていないのが難点て、す。 以前の ARC や PKPAK などのアーカイバ て、は , ①の方法の一種て、ある LZW 法て、圧縮 を試みると同時に文字の出現頻度を記録し ておき , ①よりも②のほうが高圧縮が期待 てきるときには②の方式に切り換えるよう 圧縮アルゴリズム LH で使用した になっていたようて、す。 移動辞書法 Fig. 2 レ HUF 法によるファイル圧縮の概念図 問題は辞書の中からもっとも長く一致す しい文字を追加します。 書がいつばいになると古い文字を捨て , 新 きにはその文字そのものを出力します。辞 つからないか , 圧縮効果が期待て、きないと 情報が出力されます。一致する文字列が見 のか」と「一致した文字列の位置」のふたつの 字列が見つかったときには「何文字一致した 字列を探す辞書として使用します。同じ文 よりも前に処理したファイルそのものを文 移動辞書法とは , 現在着目している位置 らに詳しく解説していくことにします。 法」を使っています。このアルゴリズムをさ 新しい LH て、は「移動辞書法十静的ハフマン 辞書法十動的 ( 適応的 ) ハフマン法」を使い 念図を Fig. 2 に示します。 LHarc て、は「移動 LHarc を含めた LH の圧縮アルゴリズムの概 なく , 両者を併用して圧縮をかけています。 LH て、はふたつの方法を切り換えるのて、は る文字列をいかに効率よく発見するかとい うことて、す。 LHarc て、は奧村さんが考案さ れた「二分検索木」によるアルゴリズムを , 新 LH て、は「 Trie 」による検索アルゴリズムを 使っています。二分検索木による移動辞書 法は高速化を考えなければ非常に少ないメ モリて、実現て、きるよい方法なのて、すが , 最 大一致文字列がいくつもあるとき , この中 て、最後に出現した文字列を見つけることが て、きないのて、位置情報の圧縮効果が悪いと いう欠点がありました。そこて、新 LH て、は Trie を使ったアルゴリズムに変更することにし ました。同時に高速化も狙ったのて、すが , 最大一致文字を 60 文字から 256 文字と大きく したこともあって , 残念ながらあまり速く はならなかったようて、す。 e による実際のアルゴリズム 新 LH て、は , 辞書を効率よく検索するため に Trie という木構造を使っています。この 木構造の例を Fig. 3 に示しました。ここて、は 検索する最大文字列長を 5 文字に制限してい ます。ある時点て、 , ①の木構造があったと します。各ノードは実際には文字列をもっ ているのて、はなく , バッフアの中の文字列 の位置と長さを記録しています。 こて、文字列 acacb 〃を検索・挿入するこ とを考えてみます。検索は木の根の、、 a 〃から 始めます。このノードは 1 文字だけを保持し ているのて、 , 、、 acacb 〃の 2 文字目の、、 c 〃て、子ノ ードを探します。子ノードは最大 256 個存在 する可能性があるのて、 , ハッシュ表を使っ て子を探しています。枝の横に書いた文字 は , ハッシュするときのキーとなります。 Fig. 3 ① 辞書の T 「 ie による表現 b abc C acaca d abcde X 、、 acacb ″を挿入 abcxy acac ② d abcde ③ abc X abcxy acaca acacb abc d abcde abcxy X ④ a bcxy acacc" を挿入 を acac acaca acacb acacc ↓ 、、 abcde ″を削除 acac acaca acacb acacc 子ノード、、 acaca 〃が見つかりましたのて、 , 3 文字目から比較を始めます。 5 文字目が異な っているのて、 , ここて、枝を分けて、、 acac クの $acacb" を作ります。 子ノード、、 acaca , れて、②の状態となりました acaca 〃のノー ドに書かれている位置が一致文字列の位置 , 一致文字数は 4 となります。最後に , 今登録 した、、 acacb クから根の、、 a 〃まて、の位置を現在 入力ファイル - ーーーー 64 CMAGAZINE 1 的 1 1 移動辞書法 不一致文字 一致文字列長 文字列位置ーーーーーーー + 八フマン法 0 「 表引き 八フマン法 圧縮ファイル
入門 アルコリズム を特集 加することなどを考えています。 ます。また一 0 オプションをつけると LHarc のヘッダのすべてのバイトの CRC を計算し 「予約ずみ」の部分は , これまて、の互換性 て、解凍て、きる一 1h1 ーて、凍結します。このとき て格納します。なお , レベル 1 ヘッダにおい を考えて 0X20 を書き込んて、おくことにしま には , ヘッダもレベル 0 となります。 ては , ディレクトリ名がなく , 属性が通常 LHarc て、解凍可能な圧縮法は一 1h0 ー , ー 1h1 す。 のファイルて、あれば拡張ヘッダはひとつも 本へッダて、はファイル名の長さの制限を ーレ 5 ーて、 , 凍結時には一 1h0 ー , -lhl ーレ 4 ー 書き込まれませんから , ヘッダの CRC も不 ーのみが作成されます。 避けるために , ファイル名は拡張ヘッダに 要なのて、 , 共通ヘッダも省略することにし 己入することとし , 基本へッダからは削除 ー 1h2 ー , ー 1h3 ーは , 昨年 , 新版を出すべく試 ています。 作した LHVer. 1.9x というバージョンて、採 ファイル名ヘッダはレベル 2 ヘッダて、は必 須て、す。また , レベル 1 ヘッダて、も , 「ファ 用した圧縮法て、 , 幻と化してしまいました のて、あまり関係がありません。 イル名の長さ」に 0 が書き込まれているとき には使用て、きます。 拡張ヘッダには , 現在のところ , 対応て ディレクトリ名ヘッダにはディレクトリ 圧縮アノレゴリズム きていないものもありますが , Table 3 に挙 名が格納されますが , 区切り文字は OS 依存 ーこっし、て = 、 げたものを考えています。拡張ヘッダは目 性を避けるため , 、、 Yxff" としました。な お , ディレクトリ名の最後には必ず区切り ファイル圧縮法の概要については , Part1 的別に独立していますのて、 , 複数の拡張へ て、奧村さんが詳しく解説されているのて、 , ッダを続けて記載することが可能て、す。複 文字をつけておくものとします。 数の拡張ヘッダを記載するときには , 書き コメントヘッダは現在のところどのよう , こて、は LH に関連したものを中心に , 簡単 にサポートするか未定て、すが , 近いうちに 込む順番に制限はありません。拡張ヘッダ に説明いたします。 必ず組み込もうと考えています。 現在使われているファイル圧縮法を大別 の識別子には , OS 非依存の情報用に 0X00 ~ 0x3f を , OS 依存の情報用に 0X40 ~ 0x7f を割 MS ー DOS 依存の属性へッダは , ファイル すると , ①反復文字列を圧縮する方法 の属性が 0X20 以外て、 , -a オプションが指定 り当てています。 OS の識別文字が自分の環 ②文字の出現頻度の差を圧縮する方法 されたときにだけ作成されます。 境と違うときには OS 依存情報は無視されま のふたつに分けられます。一般的にいうと , すのて、 , OS 依存部分は移植者の自由に任さ で取り扱える圧縮法の種類 文書ファイルては同じ単語が何回も出てき れています。 ますのて、 , ①の方法によって高圧縮が期待 共通ヘッダにはヘッダ自体の CRC と付加 て、きます。一方 , マシン語のバイナリファ 情報が書き込まれます。付加情報は現在ま 新 LH て、解凍可能な圧縮法の種類を Table イルなどて、は①の方法て、はあまり圧縮て、き だ構想の段階て、正式に規定していないのて、 , 4 に示しました。凍結時は使用可能なメモリ ず , ②の方法て良好な圧縮が得られること バイト数も増える可能性があります。ヘッ の状態により , ー 1h4 ー , ー lh5 ーが自動的に切り 換わります。圧縮に失敗したときやー z オプ もあります。 ダの CRC はこれに 0 を書き込んだ状態て , 基 前者の方法としては LZW 法 , 移動辞書 ションをつけたときには , ー lh0 ーて、格納され 本へッダの最初から拡張ヘッダの最後まて、 (sliding dictionary) 法などがあります。どち TabIe 4 新 L H で解凍可能な圧縮法の種類 ( * は作成可能な method ) らの方法も過去に出現した文字列の辞書を ーぬ 0 ー no CO(TIP 「 ession 作っておき , 同じ文字列が再び出現したと 4k sliding dictiona 「 y(max 60 bytes) 十 dynamic Huffman きには文字列を出力する代わりに文字列を 十 fixed encoding Of position 示す短いコードを出力します。連続して出 8k sliding dictiona 「 y(max 256 bytes) 十 dynamic Huffman 現する同一文字を符号化する連長圧縮法も ーぬ 3 ー 8k sliding dictiona 「 y(max 256 bytes) 十 static Huffman この一種といえます。 4k sliding dictiona 「 y(max 256 bytes) 十 static Huffman 後者の方法としてはシャノン・フアノ法 , 十 imp 「 oved encoding Of position and t 「 ees ハフマン法 , 算術圧縮法などがあります。 8k sliding dictiona 「 y(max 256 bytes) 十 static Huffman 十 imp 「 oved encoding Of DOSition and t 「 ees 出現頻度の高い文字には短いコードを , 滅 2k sliding dictiona 「 y(max 17 bytes) 多に出てこない文字には長いコードを与え no COTIP 「 ession ることによって圧縮を行います。とくに算 4k sliding dictiona 「 y(max 17 bytes) 術圧縮法はこのような方法としては理論値 特集圧縮アルゴリズム入門 63 1 三ロ 広張ヘッダ こ二コ ーぬ 5 ー -lzs- ーに 4 ー ーに 5-
◆ C PARTS は、通常アプリケーション開発に必要と思われる画面制御、テー タ入力制御、帳票印刷制御、パーコード印刷制御、旧 AM 制御などの関数 をソースファイル形式で、しかも低価格で提供しています ◆ C PARTS で提供する関数は、特殊な OS を使用する場合を除いて、基 P A R T S 本的には AN 引規格の関数を使用しておりますので、現在市販されている 一般的な c コンパイラーのほとんどで使用可能です (Lattice C, MS-C, QuIck C, TURBO C) ◆ C PARTS は、ソースファイルで提供していますので、必要に応じて機能変 更が可能です ◆ C PARTS では、表示、印字等の処理を行う関数では、通常フォーマットフ ァイルを使用しています。フォーマットファイルを使用するメリットは、多少の変 更はアプリケーションプログラムの変更をしなくても、エテイター ( 市販のもの J31 ロロシリーズ、 AX 用 です ) で簡単に行うことができることです ◆ c PARTS は、ライセンスフリーです。 C PARTS を使用して作成したアプリ 近日発売予定 ケーションプロクラムに対しての、特別な契約をする必要かありません。 VOL.I ( 帳票作成ソースライプラリー ) 本ソースライフラリーでは、フォーマットファイルを使用した帳票印字用の関数を提供していま 一般的に、帳票を作成する場合印字位置、印字桁数、タイトル文字、罫線の印字なと、一表の 帳票を作成する場合本体のプログラム、つまりテータの集計なとの処理よりも、前記の項目に ついての調整に多大な労力を費やすのか普通て魂 そこで、本 C PARTS では、印字位置、印字裄数、タイトル ( 固定文字テータ ) 、罫線の有無 については、あらかしめフォーマットファイルで作成しておき、プロクラム本体の作業は単に順 番にテータを出力することのみとすることを可能としています。 ■対応機種 . PC9801 シリーズ 発売中¥ 12 , 800 ( J3 刪シリーズ、 AX 用近日発売予定 / ) VOL.2 ( バーコード印字ソースライフラリー ) ・対応機種 . PC9801 シリーズ 本ソースライプラリーでは、 PC9801 用プリンター P 日 201 でバーコードを印字するための関数を提供しま魂 ノヾーコードの使用は POS 関連、配送関連など各種の流通業界だけでなく、最近では DM の返信用はかきに印字したり、招待状に印字することにより、応答 の管理をしたり、自社製品にノヾーコードを付けることにより商品管理をしたりなと、いろいろな用途で使用されるようになっていま魂 本ライプラリーでは、フォーマットファイルを使用することにより、通常文字の印字位置、桁数、バーコードの印字位置を随時変更可能とし、手軽にノヾーコー ドの印字を行えるようにしていま魂 発売中¥ 14 , 800 VOL.8 ( 画面制御、入力ソースライフラリー ) ■対応機種 . PC9801 シリーズ 本ソースライフラリーでは、画面表示、テータ入力用の関数を提供します。 本ソースライフラリーでは、画面フォーマットファイルを使用することにより、入力位置、桁数、 タイトル ( 固定文字 ) の指定か随時可能となっていま魂 また、本フォーマットファイルには、入力テータの編集の条件、表示色、ホックスサイズ、ホック スカラー、罫線、初期テータなどの各種バラメータの設定も可能ですから、プログラム作成後 でも、上記項目につし、ての変更か可能となっています。 また、ウインドウ単位で上記フォーマットファイルを設定しますから、かなり複雑な処理も可能 です。 更に、メニューで設定されたウインドウでは、メニュー選択の処理関数を用意していますので、 ユーサーは本関数を呼ふたけでメニュー選択処理か出来ま魂 発売中¥ 14 , 800 \/OL 4 (ISAM ソースライプラリール対応機種 PC9801 シリーズ、 J3100 シリーズ、 本ソースライプラリーではコ SAM を C で使用可能にするための関数を提供しておりま魂 ー SAM ファイルは、テータ部分とキーテータ部分を独立して管理しており、 1 つのテータを検索するためにいくつかのキーを設定することか出来ます。 また、呼び出し時には設定キーてテータを呼び出すことか出来ますから、テータ管理か格段に楽になりま魂 発売中¥ 1 9 , 800 VOL.5 ( クラフ作成ソースライプラリー ) ■対応機種 . PC9801 シリーズ 本ソースライプラリーでは、フォーマットファイルを使用した各種ヒジネスグラフ作成関数を提 供しま魂 フォーマットファイルを使うことによって、プログラムの変更なしにグラフの種類、テータの項目 数、グラフの表示位置・色・サイズ・種類・各種文字修飾の有無・タイトル等を変更することかで きます。 ( 通常ユーザーか使用する関数は 1 個だけです ) また、表示用のテータはテータファイルから取り込む方法と、アプリケーションプログラム中て・ 渡す方法かあり、用途により選択できま魂 作成できるクラフは下記の 5 種類てすか、これらには多数のバリエーションがありますので、組 み合わせによっては数百におよぶクラフを作成することかてきま魂 発売中¥ 19 , 800 VOL.6 ( 割込処理ソースライプラリー ) 開発中 \/OL. 7 ( 簡易 LAN 用ソースライフラリー ) 開発中 VOL.8 ( ペーシプリンタ制御ソースライプラリ 開発中 ※詳しい内容等につきましては、電話てお問い合わせください。 P A R T S ( 実」 ) 下をのと物り第 & し一した 0 - 第 A を T 0 しを 2 当 . いげ・・一して第に . ようを・・の・興に ア、第ルは興 制をち ) イを O トの 一すは はアまに 数フ薮 関ので関 ン下がン 一以と一 リ ) 」リ ク 4 るク郡 ス 6 すス↓ 秋島ビル 処理を経り返しますか いいえ 続々登場。 し E D タタタタ タタタタ デデデデデデデデ S Vo ー . 5 1 2 3 4 5 6 7 8 月月月月月月月月
と , 通常の文字の中に「一致位置」 ( 何文字戻 って ) , 「一致長」 ( 何文字コヒ。ーせよ ) という 命令が組み込まれます。 LArc て、は通常の文字とこのような命令と を区別するために 1 ビットのフラグを挿入し ていました。 この方法を改善するために , 私は次のよ うなことを考えました。 まず , コヒ。ー命令は「一致長」 , 「一致位置」 Brent のアルゴリズム SLH は , 一致長を 256 の順に直すことにします。 通常の文字は 256 通りあります。また , 「一 まて、にして通常の文字と合わせた 512 種類 ( 9 致長」は , コヒ。ーする文字列の長さをたとえ ビット ) の「文字」を考え , 一致位置も 9 ビッ となります。この中から現在考えている文 ば 3 文字以上 60 文字以内に制限すれば , 58 通 ト十 9 ビットに分解し , ファイル全体を 9 ビ 字列ともっとも長く一致するものを木の 2 分 りて、す。 ット単位に仕立て直したうえて、 , ハフマン 探索て、見つけるのて、す。これなら , うまく これらを合わせた 314 通りを新たな「文字」 圧縮をするというもののようて、す。 いけば 10g2 4096 = 12 回程度の比較て、すみま と見なして , これに対してハフマン圧縮ま これなら私たちの方法のほうがよいと思 す。 たは算術圧縮を適用すればきっと圧縮比が しかし , この方法て、はある種のデータベ かなり改善て、きるはずて、す。 ースのデータて、は著しく遅くなることがわ また , この 314 通りの「文字」の 257 番目以 かりました。二分木のバランスが悪くなる 降は実際はコピー命令て、すから , その直後 ためて、す。 には必ず「一致位置」がきます。こうして , この不具合を直し , さらに探索を速くす 私が最初に書いたスライド辞書のプログ る方法を考えていたところ , たまたま読ん これまて、通常の文字とコピー命令とを区別 [ 5 ] するのに使っていた 1 ビットのフラグが不要 ラムは , 4096 バイト分の環状バッフアに祝 だ FiaIa and Greene に McCreight の Suf み込んだファイルの中から最長一致文字列 になります。 fixtree に基づいたスライド辞書圧縮につい を単純な文字列照合アルゴリズムて、見つけ この 314 通りの「文字」の圧縮には適応型の て書いてありました。 算術圧縮を使いました。また , 「一致位置」 るというものて、した。 Suffix tree は Patricia 木の変形て、 , patri の圧縮には , 確率分布を天下りに与えてし 環状バッファて、すから , 4096 文字読み込 cia 木は trie( トライ ) というデータ構造に基づ まう固定型の算術圧縮を使うことにしまし んだら , 次からはもっとも古い文字から順 くものて、す。 こうしててきた C* のプログラムが に捨てていきます。したがって , 一致位置・ この論文を吉崎さんにお見せしたところ , 「 1 ロ はつねに 12 ビットて、表せます。 LZARI て、す。 早速プログラムを作ってくださいました。 これがじつに巧妙にてきているのて、す。現 吉崎さんの LZHUF は , この適応型算術圧 しかし , 1 文字ごとに 4096 通りの文字列と 比較するのて、は非常に遅くなります。そこ 縮を適応型 ( 動的 ) ハフマン圧縮に , 固定型 在て、もこの部分は吉崎さんに負うところが て、 ,BeII [ 2 ] に倣って二分探索木を用いるこ の算術圧縮を固定型のハフマン圧縮 ( 天下り ほとんどて、 , 私はハッシュ関数を少しいじ とにしました。これは , 最新の 4096 個の文 ったり , FiaIa and Greene が述べていた遅 の確率分布から導いたハフマン符号 , つま 字列を二分探索木に登録しておき , この中 り適当に定めた接頭符号による圧縮 ) に置き 延更新方式 percolating update を付け加え たりしただけて、す。 から最長一致文字列を探すというものて、す。 換えたものてあることは先ほど述べたとお たとえば圧縮したいファイルが , この木に gnat, gnomon, gnomosome の りてす。 算術圧縮のほうが圧縮比はわずかによい supercalifragilistic.. 3 語を登録したときの状態は Fig. 4 のように て , 一致長を仮に 10 文字まて、に制限すると , のてすが , 速度まて考えればハフマン圧縮 なります。ただし実際には文字列そのもの 登録する文字列は , に軍配が上がります。私は吉崎さんにかぶ を木に入れるのて、はなく , その文字列があ supercalif とを脱ぐことにしました。 る環状バッフア内の位置と文字列の長さと あとてわかったことてすが , 似たような upercalifr を入れます。たとえば Fig. 4 の・・・・・・ 0m0 に ことを Brent[4] も考えていたようてす。 percalifra は , gnomon と gnomosome のうち , あとて、 56 CMAGAZINE 1991 1 Fig. 3 最長の八フマン木 ーー 5 ーー 8 ーー 13 1 1 2 3 1 5 ercalifrag スラド辞書の改良