ベス N ト - ソースコード付属 / 組み込みロイヤルティ無料 < The C Libraries CCF / 総合コンソールコントロールライフラリ = =. 価格 \ , 800 CCFZEX 価格 \ 98 ′ 0 ◆ rCCF/EXJ では XL 、 XL2 、日 L のハイレゾリューション / ノーマルの両モードに対応し、 キーホード、テキスト画面、グラフィック、マウス、ウインドウ、メニュー、プリンタ、拡張 一部の関数を除いて、どちらのモードでも動作するプログラムを開発することができます。 関数等 200 以上の関数で構成される総合コンソールコントロールライプラリです。 rG 「 aDhic プリンタ関数 ( 抜粋 ) & CWindow & Menl-JJ 、 rKey & Dis ay 」とプリンタ関数、拡張関数で構 文字出力 / プリンタステータスの取得 / プリンタの初期化 / プリンタステータスの取得 / C 日、 成されています。 LF 出力 / 漢字文字出力 / ANK 文字列出力 / 漢字、 ANK 文字列印字 / 漢字、 ANK 文字列印 ・「G 「 aDhic & MOLlSezs tWindow & Men1JJs tKey & Disp y 』については各製 字 (ANK— > 半角変換 / 漢字 / ANK 文字列縦印字 ( ANK ー > 半角変換 ) / / ・プリンタのリセット 品の説明をこ覧ください。第プリンタ関数は OS を介してプリンタに文字コード、制御コ VSELECT 、 DESELECT の切り替え / ドラフトモードの設定、解除 / 片方向、両方向の ード送り、各種アルファベットの文字印字、拡大、キャラクタモードの切り替え、フォームフ 切り替え / 改行方向の切り替え / テータのキャンセル / フォームフィード / n 月 20 インチ改行 ィード、プリンタ状態の設定 / 検査、印字方向の切り替え、サプスクリプト / スーバースクリ に設定 / レ 6 インチ改行設定 / レ 8 インチ改行設定 / n 回改行 / 漢字モード設定 / 解除 / ANK モ プト文字の印字、縦印字、強調、アンダーライン、ドラフトモードの切り替え、左右マージン ードの選択、設定 /HS PICA モード設定 /Condense モード設定 /Elite モード設定 / の設定、改行幅 / 方向の切り替え、ソフトウェアリセット等の処理を行うことができます。対 P 「 0 ロ 0 「 tion 引モード設定 / 拡大倍率の設定 / 強調モード設定、解除 / アンダーラインモー 応プリンタは PC - P 日系です。■拡張関数は MS - DOS ファンクションコールを用いたキー ド設定、解除 / 漢字縦モード設定、解除 / 漢字印字幅の変更 / 横倍角印字モード設定、解除 / 入力関数、文字列処理関数、 y ( es ) / n ( 0 ) の入力を促し、 Shift 、カナシフト、全角、半角 1 バイト文字印字モードの変更 / スクリプトモードの設定、解除 / 漢字半角モードの変更 / ド のいずれの状態でも y / n を判断する関数等があります。 ットスペースの出力 / 左、右マージンの設定 Window & Menu 価格 \ 29 ′ 800 Window & Menu/EX ー - = ー格 \ 49 第 800 ームキャラクタ、フレーム色、ウインドウ内の表示色の設定が可能です。この機能により、好 テキストウインドウ、メニュー関数のライプラリバッケージ。最近のちょっとしたソフトでは みの色、キャラクタを用いたウインドウを定義可能・横長タイプ、縦長タイプ、羅列タイプ 大抵ウインドウ機能を備えています。例えはスクリーンエテイタでは画面を分割し 2 つ以上の の 3 タイプのメニューウインドウにより、用途に応じたメニュー表示が可能・サンプルプロ ウインドウを開いて編集できるとか、テータベース、業務用ソフト等では簡単な説明や操作ガ グラムメニューウインドウにファイル一覧を表示し、選択されたファイル内容を上下左右ス イドをへルプウインドウを開いて表示したりしています。このような表示を行うためのマルチ クロール機能を持った文字列表示関数により、スクロール表示をおこなうサンプルプロクラム ウインドウ機能とウインドウを利用したメニュー選択機能を提供します。 か付属。 CWindOW & Menu/EXJ は XL 、 XL2 、日 L のハイレゾリューション / ノーマルの両モー 次の関数の他、 CKey & DisplayJ の * 印が付いている関数も加わります。 ドに対応し、互換モード ( 自動判別 ) によりどちらのモードても動作するプログラムを開発する 関数 ( 抜粋 ) ことができます。また、八イレゾリューションモード時には 31 行 / 25 行モードを選択すること ウインドウの初期化、終了処理、オープン、クローズ / すべてのウインドウをクローズする / かできます。 表示対象となっているウインドウをクローズする / 表示対象ウインドウを別のウインドウに切 ーウインドウ / メニューウインドウあわせて 20 個までのウインドウがオプンできる ( 増減可 替える / ウインドウの移動 / ウインドウ内をプランク文字で消去 / ウインドウ内に文字を表示 能 ) ■オーバーラップ / 切り替え機能オーバーラップにより隠れたウインドウを一番上に表 / 上へスクロールし、文字列を表示 / 下へスクロールし、文字列を表示 / ウインドウを上、下 示■移動機能ウインドウを指定された座標へ移動・文字列表示行を指定する関数と、 にスクロール / ウインドウのフレームタイプを登録 / 文字列を指定行表示 / ウインドウ内に文 上下スクロールを伴った文字列表示機能がある・スクロールスクロール関数と、文字列表 字列を表示し、キー入力によりテキストをスクロール / ウインドウを開き、・ y ・または・ n ・キーを 示を伴った上下スクロール機能がある■ V 日 AM をアクセスしてウインドウ操作を行っている 入力を促す / 水平メニューウインドウをオープン / 表示し、選択を行う / ボップアップメニュ ので高速。ウインドウの切り替えもほほ瞬時■ウインドウを開き、 y(es) 、 n ( 0 ) の入力を ーウインドウをオープン / 表示し、選択を行う / ワイドメニューウインドウをオープン / 表示 促す関数と上下左右スクロール機能を持った文字列表示関数によるテキストファイル等のスク し、選択を行う / H. 八イレゾリューション / ノーマルモード、 25 / 31 行モードの設定を行う ( H. ロール表示か可能な拡張ウインドウ機能ーカスタマイズド・ウインドウウインドウのフレ マークが付いている機能は八イレゾモードでのみ使用可能 ) Graphic & Mouse 価格 \ 29 , 800 Graphic & Mouse/EX 価格 \ 59 ′ 800 ◆ rC3 「 aphic & Mouse/Ek では ,XLÄ XL2 、日 L のノ、イレゾリューション / ノーマルの N88 日 ASIC 相当のグラフィック機能とマウス機能を提供するライプラリバッケージです。 両モードに対応しており、どちらのモードでも動作する互換モード ( 自動判別 ) もあります。 グラフィック機能はグラフィック画面に点、線、四方形、円、文字等を描画する機能、指定領 関数 ( 抜粋 ) 域を切り出す / 貼り戻す等の機能と表示モードの設定を行う制御機能で構成されています。 画面のモード設定 / 表示範囲の設定 / 画面色の設定 / バレットの設定 / グラフィック、テキス マウス関数にはマウスカーソルの表示 / 非表示、色指定、ホタンの押下状態の検査、移動範囲 ト画面消去 / ドットセット、リセット / 直線、円、円弧の描画 / べイント / タイルノヾターンに の指定、移動距離の検査等の関数があります。 よる塗りつぶし / 描画情報の取得、貼り戻し / スクロール / ドットのバレットコードの検査 / ■ N88 日 A C 相当のグラフィック関数を提供■高速グラフィック関数高速線分描画、高 八一ドコピー / 表示範囲の検査 / 日本語全角文字列描画 / 半角を含む日本語文字列描画 / H. 速連続線分描画、高速円描画、クラフィック画面への文字表示関数を備えています。 ( ノーマル 互換モード設定 / H. 簡易スタート処理 / N. ドットバターンの描画 / N. 円描画 / N. 線 / 四辺形 モードのみ ) これらの関数はすべて日 EPLACE / CLEA 日 / 0 日 / XO 日の 4 つの描画モ 描画 / N. 連続線描画 / マウスカーソルの表示、消去、座標を取得、設定 / 左、右ボタンの押下情報 ードのいすれかを選択指定することができます。 (fline, flines, fci 「 cle, g_cha 「 ) ーマ の取得 / カーソル移動範囲の設定 / カーソルの形状、色の設定 / 移動量の取得 / ミッキー、ドット 比の設定 ( N. はノーマルモード、 H. は八イレソリューションモードのそれぞれ専用関数です ) ウス関数 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 専用プロック受信 / プロック送信 / ハンドルのクローズ
植の歴史と未来 さて , 私が最初に GCC を X68000 へ移植し たのは ' 88 年の 9 月から 10 月ごろてした。バー ジョンは 1.21 。やけに時間がかかってます が , この期間て重要な GCC 移植ノウハウの ほとんどが確立されました。なお , このバ ージョンはどこにも , 誰にも公開されませ んてした。 次に移植したバージョンは 1.28 て ' 88 年の 11 月のことてす。実は 1.30 まて、のソースを もっていたのてすが , MC68000 用てはバグ があり , セルフコンパイルてきませんて、し た。そこて、安定動作した 1.28 を移植しまし なお , このノヾーションからノヾソコン不ッ トや , 手渡して公開するようになりました。 ただし移植した部分はプリプロセッサとコ ンパイラ本体だけてドライバは含まれませ んて、した。 その後 Ver. 1.31 は ' 89 年 1 月に , そして 1.34 は ' 89 年 5 月にそれぞれ移植しました。 の 1.31 には Mad Player 氏が gcc. x を作って くれました。それを利用された方も多いと 田います。 私が gcc. x も含めて GCC をほば完全に移植 てきたのは ' 89 年 10 月に移植した 1.36 からて、 す。そして ' 90 年 3 月に移植した 1.37.1 が現在 の最新バージョンとなっています。 GCC の移植には , 自分自身のまちがいに よるものや , ときには XC のライプラリの問 題に起因する , わけのわからない現象に悩 まされました。しかし , 移植自体は楽しい 作業てした。なにより GCC が X68000 て、使え るようになることが大きな喜びてした。そ れが移植の原動力になったのはまちがいな いと思います。 GCC 移植の最初の目的は , たんに自分が 使いたいという願望を満たすためてした。 当時はそれほど需要があるものだとは思っ ていませんてした。しかし , 今ては多くの 人が GCC を利用し , フリーソフトウェアを 作ったり , さまざまなソフトウェア , とく に GNU 関連のものを X68000 に移植していま す。私自身も , この恩恵て作業環境が整っ Section 2 はじめに 前田薫 最新 GNU 移植レポート も , そうあるよう期待しています。 ださった皆様に感謝しています。また今後 そのようなプログラムと労力を提供してく てきています。これは喜ばしいことてあり , G ユーティリティ ( X 68000 ) Human68k は MS-DOS ライクなファイル システムを有し , コンパイルをやり直すだ けていくっかの MS ー DOS 上のファイルユー ティリティが使用てきます。また ,Human68 k は X68000 のメモリアクセスを ( セグメント の導入などて、 ) 制限しませんから , UNIX な どからのユーティリティの移植も比較的容 易に行えます。本稿ては Human68k に GNU のユーティリティを移植する際に問題とな った点 , くふうした点などを紹介します。 これらの問題点は GNU ューティリティのみ ならず , ほかの UNIX ツールの移植時にも参 考になるはずて、す。 コンバイラ プログラムの移植てもっとも問題となる のがコンパイラてす。 GNU ユーティリティ にかぎれば , C コンパイラさえあればすべ てコンパイルてきます。しかし , Human68 k 上て動作する C コンパイラは非常に少な く , 筆者の知るところては C CompiIer PRO ー 68K ( 以下 XC と呼びます ) が唯一の市販 C コ ンパイラてす。ところがこの XC にはバグが 多く , GNU ューティリティのコンパイルて 使用てきないことが多々ありました。そこ てコンパイラとして GCC(Section 1 参照 ) を 使う結果になりましたが , GCC にはライプ ラリ関数がないためライプラリ関数は XC の ものを使用しました。 アイルシステム Human68k のファイルシステムは MS ー DOS を真似て作られており , 事実 PC98 の MS -DOS とフロッピーディスクが互換て、きま す。ところが UNIX ツールの移植を考えた場 合 , そもそも MS-DOS のファイルシステム は CP/M のそれがべースになっていますか ら , UNIX のファイルシステムとの違いが数 多くあります。これらの違いのひとつひと つは大きな問題とはならないような気がし ても , プログラムの移植となると変更すべ き箇所を探す作業は意外な負担になってき ます。以下 , 思いっくかぎりの不都合を考 えてみます。 ファイル名 Human68k< はファイル名はドライプ 名 , 18 文字のべース名および 3 文字の拡張子 から成っています。ファイル名に使用て、き る文字は非常に制限されています。英文字 の大文字と小文字が使えるのはよいのてす が , 大文字と小文字を区別してくれません。 また , べース名に 18 文字使えるといっても , 実際に有効 ( ファイル名として区別される ) となるのは 8 文字しかありません。これらに 最新 GNU 移植レポート 85
P A R T S ( 対応機種 ) PC-9801 シリーズ ( 実行例 ) ( フォーマット例 ) 0 ℃ PARTS 」は C 言語で様々なアプリケーションを開発するために必要 な関数を提供しま魂℃ PARTS 」の関数を組み合わせて使用するだけ で通常業務に必要な殆どの機能を満足することができます。 0 ℃ PARTS 」は AN 引規格対応の関数を用いて作成されているので、 MS-C 、 Lattice C 、 Turbo C 、 Quick C の各 C コンパイラーで使用 可能です。 0 ℃ PARTS 」はすべてソースコードで提供しておりまた、ライセンスフリー 0 0 ℃ PARTS 」にはそれぞれのパッケージに含まれた関数を用いた実用 的な参考プログラムが付属しています。 0 付属マニュアルには各関数についての仕様及びサンプルプログラムに ついての説明が記されています。 VOL. 1 帳票作成ソースライプラリー 一般的に、帳票を作成する場合印字位置、印字桁数、タイトル文字、罫線の 印字など、一表の帳票を作成する場合本体のプログラム、つまりテータの 集計などの処理よりも、前記の項目についての調整に多大な労力を費やす のか普通です。 そこで、本「 C PARTS VOL. 1 」では、印字位置、印字桁数、タイトル ( 固 定文字テータ ) 、罫線の有無については、あらかじめフォーマットファイルで 作成しておき、プログラム本体の作業は、単に順番にテータを出力すること のみとすることを可能としています。 また、フォーマットファイルは、一般的なエテイターで作成することが出来る ため、アプリケーションプログラム完成後でも、次の項目の変更か可能とな っています。 1 ) 印字位置 2 ) 印字桁数 3 ) 罫線の有無及び罫線の種類 ( 太線、細線 ) 4 ) 固定文字 更に本体プログラム中では次の項目の指定か可能となっています。 1 ) 日付文字列の出力 ( 5 種類 ) 2 ) 時間文字列の編集 ( 4 種類 ) 3 ) 数値テータの編集 ( カンマ付、¥付、円付、 $ 付 etc) 4 ) 位置設定 ( 左詰め、右詰め、センタリンク ) ( 縦倍角、横倍角、縦横倍角 ) 5 ) 文字の大きさ 6 ) 文字の強調 7 ) 網かけ 8 ) アンダーライン付 ー・印刷、一 発売中 本ライプラリーでは、パソコン用プリンターでバーコードを印刷するための関数を提 供します。 提供する関数の主な機能は次のとおりです。 >JAN 、げ F 、 NW7 、 CODE39 の各八一コートをサホート 使用可能プリンターは P 日 201 系のプリンター ( 印字処理を変更すれは他のフリンター ても使用可能。ただし、印字精度の高いプリンターを使用して下さい ) バーコード印刷後に対応するコートを縮小印字可能 サンプルプロクラム・・・・・ハーコート印刷プロクラム 対応フリンタ P 日 201 系 発売中¥ 14 C ARTS VOL.3 ( 画面制御カソースライプヲー ) 本ライプラリーでは画面表示、キーボード入力サポート関数を提供します。 本ライフラリーでは、市販工テイターを使用して作成したフォーマットファイルを使用 し、画面を表示し、入力を行います。従って、プログラム作成後でも、画面のレイアウ ト、表示桁数、入力桁数、タイトル等を自由に変更できます。 提供する関数の主な機能は次のとおりです。 文字表示属性の指定 ( シークレット、プリンク、リバース、アンダーライン、バーチィ カルライン、色指定 ) 文字列の入力編集 ( アルファベット、カナ、漢字、数値 ) ウインドーのサポート ( ウインドー数はメモリー容量に依存 ) サンプルプログラム・・簡易顧客管理プロクラム Z. 上ル一一 下のとおり第 & しました 下紀のとり齢しま C - P A R T 0 し . 2 一三新 ーー・ 00 ~ ・・ 00 ー当・いげ鋼・・して員に、 の物に々てようなの第興に アイセル設一角 ARTS OL. 4(lSAM ソースライプラリー 発売中判 9 本ライフラリーでは一 SAM 形式のテータベース構築用関数を提供します。 日 + t 「 ee 構造のテータベースなのでテータの高速検索か可能です。 提供する関数の主な機能は次のとおりです。 同時オープンファイル数は最大 10 ファイル 最大レコート長は 32K 日 1 ファイルに設定可能なキー数は 45 キー 次候補、前候補テータの呼ひ出し キータイプは文字及ひ数値 同時アクセス可能キーは川キー (int 、 long 、 double) キーテータの最大長は 128B 最大レコード数は約 10 億件 キー名称の最大長は 16B サンフルプログラム簡易テータヘース C ARTS VOL.5( ラフ表示ソースプヲー集月発売予定¥ 1 ま 本ライフラリーでは、アプリケーションプログラム中で持っている、様々なテータをグ ラフイヒするための関数を提供します。 主な機能は次のとおりです。 1 7 種類のクラフ表示 ( 棒、折線、円、バイなと ) フォーマットファイルを使用するので、表示位置、タイトルなどのバラメータの変更がプログ ラム作成後でも可能 テータ予測分析関数を装備 拡大、縮小、斜体、網かけなどの文字テータに対する修飾が可能 ・プログラム開発ツールシリーズ C DAT SOOPE 木発売予 9 通常、プロクラムを作成しても、テスト用テータの作成、作成後のテータの内容の確認な と、本体プログラムの作成以外の労力で結構手間取ることかあるものです。そこで、登場 したのか、「 C DATA SCOPE 」です。 「 C DATA SCOPE 」は、 C での st 「 uct の表記で、レコードのフォーマットを記述す ることにより、プログラムで使用するファイルのテータをアクセス可能にするもので、次の ような特徴かあります。 1) レコードの定義はプログラム起動後に定義する方法と、 include ファイルで指定 する方法がある 2 ) 使用可能テータファイルは固定長テータファイル 3 ) レコードの初期設定 ( 一括指定、部分テータの設定 ) 4 ) レコードテータの変更 ( st 「 uct で記述された型での入力が可能 ) 5 ) レコードテータの削除 6 ) レコードテータの追加 7 ) 画面上での指定テータの検索、表示 8 ) レコードテータのダンプ ( 打ち出しフォーマット、打ち出しテータの指定か可能 ) ~ セ ~ 株式会社 〒 171 東京都豊島区池袋 2 丁目 53 番 8 号秋島ビル 5F TEL. ( 988 ) 6973 ( 代表 ) ( 3 種類 )
List 3 は , ソースプログラムをご覧いただくとし て , 色情報と漢字の問題点だけを述べてお きます。次の文字列の場合を考えてみてく ださい shift-JIS コードて , 「末」は 0X9696 てすか ら , 6 桁を表すと , ヾ 969696969696 〃となる わけてす。このような同じ数字が並ぶ場合 , 差分て、注意が必要てす。きちんと日本語の 区切りを見つけないと , 思わぬ結果となり ます 0TabIe 2 の例て、わかるように , 日本語 て、は , 文字列の最初から順に調べて , 注目 する文字が , 2 バイトコードの , レヾイト目 か 2 バイト目かをつねに調査しながら差分の 作成を行わないと , まったく違った文字が ースてす。たとえば , ESC て、色を指定した しています。 TabIe 4 にアトリビュートを考 出力されます。もうひとつ例を紹介します。 スペースを出力しても , 反転などの特殊な 慮した例を示します。文字列コード「 2121 」 これは日本語と , 半角文字との混在て、起き 指定がないかぎり , 画面には表示されませ は全角のスペースて、すし , 「 20 」は半角スペ るケースて、す (Table 3 ) 。 shift-JIS は , とて ん。しかし , 当然アトリビュート上は色指 ース。アトリビュートて、は , 「 EI 」が白のノ も便利なコード体系なのて、すが , 日本語を 定されています。つまり , このまま差分を ーマル表示て、 , 「 81 」は緑の表示てす。この 探す場合には , 文字列の最初から順に調べ 出力すると , 違うアトリビュートて、すから , ように差分出力時に , 最適化を考えて作成 ていかねばなりません。上記のふたつの例 ムダな文字を出力することになってしまい したルーチンが List 3 て、す。あまりきれいな 以外にも , 日本語て、処理をする以上 , どう ます。そこて , CSET< は , 画面をワークに ルーチンてはありませんが , これてふたっ しても前後の文字を判断する必要が出てき 取り込んだ時点て、 , ムダな ESC ( 色っきスペ のデータの差分をとっています。つまり , ます。 ースやシークレット表示 ) などを , いったん ほかのマシンに移植する場合は , この形式 さて , もうひとつ問題点があります。い デフォルトアトリビュートに変換していま に VRAM データを落とせればいいわけて、 ままて、は色情報を考えなかったのて、すが , す。さらに , 全角スペースと半角スペース す。 色を考慮すると新たな課題が生まれてきま も , 差分時にムダな ESC を出力しないよう , ESC ファイルの出力 す。画面に表示されない色指定されたスペ 全角スペースは半角スペースふたつに変換 TabIe 2 日本語文字列の差分例 1 TabIe 3 文字列の差分例 2 文字列 16 進でのコード ”外輝” ” 8A4F208B5020 ” ” Oh ! PC ” ” 204F6821 5043 ” ” 200068210043 ” ” 204F68215043 ” ー 8 0 , 1 っ 0 っ 4 ^ 0 8 0 、 1 ワ 0 っ 0 -4- LO ^. 0 / * 0 L D が半角文字の場合は , N / * E W と調べて同じなら NU しし e I se PO = 01d : *sab=NULL,• *sat=NU しし : / * ちがうなら , N E W をセット e I se *sab=*new; *sat=*nat; 0 ー d 十十 : new 十十 ;sab 十十 : oat 十十 ;nat 十十 ;sat 十十 : / * 文字列ポインタを進める 文字列 16 進でのコード ” 969696969696 ” ” 209696969620 ” ” 200000000020 ” ” 209696969620 ” もとの文字列 新しい文字列 あやまった差分の結果 正しい差分の結果 TabIe 4 文字列の差分例 3 もとの文字列 新しい文字列 あやまった差分の結果 正しい差分の結果 アトリピュートのコード ” E 1 E 1 E 1 E 1 E 1 E 1 ” ” E 1 E 181818181 ” ” E 1 E 1 81818181 ” ” 000081000000 ” 文字列のコード ” 212141202020 ” ” 202041202020 ” ” 202041202020 ” ” 000041000000 ” 文字列 もとの文字列 新しい文字列 あやまった差分の結果 正しい差分の結果 140 CMAGAZINE 1990 8
すべての歯車が噛み合って C フロクラミンクパワー全開 入出力からグラフィックまで BusinessTooIKit (QuickT00L-98/C + QuickFILE/db + サンフルアプリケーション ) 高レベルから低レベル関数まで PC ー 9801 のすべてを制御するマルチライプラリ OUick 90 し % / C PC ー 9 1 シリーズのユーザーインターフェスを一手 に引き受ける入出力に加え、グラフィック・テキスト・キ ーポード・プリンター・ RS ー 232C ・マウスとすべての I / 0 ハンドラを完全装備したマルチバーバスライプラリ ・入出力ハンドラ 固定長文字列・右詰めカンマ区切り数値・邦暦日付等 / U N D 0 、変更・終了キー等ステータスも得られます。 ションキーによる抜け出し等サポート。さらに簡易 入力時にはダイアモンドキー・カーソルキー・ファンク 表示属性・長さ等のフォーマットを指定して入出力を の基本データの入出力をすべてサポート。位置・状態別 ■グラフィック・ハンドラ 機種依存の無い自由度の高いデータベースライプラリ OUick FILE/db 第ゞ BusinesTooIKit からデータベース管理関数群を独 立させた QuickFILE/db0 虚弱体質のデータベース アプリケーションに強力な 1 本です。突然の上司の無 第 ラでとうとうメモりが足りなくなった、アプリケーシ した大量のデータを c で加工したい、 dB 系コンバイ 理難題、締切間際のやつつけ仕事、 dBASE Ⅲで蓄積 標準的なデータフォーマット 大量のデータ処理が可能高いフレキシビリティ ・特徴 ます。 は使いたくない、などという方にすぐれた効果があり ョンをマシンの台数分買う予算がない、 C 以外の言語 P C ー 9N1 の G L 1 0 を利用したグラフィックハン ドラを供給。モード・カラーーライン・サークル・ペイン ト・文字表示・スクロール等フル装備。さらにテキスト 画面属性を考慮したハードコピー関数を実装。 ■テキスト・ハンドラ テキスト画面の一部・全部をファイルに、または最大 33 枚を GVRAM に退避 + 復帰。行スクロール・領域の 移動・表示属性の変更等、説得力のある画面作りに。 ーキーポード・ハンドラ キーの 1 文字入力 / センス・シフトキー状態のセン スの他、キーポード入力の禁止等をサポート。 ・プリンタ・ハンドラ った縮小印字もサポート。 A T 0 K 5 / 6 の G A I J フ 2 : 1 での印字をサポート。本体の 16 ドットフすントを使 た半角文字を全角文字の 1 / 2 サイズにして全角半角比 イプ I /F を装備。全角間に間延びの無い印字が可能。ま プリンタをマニュアル通りに使う為、ダイレクトドラ PC ー PR201 と ESC / P の命令系プリンタに対応。 ー RS ー 232 C ハンドラ ァイルの登録等多彩 ・その他 150 余種の関数群があなたをフルサポート ステム日付や曜日、閏年や実在日付のチェック等 入出力・文字列変換の他、日付の演算も可能。他にシ 西暦・邦暦の日付を標準的な long で処理する機能。 ・日付操作 各種ハンドル関数の他、 4 種類のマウスカーソルを装備。 Ⅸ ) S 標準添付の MOUS E ・ SYS をコントロール。 ・マウス・ハンドラ インコントロール等をサポート。 RS ー 232C の入出力・バッファステータス取得・ラ QuickTOOL-98/C と QuickFILE/db のベストカップ リングすべての C ューザーに実戦的な開発環境をこの 1 つで供給いたします。とうたっ ただけに供給される関数群もデータベースに必須なフ ァイルアクセス関数からグラフィックなどのユーザー インターフェースまですべてを網羅しました。 ーサポートファイル データファイル インデックスファイル メモファイル それぞれのファイルは、 相互に読み書き可能。 ■サポート関数 (. D B F ) (. NDX) (. D B T ) d B A S E Ⅲのファイルと Graphics ConsoIe I/O Printer Text BTK 0 dbf File ndx File dbt File Ja panese Calendar データファイル・アクセス関数 インデックスファイル・アクセス関数 メモファイル・アクセス関数 I S AM 関数フィールド変換関数 ・フィールドタイプ 文字型 数値型 日付型 論理型 メモ型 ( 1 ~ 2 バイト ) ( 1 ~ 19 バイト ) ( 8 バイト ) ( 1 バイト ) ( 10 バイト ) Scræn tn RS ・ 232C Terminal Mouse ■共通仕様 ・ライプラリで供給します。ソースは別売です。 ・ PC ー 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 ■データファイルの仕様 ファイルサイズ オープンファイル数 フィールドサイズ フィールド数 レゴードサイズ レコード数 最大 10 億レコード 最大 4 ( ) バイト 最大 128 フィールド 最大 2 バイト M S ー D 0 S の制限 M S ー D 0 S の制限 ・価格 ( ① ~ ④各コンパイラとも ) QuickFILE/db QuickTOOL-98/C BusinessToolkit 定価 36 , 000 円 定価 12 , 800 円 定価 28 , 000 円 OUick TOOL -98 dBASE Q uickTO() し 98 は dBASE Ⅲ / Ⅲ PLUS-QuickSilver から PC -9801 の様々な機能を利用し、より高機能な VAR 製品を開発する目的で作られた関数・モジュール 集です。高機能な命令はあなたのデータベースアプリケー ションの可能性を飛躍的に高めてくれることでしよう。 dBASEIII/IIIPLUS ではモジュールを CALL 命令に より利用します。また QurckSilver では CALL 命令の 他に CCALL 命令でさらに強力多種な関数群を利用い ただけます 6 ◆グラフィック 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 円 用モジュール QuickSiIver 用ライプラリ ◆ RS -232C RS-232C の入出力・バッファステータス 取得・ラインコントロール等をサポート。 ◆邦暦日付 CCALL で邦暦の日付の人出力・文字列変 換等をサポート。邦暦テープルはテレベルで修正可能 ◆その他強力な入力処理、出力処理、テキスト画面制 御、 FEP 処理など CALL で、 CCALL では余り に及ぶ強力な機能を用意しています。 ・ PC ー 9 1 / 2 / 3 シリース対応 ( ハイレゾ LT を除く ) ・ソース・実用サンプルプログラム「電話帳」付き ・製品への組み込みロイヤリティ無料 上記商品は全国のソフトショップ、パソコンショップでお求めいただけます。秋葉原常備店・ヒロセムセンパーッセンター 3 号店、ソフトハウス COM SOft house Crescendo ・ CO ・ クレッセンドカンパニ 千葉市中央 1 1 0 : 00 ~ 1 7 : 00 土・日・祝祭日を除く TE し 0472 ( 22 ) 9801 FAX 0472 ( 25 ) 8180 シャンホール第 2 千葉中央 4 0 8 詳しい資料を用意しております 資料こ希望の方は ' 舌または FAX て弊社まて てこ連絡ください : ーおり返し送付いたします 販売店の方のお問い合せは、 0470 ( 82 ) 2647 ( 注 ) 記載されている商品名等は、各社の商標または登録商標です。記載されている価格には消費税は含まれておりません。
ことて、サポートされます。 WWWC がどのよ うなワイルドカードか見てみましよう。 任意の 1 文字 WWWC キャラクタ ( メタ キャラクタ ) の、、 * ? [ ] { } ・ 外の 1 文字は , その文字そのものを 1 2 : 2 5 12 : 27 表す す す A から Z まて、の英字 1 文字 [ ] 内の任意の 1 文字を表 、、 ? ″任意の 1 文字を表す 任意の 0 文字以上の文字列を表 の対象になるのは , その時点てリ 字列を除外することを表す。除外 トの中から WWWC にマッチする文 それまて、にマッチした文字列リス 、、 ! 〃が先頭にくる WWWC は , るものが続ーくことを表す ッチしたものの直後に B にマッチす いう表現をつないだものは , A にマ WWWC の連接 A という表現と B とい 続く 1 文字そのものを表す を表す れた文字列のうちの任意のひとつ { } 内の当〃て、区切ら の 1 文字を表す [ ] 内の文字以外の任意 ( 大文字 ) スティングされている文字列だけ WWWC の変数と関数を簡単に紹介して 〃がついているのは変数て、す。 みます。 attr マッチするファイルの属性を保 持する recursive 再帰的なファイル収集を 決定する period 拡張子の区切り記号、、 . 〃の扱 いを決定する pname ファイル名からフルノヾス名へ の展開を決定する fname ファイル名からディレクトリ 名を除くかどうかを決定する sort ファイル名のソートを決定する setlist リストの初期化 freelist リストの開放 wwwc 指定した WWWC にマッチする ファイル名のリストを作成 expands WWWC を内部構造に展開 freeexp 構造体変数を開放 fmatch 指定した文字列が WWWC に 一致するかどうかを調べる ( 完全一 致 ) match 指定した文字列がⅥⅥ TWC に 一致するかどうかを調べる ( 部分一 致 ) こて、リストという言葉が出てきますが , WWWC はマッチしたファイル名をリンクリ ストを利用して記憶します。したがって , ューザプログラムはリンクリストからファ イル名を取り出す必要があるわけて、す。 のリンクリストは node という構造体 (WWWC.H に定義 ) て、 , 次のようなリスト 操作関数が用意されています。 addnode リストに新たなノードを加 delnode リストから任意のノードを 削除する 私がまだ使いこなしていないため , 説明 になっていないところがありますが ( 「ぜん ぜんだ / 」という声も聞こえる ) , 便利な関 数て、あることを感じとっていただけたかと 田います。またワイルドカードのテクニッ クを見られることは , うれしいところて、す。 配布ファイルは ISH 形式て、 , 開くと LHarc て、圧縮されたファイルが出てきます。この 中にはいくつかの C ソースファイル , ヘッダ ファイルとドキュメントファイルが入って います (Fig. 1 ) 。ドキュメントにはサンプ ルとして , WWWC を用いた拡張 DIR コマン ドのプログラムが挙げられています。 使用する際にはこのソースをコンパイル してライプラリを生成しなければなりませ ん。コンパイラは QuickC Ver. 2.0 と Turb0 C Ver. 2.0 が使えます。ただし , Turb0 C の場合は文字列、、 Turbo C" を 2.0 と定義す る必要があります。具体的には TCC のオプ ションて、一 DTurboC = 2 . 0 とするか , ソース 中に #DEFINE Tu 「 boC = 2 ℃を加えます。 Fig. 2 は Turbo C のスモールモデルてコン パイル & リンクした例てす。 て、ある WWWCO 1 1 WW\A ℃ 01 1 EXPANDS LIST MATCH WOR KS WOR KS WWW C WWWC WWWC ISH LZH C C C C H C DOC H 12269 9906 3802 1001 1828 2815 747 2137 13968 778 90 ー 05 ー 31 22 : 43 90 ー 05 ー 15 16 : 22 90 ー 05 ー 04 20 : 33 90 ー 05 ー 03 1 5 : 03 90 ー 05 ー 04 18 : 59 90 ー 05 ー 02 1 3 : 42 90 ー 05 ー 15 16 : 07 90 ー 05 ー 04 20 : 34 90 ー 05 ー 1 1 90 ー 05 ー 1 1 Fig. 2 WWW C WOR KS MATCH 凵 ST EXPANDS WWWC S WWWC S WWWC S OBJ OBJ OBJ OBJ OBJ MAP LST L 旧 3014 1 603 953 751 1767 32 683 8704 90-06 ー 06 90-06 ー 06 90-06 ー 06 90-06 ー 06 90 ー 06 ー 06 90-06-06 90 ー 06-06 90 ー 06 ー 06 22 : 12 0 : 29 0 : 29 0 : 29 0 : 29 0 : 31 22 : 1 4 22 : 14 フリーソフトウェア最新レポート 33
第 9 回 C に役立つユーティリテイソフト 野口雄平 A > T [pathname] [options] 6 月号で紹介したパチスロシュミレータに B : 最後のページにジャンプ 新しく「アニマル」が出ました。私はこの機 パスはファイル名 , ディレクトリ名 , ド ・指定したページにジャンプ J 種にもさんざん痛い目にあっていますので , ライプ名や相対パスて、指定て、きます。オプ M : 現在のページを記憶 雪辱をはらすべく , 日夜訓練しております。 G : マークしたページにジャンプ ションには , S : 前方検索 -H : ヘルプ画面 高速・高機能テキスト表示ソフト R : 後方検索 : 画面表示行数 20 行 : テキストファイル以外もファイル P : テキストの切り取り 作者 : RICE さん 選択画面に表示 このうち文字列検索には特長があって , (PC-VAN : QXJ79105 ) -Tn.' タブを n ( 2 , 4 , 8 ) 桁にする 検索文字列の大文字 , 小文字 , 全角 , 半角 は同一視されます。また , を押してテキ などが指定て、きます。パスやオプションを ネット : PC-VAN, アスキーネット PCS ファイル名 : T89C. LZH, 指定しないと , カレントディレクトリの ストの切り取りモードに入り , カーソルキ ⅱ冗 めそうなファイル (EXE や COM などの拡張 ーとリターンキーて、範囲を決め , 任意のフ T89DOC . LZH 子 20 数種類 ( 読めなさそうなファイル ) を除 ァイル名 ( デフォルトは PICKUP. TXT ) て、 テキストファイルを高速表示するユーテ セープて、きます。切り取りモード中てを くテキストファイル ) を表示します。表示さ ィリティて、す。表示ファイルはカーソルて、 れたファイルをカーソルて、選択し , 反転さ 押せば , テキストを修正してから切り取る 選択。文字列検索やテキストの切り取り , こともて、きます。切り取る , 修正するとい せ , リターンキーを押すとそのファイルの プリンタへの出力などもて、きます。 先頭から表示します ( テキスト表示モード ) 。 っても , 元テキストには手を加えないのて、 , T. EXE は C のソースファイルて、配布さ カーソルは囮団曰曰ゃ + 「安全」な編集が可能て、す。 れ , ソース中にはコーメントが詳しく書かれ 配布ファイルは , 、、 T89C. LZH 〃と、、 T89 ています。その機能は優れており , 非常に のダイヤモンドカーソルて、移動させます。 DOC. LZH" のふたつ。 T89C. LZH を解凍 使いやすいものて、す。使えるコンパイラは すると T. EXE の C ソースファイルが生成き テキストは画面単位て、スクロールし , Turbo C, MS-C, QuickC の 3 種類。これも ー , 国 , 3 て次画面 , れます。 T , EXE を作るにはこのソースファ ソース中に各コンノヾイラて、の注意点がコメ ー , の回 , 回て前画面を イルを Turbo C Ver. 2 . 0 ( Ver. 1 . 5 SPL ントされています。 VRAM の操作や , パタ 表示します。 版も可 ) , MS-C Ver. 5.1 , QuickC Ver. ーンマッチングの方法 ( 高速文字列パターン テキスト表示モードからファイル選択画 2.0 のいすれかて、コンパイルする必要があり マッチング法 : Robert S. Boyer, Strother 面に戻るには回 , 終了は国を押します。以 ます。私は Turbo C Ver. 2.0 て、コンパイル Moore によるアルゴリズム ) などは , C に関 上が基本的な使用法て、す。 心のある方にはとくに興味深いものて、す。 してみましたが , このときの容量は 54 , 568 もう少し高度な , ファイル選択画面上て、 バイトになりました。メイクファイルは含 また , 現在の Ver. 8.9 にいたる細かい過程 の使用法としては , ファイル名のほかに まれていないのて、 , T. C の中のコンパイル が記述されており , プログラム開発の苦労 A : * . * , B : * . * などのドライプ や注意点が読み取れます。 T. EXE は , さま 例文を見てバッチファイルを作成します。 や , .. \ , . \ などの相対パスを選択 , 移動が ざまな意味て、お手本となるプログラムなの T89DOC. LZH にはドキュメントファイルが あります。そのほかファイル選択画面て、は 格納されています。 ファイルの削除 ( 皿キー ) , リネーム ( 囮 それて、はプログラムの解説に入りましょ 拡張ワイルドカード関数ライプラ キー ) , コヒ。ー ( 回。 1 国 ) などの MS-DOS う。 MS-DOS のファイルを読む方法には , WWW C コマンド ( それぞれ DEL, REN, (D) が使え 1. TYPE コマンド 2. 工デイタ ます。なお , 凶によるコヒ。ーは MS-DOS の 作者 . North さん (ASCII-NET 3. ワープロソフト PCS : PCS29507 ) XCOPY コマンドを使用しているため , MS の 3 つがあり , この T. EXE は作者の分類に -DOS Ver. 3.30 以上が必要てす。テキスト よると 1 と 2 の隙間を埋めるものだそうて、す。 ネット : アスキーネット PCS 表示モードて、は次のようなコマンドが使え ファイル名 : WWWCO 1 1 . ISH 1 て、は機能が貧弱すぎ , 読むだけの機能とし ます。 ては 2 は多機能すぎるということて、す。 T. EXE WWWC とはファイル探索の拡張ワイルド T : 最初のページにジャンプ の起動は次のとおりて、す。 カードのことて、 , WWWC ライプラリを使う 32 CMAGAZINE 1990 8
五ロ ニ一 - ロ はじめて学ぶ C プログラミンク モリを動的に確保することを中心に説明し ニ分木を出力しなさい」 ました。共用体については簡単な説明しか ◆クイズの解答を募集します。解答プログ てきませんて、した。しかし , 共用体は初心 共用体の初期化のサンプルプログラム ラムをディスクてお送りください。また , 者には , あまり使い道がないと思われます。 共用体の初期化のサンプルプログラムと プリンタをお持ちの方はプリンタ出力した また機会があれば , 詳しく説明したいと思 して List 10 を見てください。このプログラ リストも同封してください。なお , 郵送く います。 次回は , ポインタと構造体について , 説 ムは , 初期化した変数 a , b をすべてのメン ださったディスクは返却いたしませんのて、 , 明が不足していた部分を取り上げる予定て バについて表示するだけてす。このプログ ご容赦ください。ご応募いただいたなかか す。構造体の配列を関数に渡すなど , 少し ラムを実行すると , 最初のメンバに対して ら抽選て、粗品を進呈します。 突っ込んだ点も説明する予定てすのて , 楽 のみ初期化が行われているのがわかるて、し しみにしてください 宛先 〒 108 東京都港区高輪 2 ー 19 ー 13 今月のクイズ NS 高輪ビル ソフトバンク株 C マガジン編集部 「数字 ( dou e 型 ) を入力するごとに , 昇順 「 C 言語入門講座」係 になるようにニ分木を生成していきなさい。 今回は , 構造体を用いたリスト構造て、メ そして , 入力が終了後 ( EOF 入力後 ) , その す。 List 1 1 しているので , std ⅱ b. h をインクルードする 必要があります。 もうひとつ , さらに重要なことがありま す。 123 行目の関数 st 「 ins は , cha 「型のポイ ンタを返しています。このポインタは , 答 えを格納した文字配列の先頭ポインタです。 こで , 少し考えてみましよう。その答 えを格納している配列変数 buff は , 関数 st 「 ins 内で宣言された感自動″変数です ( 125 行目 ) 。したがって , この関数 st ⅱ ns の呼び 出しカわると , 自動変数 buff は消滅してし まいます。もし , 関数 s ⅲ ns が呼び出された 後にほかの関数が呼ばれたりすると , その 別の関数の自動変数が , 変数 buff を格納して あったはすのアドレスに割り当てられるか もしれないのです。いすれにしても , 変数 buff に格納されていたデータは , いつ消滅し てもおかしくないのです。これを避けるに は , 文字配列を static で静的に宣言すればよ いのです。これにより , コンバイル時に固 定アドレスが割り当てられるので , このよ うな心配は無用になります。 次に , 関数 st 「 ins をひとつの関数で数回使 用する場合を考えてみましよう。関数 strins の中の変数 buff を static で宣言しているとし ます。すると , 関数 st ⅱ ns を何回呼び出して も , 変数 buff は固定アドレスに割り当てられ ています。したがって , ポインタ変数を何 個か宣言して , そのポインタ変数に複数の はじめて学ぶ C プログラミング 119 49 : 50 : 52 : 53 : 54 : 55 : 56 : 58 : 59 : 60 : } strins 関数の実行結果を出力する * * * / 62 : 63 : VOid str out(char *exp-str, int n, int c) 64 : { 65 : int i 66 : pr i ntf ( ”埋め込み結果 = > " ) : 67 : while (*exp_str) 68 : 69 : printf ( " \ 033 [ 7 ; 33m " ) : while (c--) { *exp_str 十十 ) : printf ("Xc" 73 : printf ( " \ 033 [ 田 " ) : e 1 se *exp-str 十十 ) : printf ("Xc" 82 : / * * 自作の atoi 関数 ( 文字数値の数値化 ) * / 83 : i nt my-atoi (char *str-num) 85 : int val while (str-num[i + + ]) if (i 〉 4 ) return ( の ; 89 : if (str-num[i return ( 0 ) : 92 : 94 : printf ( " 使い方 : \ n " ) : printf ("quiz5 く文字列 1 > く文字列 2 〉く位置〉 \ n " ) : printf ( " printf ( " {ExampIe}Yn") : printf ("quiz5 く 0123456789 > く abcdefg> く 3 > \ n " ) : strins(str-a, str / * 埋め込み関数の実行 * / exp_str / * 埋め込んだ文字列の長さを数える * / while (*str b 十 + ) / * 文字数のカウント * / C 十十 : str out(exp str, n, c) : / * 埋め込み結果の表示 * / / * 埋め込んだ文字列の属性を変える * / / * 表示文字列を黄色に設定 * / / * 埋め込み文字列表示 * / / * 表示属性を元に戻す * / i 十十 : / * int 型の数値範囲まで * / Ⅱ Str num[i ー 1 ] く ' 0 ・ / * 数値文字以外が含まれていたら * / / * 位取り * / / * 次の位取り * /
て、描画する。 [ 使用例 ] List 7 と Fig. 3 を参昭 dispkei2 関数 ( 付録ティスク dispkei2. c 参照 ) 特定文字の画面表示 [ 書式 ] #include #include dispkei2(x, int x, y ; Char mark ; char attr ; ura) test6. c 1 : #define EXTERN 3 : #include 5 : void main() i nt i : く stdio. h> pr i ntv ( " T H I S LiSt 8 9 : 8 : 7 : 4 : 2 : exit( の : Fig. 4 test6. exe 実行画面 I S A A TES T " , 2 * 0X20 + 5 , 10 , 10 , の ; y, く stdio . h 〉 ” textkei . h ” mark, attr, kind, int kind, ura [ 引数 ] x, y は , 特定文字を表示する X 座標 , Y 座 る場合には 0 を , 裏画面に表示する場合には 面の指定に用いるものて , 表画面に表示す た部分は , 重複して表示される。 ura は , 画 10 未満の数字を指定すると , 罫線が交差し ている罫線用記号に上書きして表示され , 以上の数字を指定すると , すてに表示され kind は , 表示方法を指定するものて , 10 を指定すればよい させるには , attr に 2 * 0X20 十 4 十 1 という値 ば , 表示色を赤色にし , かっリバース表示 8 ビットの各ビットに対応している。たとえ のことて , これらの属性が Table 1 のように プリンク , リバース , アンダーラインなど 属性を指定する。表示属性とは , 表示色 , など ) のコードを指定する。 attr には , 表示 標てある。 ma 「 k には , 罫線用の記号 ( ー鬥「 画面の特定位置 ( x , y) に , 罫線用の記号 [ 機能 ] 正常終了の場合は 0 を返す。 [ 戻り値 ] 1 をそれぞれ指定する。 19 8 属性を変更することもてき , さらに ura のス ma 「 k を表示する。また att 「にしたがって表示 98 CMAGAZINE C 〉 TEST6 CI T H I S CU CA SI I S T E S T SU VOID int NWL INS ura REP イッチにより , テキスト VRAM の第 2 画面 ( い わゆる裏画面 ) に書き込むことがて、きる。 printv 関数 ( 付録ティスク p 「 in ⅳ . c 参照 ) テキスト VRAM への直接書き込み [ 引数 ] st 「ロには , 表示する文字列を指定する。 [ 書式 ] #include #include #include #include #include printv(str, unsigned char att 「 att 「 , Char く stdio . h 〉 く st 「 ing . h 〉 く dos . h 〉 く jctype. h 〉 く jstring. h> x, y, ura) str ロ : attr には , 表示属性を指定する。指定の仕方 は , dispkei2 関数の場合と同様て、ある。 x, y には , それぞれ表示する画面の X 座標およ び Y 座標を指定する。 ura は , 画面の指定に 用いるものて , 表画面に表示する場合には 0 を , 裏画面に表示する場合には 1 をそれぞ れ指定する。 [ 戻り値 ] 正常終了の場合 , 表示文字列の長さを返 す。
List 1 1 関数 strins の戻り値を保持してみても無意味 ですね。このようなときは , 関数 strins を呼 び出す関数側で文字配列のローカルなコピ ーを取る必要があります。 このような煩わしさがあるので , 文字列 操作をする関数は , 答えを格納するための 配列のポインタを引数で受け取り , そのポ インタを用いて呼び出し側の配列に答を入 れていくというの力般的です。 大山隆弘さんの解答 この解答は非常にシンプルですっきりし ています (List 12 ) 。大きめの配列を呼び出 し側の関数で用意しにの場合は main 関 数 ) , 配列の先頭ポインタを渡して , それを 処理する関数 inse 「 t を作っています。このプ ログラムもエラー処理をしています。値が 整数であるかどうか , 挿入する位置を入力 するときにチェックしています。このとき stdin を rewind しています。関数 rewind は , ファイルポインタの位置を最初の位置まで 戻す関数です。 stdin もファイルポインタで すので , このように stdin を rewind すること によって入力を繰り返し行えるのです ( フ ァイル操作については , 10 月号で詳しく解 説する予定 ) 。 挿入位置の指定の数が挿入される文字列 の文字数より大きかった場合は , 挿入され る文字列の後ろにアベンドされるようにな っています。挿入位置が 0 以下の場合は , い ちばん前に挿入されるようになっています。 この解答では , main 関数で宣言した配列 s3 ( 答えを格納するため ) の先頭ポインタを関 数 inse 「 t に渡しています。関数 insert で , そ のポインタを用いて main 関数の配列 s3 に答 えを格納しています。 金子幸史さんの解答 この解答プログラムは , 今月号で説明し た関数 ma Ⅱ oc を用いて , 動的に答えの格納 領域を確保しています ( List 13 ) 。具体的に は , 答えの格納に必要な大きさを計算し , 必要な領域を関数 ma Ⅱ oc を使って確保し , 答えをその領域に格納しています。この解 答のように関数 ma 恥 c 頁域を確保して答 えを格納し , その先頭ポインタを返すとい 99 : 100 : 101 : 102 : 103 : 104 : } 105 : 106 : 107 : / * STR Ⅲ S 関数仕様 108 : / * NAME 109 : / * strins ヌルで終わる文字列を別の文字列の指定位置に埋め込む 1 10 : / * SYNOPSIS char *strins(str_a. str_b, n) : 112 : / * char *str-a; 埋め込まれる文字列のホ・インタ 113 : / * char *str-b; 埋め込む文字列のホ・インタ 114 : / * n; 埋め込む位置 int 115 : / * DESCRIPTION 116 : / * str i n s 関数は 1 番目の引数の文字列に 2 番目の引数の文字列を 3 番目の 117 : / * 引数で指定した位置で埋め込む。 118 : / * RETURN VA し UE 119 : / * 埋め込まれた文字列の最初のホ・インタを返す 120 : / * 3 番目の引数がセ・ロより小さい場合は NU しし文字を返す 121 : / * が 1 番目の文字列の長さより大きい場合は NU しし文字を返す 122 : char *strins(char *str-a, char *str_b, int n) 123 : 124 : { char buff[256] : 125 : 126 : int 127 : 128 : 129 : 130 : 131 : 132 : 133 : 134 : 135 : 136 : 137 : 138 : 139 : 140 : 141 : 142 : 143 : 144 : 145 : 146 : 147 : } 14 n , / * 数値化 * / / * 位取り return (val) : / * とりあえず 256 文字以内まで保証 * / / * 埋め込み位置がセ・ロ以下なら * / / * NU しし文字だけを返す * / / * 文字列 1 の・ \ 0 ・に出会うまでトフ・ * / / * 挿入位置に達したか ? * / / * 文字列 2 の・ \ 0 ・に出会うまでトフ・ * / b + + : / * 文字列 1 に文字列 2 を埋め込む * / / * 文字列 1 を作業領域に北・一する * / / * 文字列 1 より挿入位置が大きい ? * / / * 失敗したので NUL し文字だけを返す * / / * 成功したときは文字列の最尾に * / / * NU しし文字を付け加える * / if (n ← 0 ) { return (buff) : while (*str a) while (*str_b) buff[i + + ] buff[i + + ] *str_a 十十 : if (i く n) e ー se return (buff) : 大山隆弘さんの解答 List 12 C magazin 5 月号クイス・ 文字列中に文字列を挿入する関数 T. 0yama 1990. 4.21 lnsert. C 6 : #include く stdio. h> 7 : #define BUP 256 8 : VOid insert(char * , char *,char * , int) : 9 : 10 : main(void) char s1[BUF], s2[BUF], s3[BUF*2] : 12 : int point; 14 : 17 : 20 : 22 : 23 : 24 : for ( : : printf ( " \ n \ n \ n 文字を入力してください ( ctr ! + 2 で終わり ) \ n if(scanf("Xs". sl) = EO F) ex i t ( I) : ( " Yn 挿入する文字を入力してください yn printf scanf("Xs ” , (2) : ( " Yn 挿入する位置を入力してください Yn printf whi le (scanf("Xd", &point) ! = pr i nt f ( " 整数を入力してくださいね ! Yn rewind(stdin) : CMAGAZINE 19 8 120