ファイル入出力のためのハンドラが定義 済みて、あり , メニューに CM FILENEW, CM FILEOPEN, CM FILESAVE, CM FILESAVEAS の項目を定義しておくと , 各 種操作が可能となります。 以上の具体的なコンストラクタについて は付録ディスクに TABLE B. TXT として収 録しましたのて、参照ください。また , TabI e 5 に示したヘッダファイルをソースファイ ルに読み込みます。メニューやアクセラレ ータの定義されたリソースファイルもある のて、 , 適宜読み込んて、おきます。 なお , Windows 3.1 て、は , Windows シス テムが , ファイル名入力 , 文字列探索・置 換ダイアログボックスを提供しており , TF ileDialog ( ) , TSearchDialog ( ) を使う必要 がなくなりました。 ーユーノヾー TurboVision て、はなく , アプリケーション作成の方法論 on もプラットホームをカプセル化する目的 もっとも , ObjectWindows も TurboVisi そのようにはなっていません。 して , 同じソースが使えるとよいのて、すが , トホームの違いをクラスライプラリが吸収 理想をいえば , Windows と DOS のプラッ 同等のインタフェイスて、す。 の IDE や TurboDebugger などの統合環境と ンタフェイスを提供します。 Borland C 十十 TurboVision は DOS 環境て、強力なユーザイ ーションフレームワークてあったのに対し , ObjectWindows が Windows 上のアプリケ を提示する目的て、構築されていますのて、 , 多かれ少なかれプラットホーム固有の機能 を使わざるを得ません。もし , Windows 並 の機能を完全に抽象化するとすれば , 非常 に規模の大きいクラスライプラリになって しまい , DOS アプリケーションには向かな いて、しよう。 TurboVision の階層は Fig. 8 のようになっ ています。これは OjbectWindows と似て非 なるものて、す。 ObjectWindows て、は , Windows がウイン ドウやコントロールなどの部品のまとまり を管理しますが , TurboVision て、はそれらの 管理もクラスライプラリて、請け負わなけれ ばならず , 全体的にかなり細かい機育ヒ部ロ ヒロロロ の集まりとなっています。 Fig. 8 Tu 「 boVision のクラス階層 Fig ・ 9 TurboVision の画面構造 テスクトップ メニューバー ステータスライン ウインドウ ウインドウ 48 TView TGroup TDeskTop TProgram TApplication TWindow TDiaIog TChDirDiaIog TFileDialog THistoryWindow TEditWindow TFrame TButton TClustoe 「 TCheckBoxes TRadioButtons TMenuView TMenuBar TMenuBox TStatusLine THistory TInputLine L—TFilelnputLine TListViewer L—TListBox TSortedListBox L—TFileList TDirListBox TSc 「 0 阨「 L—TText D ev ice L—TTe rm i nal TScrolIBar l—THistoryViewer TFilelnfoPane TStati cText TLa bel TParamText TBackGround Tlndicato 「 TEditor TMemo TFileEditor C MAGAZINE 1 2 9 矩形表示領域 ひとつ以上の子ビューを持つピュー テスクトップのビュー プロクラムの仮想クラス アプリケーションのピュー ウインドウ ダイアログホックス ティレクトリ変更ダイアログ ファイル名入力ダイアロク 入力履歴ウインドウ 工テイタウインドウ ウインドウの枠 ブッシュボタン ホタンの集まり チェックホックス ラジオホタン メニュー メニューバー ボップアップメニュー ステータスライン 履歴ホタン 1 行工テイタ ファイル名入力工テイタ リストのヒュー リストボックス ソートつきリストホックス ファイルリスト ティレクトリー覧 スクロール処理 テキストヒュー 端末工ミュレータ スクロールバー 履歴リストヒュー ファイル情報表示 文字列表示 ラベル表示 バラメータつきテキスト バックグラウンド 行 , 桁表示 工デイタ 埋め込み用工テイタ ファイルと結合したエテイタ Fig . 10 ピューの階層 メー アプリケーション テスクトップステータスライン ウインドウ 枠インテリア ウインドウ 枠インテリア
からはわからない ) 。 さて , 実際に List 2 のプログラムを MS-C Ver. 5.1 て、コンパイルしてみよう。 Fig. 1 の ようなエラーメッセージが表示され , コン パイル作業は中断する。 すなわち , 『予期せぬファイルの終端て、す』 とのメッセージだ 0List 1 すなわち max. h は 1 行だけのファイルて、あるが , これは Fig. 2 ( a ) のような状態て、ある。すなわち , #defin e 行には改行文字がなく , いきなりファイル 終端となっているのて、ある。 # て、始まる種々の前処理指令 (preprocessi ng directive) は , 改行文字て、終わることが て、ある。 改行文字を 【重要】前処理指令の最後には , 必ず となる。すなわち , 要求される。したがって , 正しい記述は (b) ず改行文字を入れよ べてのソースファイルの最後の行には必 【重要】ヘッダファイルを含めて , す 必要て、ある。【重要】をいい換えよう。 くても , 各行の終わりには必す改行文字が したがって , たとえ前処理指令の行て、な ればならない ースファイルの終端にも行末指示子がなけ 常は改行文字 ) て、終わることが要求され , ソ は , 行末を表す文字すなわち行末指示子 ( 通 一般に , C 言語のソースファイルの各物理行 何だか変な【重要】となってしまった。 私が知るかぎり , 少なくとも Turbo/BoI and 系コンパイラは , (a) のような不正な記 述を許す。しかし , ほとんどの処理系は , そのような記述を許さないのて、 , (b) のよう に必ず改行文字が必要て、ある。ほかの処理 系への可搬性が損なわれてしまうからだ。 可搬性の重要さを力説しても , 「私は Tur bo しか使わないから」とか「私はワークステ ーションしか使ってないし , パソコンの処 理系はまったく関係ない」といい張る人がい もし , 一部の国にしか通用しないパスポ ートと全世界に通用するパスポートを , ま ったく同じ労力・出費て、入手て、きるとした ら , あなたはどちらを選ぶだろうか。 プログラム開発時に , それほど余計なコ ストがかからない範囲て、は , 【重要】可搬性の高いプログラムを記 述せよ を , 厳守すべきて、ある。 さて max. h にきちんと改行文字を挿入した うえて、 , List 2 をコンパイルすると , 今度は Fig. 3 のようなエラーが出てしまう。 意外と多くの人が , このエラーを見た とがあるのて、はないだろうか。 7 行目の a , b の宣言 int a, b ; の int の前の空白中に , 全角文字のスペース が入っているのだ。工デイタ上て、 , その位 置にカーソルを持っていけば , カーソルの 大きさが変わるのて、 , Fig. 3 max. h を修正した上での List 2 のコン八イル結果 (MS-CVer. 5.1) すぐにわかるだろう。 Fig. 5 マクロの展開 list2. c(7) Iist2. c(7) error C2018 . error C2018 unknown character ' 0X81 ' unknown character ' 0X40 ' コフ マクロと空印 本文て、も解説しているように , 関数形式 マクロの定義において , #define max (), b) と max と ( の間に空白を入れることはて、 きない。しかし , 関数形式マクロの呼び出 しにおいては , のようにマクロ名と ( の間に空白を入れる ことがて、きる。関数形式マクロという名前 は , 通常の関数呼び出しと同じように呼び 出すことがて、きることからきているのだ。 のように , 識別子の前後を ( ) て、くくる ストを眺めるだけて、は , 見つけるのは困難 す脱帽してしまう。この手のエラーは , リ ジを表示してくれるコンパイラには , 思わ 見えないエラーに対して , 適切なメッセー めてもエラーを見つけることはて、きない ) 。 ( とくに , プリントアウトされたリストを眺 る見た目だけて、は判断て、きないものて、ある 以上紹介したふたつのエラーは , いわゆ 全角のスペース文字を使ってはいけない 【重要】ブログラム中の空白として , 字を使うことはて、きないのて、ある。 プログラム中の空白に , 全角のスペース文 いう関数を呼び出すことになる。 と , マクロの呼び出しが抑制され , max と なのて、 , 処理系の出力するエラーメッセー max Fig. 4 List 3 の max. h をインクルードした List 2 のコンノヾイル結果 list2. c(1 1 ) e 「「 0 「 C2064 : term does not evaluate tO a function 122 C MAGAZINE 1992 9
続々登場新ライフラリ 0 ソースコード付属 / 組み込みロイヤルティ無料 0 すわ e C 儿′ 'a es fo 「 PC -9800 series UWindow & Menu 2.0 IKey & Di 叩 y 2.0 価格ア 2 クク 価格ア 2 クク テキスト画面を対象として、オーバーラップ可能なウインドウを 100 個まてオープン、操作 1 文字単位のキー入力から、 1 行工テイタ、数値 / 全角等文字種指定のテータ入力関数ま で、また 1 文字表示から、指定領域に折り返し表示を行う関数、カーソル移動キーにより 可能なライプラリ。オープン / クローズ / 切り換え / 移動 / サイズの変更 / 文字列のスク ロール、折り返し表示等の機能を備えています。目的別に 5 つのタイプのウインドウがあ 上下左右スクロール表示が可能なテキスト表示関数まで、キー入力、画面表示 / 制御のさ り、表示内容 / 形式によって使い分けることがてきます。また、ウインドウを利用したメ まざまな機能を提供するライプラリ。・キー入力ファンクションキー、カーソル移動キ ニュー選択関数ては、カーソル移動キー、ホットキーによる選択、サプメニューの表示 / 、 ANK 、漢字の各コードを 1 回のキー入力関数で取得できる。■日本語入力 FEP の制 御 ATOK6 / 7 、 VJE 、 NEC/NECAI 選択も可能。その他、 1 行編集入力関数、 の起動、入力 / 変換モードの切り替え、 スクロール表示関数、メニュー選択関数 終了等の機能を提供。・スクロール可能 で使用するキーの変更が可能です。 ー 00F / 齢コンソ - ルコントロ - ルライフラリ 20 価格 59 ク な 1 行工テイタにより、表示幅より大き ・スクロール表示 / メニュー選択 / 1 行 価格釤 編集入力時の操作キーの指定ができる。 いテキストの入力が可能。・テータ入力 ー CCF/EX 2.0 関数日本語入力 FEP の制御を伴った ・フレームの表示 / 非表示ーウインド キー入力、文字列表示、グラフィック、マウス、ウインドウ、メニュー、プリンタ等 290 ウタイプにより、スクロール / 折り返し 文字種指定のデータ入力関数カンマ編 以上の関数て構成される総合コンソールコントロールライプラリです。 集・折り返し表示可能な指定領域への / 部分スクロールが可能■スクロール TWindow & tKey & DiSDlayR tGraphic & Mousez を包含し 文字列表示関数■スクロール表示関数 関数はスクロール単位の指定が可能 ています。ウインドウ / メニュー機能、キー入力 / 文字 / 文字列表示 / 操作 / カーソル制 メニュー関数はホットキー / スキップ項 カーソル移動キーにより上下左右スクロ 御 / 日本語入力 FEP 制御 / 編集入力の各機能、グラフィック / マウス機能については 目の指定、メニューバーのサイズ / 表示 ール表示が可能なテキスト表示関数。・ それぞれのライプラリの説明をこ覧ください。 その他各種シフトキーの取得、文字属 項目の指定ができ、また、サプメニュー ■プリンタ関数には OS 経由でプリンタに文字コード / 制御コードを送り、文字の印字、 性 ( 表示色 / リノヾース / プリンク / アンダ の表示 / 選択ができるのて、階層化が可能 拡大、強調、アンダライン等のモードの設定 / 解除、印字方向、改行幅等の指定から、 ーライン等 ) の設定。・画面を複数領域に 文字列印字、罫線印字機能付き文字列印字関数までをサポート。 ( PC - P 日系プリンタに 分割し、情報の変化を逐次表示したり、 対応 ) ・対応 C 言語 MS-C 6.0 / TC 2.0 / TC + + /QC 2.0 IGraphic & Mouse スクロール表示が可能なバネルウイドウ ※バネルウインドウ機能はウインドウ機能のサフセットと考えられるため、含まれません。 機能。 * MS - C は 6.0 のみに対応 ※ CCF / EX はノーマル / ハイレソの両モードに対応し、八イレゾモード時は互換モードもあります。 点、線、矩形、円、文字等を描画する関数、 指定領域を切り出す、貼り戻す、表示モードの設定を行う制御関数が、またマウスカーソ ルの表示 / 非表示、ホタン情報の取得、移動範囲の取得等の関数かあります。拡張グラフ ィック関数 ( 線 / 矩形 / 円 / 連続線分描画 ) ではラスタオペレーションの指定か可能。グラ フィック / テキストの個別 / 混在八一ドコピー関数も用意。標準で 16 色ホードが装着され ている機種では 16 色表示可能 ( 拡張グラフィック関数を除く ) IBGM/5 ラ成プロクラム価格ア 9 ククク NEW 価格ア 3 クり IBGM/Kit 0 側訂 S 12 種類のグラフ作成機能を提供するバッケージ。例えば、必要なバラメータを設定し、関 数を呼び出すだけで円グラフや棒グラフを簡単に描画することができます。さらに、タイ ヒジネスアプリケーションで必要とされるあらゆるグラフ情報を表現できます。 ・八一ドコピーによりグラフの印刷が可能。■標準で 16 色ボードが装着されている機種で は 16 色表示可能 ( 一部の関数を除く ) ◆「日 GM / Kit 」は「 CCF / 総合コンソールコントロールライプラリ」、 CG 「 aphic & MOUS 印ユーサーのためのグラフ描画関数ライプラリ。 第 ranes IMenu & select 物 ? 咽 s 価格ア 29 りク rMenu & S 引 ect 』はメニュー表示と項目選択に関する機能を提供する C 言語用ライプ ラリてす。画面のまん中に数個のメニューを表示するべージメニュー、指定行に表示する ラインメニュー、ポップアップメニュー、一度に多くの項目を選択対象として表示できス クロール可能なワイドメニュー、一覧表のような形式のリストメニューが提供され、カー ソル移動キー、ホットキーおよびマウスによる選択が可能です。各メニュー関数は組み合 わせて利用することかできるので、用途に合わせて最適なメニューを利用することができ ます。また、選択されたメニューを表示したまま次のレベルのメニュー選択が可能です。 メニュー選択時のキーコードは簡単に変更することができるので、アプリケーションに合 わせたキー設定か可能です。簡単に呼び出せる A 曰メニューバーの大きさの変更、メニ ュー選択中に他の処理を行う等のフレキシプルな処理か可能な A 曰の 2 種類の A 曰をサポ ートしています。ページメニューを除くすべてのメニューを階層化することかできる階層 メニュー機能があり、一連のメニュー選択を自動化することができます。また、キーの変 更によりメニューカーソルの移動キー、選択キーを変更することも可能です。 マシン共通化ライフラリ PF / 98 P ドし / J3100 PFL/AX PFL/FMR 物 0 訂 s PFL ライプラリは複数のパソコンて同一仕様の関数を提供するライプラリシリーズ。 NE C PC -9800 シリーズ、東芝 J ー 3100 シリーズ、各社 AX 仕様パソコン、富士通 FM 日 -50 シ リーズ間て、各機種の日 OS 、八一ドウェア等の差異を吸収し、統合化された関数インタ ーフェイスを提供することにより、同一仕様の関数を提供し、マシンインテペンテントな ソフト開発が可能なプラットフォームライプラリてす。 このライフ・ラリシリーズを利用することにより、例えば 98 シリーズ用に開発したソフトを J -3100 、 AX 等他の機種に移植する、同時開発するといった作業が非常に簡単に行えます。 キー入力、テキスト画面表示、カーソル制御、テキストウインドウ、メニュー選択、グラ フィックス、マウス等の関数か提供されます。 ・キー入力 SH 旧 T / CT 日 L / ALT と各種ファンクションキー・ INS ・ DEL 等を組 価格各ア 9 ククク み合わせての取得が可能。・テキスト表示高速画面表示 / 矩形領域の切り張り・移動・ コピー / 部分・全体の上下左右スクロール etc ・カーソル移動・位置の取得・形状の 変更・移動範囲の指定・表示の切り替え■ウインドウ / メニュー「 Window & MenLlJ と同等の機能を提供。■グラフィックスほとんとの図形描画関数で 5 種類のラスタオペ レーションをサポート / 矩形領域のスクロール・移動・コピ—etc ・マウスカーソルの 移動 / 位置の取得 / 移動範囲の指定 / 表示の切り替え / ボタン押下情報の取得 etc ・完全ソースコード付属、組み込みロイヤルティ無料。 ◆ MS-DOS Ve 「 3 」以上◆対象 C コンバイラ Mic 「 osoft-C Ve 「 . 5.1 / 6 ラージモテルに対応 ◆テモティスクを用意しています。切手 1030 円分をお送りください。 メティアは 98 用 5 " 2HD 、 J3100 用 3.5 " 2DD 、 AX 用 3.5 " 2DD 、 FM 日用 5 " 2HD となっています。 ■走行環境等 ( PFL 、指定のある製品を除く ) ・機種 ・ NEC PC -9800 シリーズ ( LT を除く ) * 製品によっては XL 、 XL2 、日 L の 八イレゾリューション / ノーマルの両モードに対応。 ・対象 C 言語・ Mic 「 osoft-C 5.1 / 6.0 Quick-C 2.0 Turbo-C 2.0 / C 十十 ・ MS-DOS ・ Ve 「 sion 3.1 / 3.3 ・メティア・・・・・・ 5 " 2HD 、 3.5 ″ 2HD ■お求め方法 お近くのパソコンソフト取扱店、秋葉原の石丸電気マイコンセンター ( 03 ー 325 ト 0011) または弊社てお求めになれます。 * すべての表示価格には消費税は含まれておりません。 * 各製品は C 言語毎の対応になっています。 * 各製品の仕様は断わりなく変更されることかあります。 ■テモティスク / 詳しい資料を用意しています ・デモティスク CCF/Menu & Select/BGM/Window@Menu/Key@DisDlay G 「 aDhic & Mouse の総合テモティスク郵便小為替または切手 515 円 分をお送りください。メディアは 5 ″ 2HD または 3.5 〃 2HD となっています。 ・詳しい資料は、 PHONE / FAX でこ請求ください。 元 台 株〒 三一 三三 ・ PHONE 03-5828-0511 03 ー 5828 ー 0513 ・ FAX く資料請求番号レ 0 〉
ダの あつばれ ご意見番 第 5 回 イラスト / 椙村嘉ー 「ソフトウェアは誰のもの ? 」 リーソフトウェア作者の苦労 6 月 20 日 , フリーソフトウェア大賞の授賞 記念パーティと記念講演会があった。フリ ーソフトウェアというのは , なんらかの意 味て、自由に使えるソフトウェアのことて、あ る。裏を返せば , ある意味て、自由に使うこと ができないソフトウェアて、あるともいえる。 講演会のフリートークの時間は , フリー ソフトウェア作者らの生の声を聞くことが て、きた。ディスカッションを行うのかと思 っていたが , 結局時間がなかったせいか , 単に順番に意見を述べただけだった。司会 の石田晴久氏とともに , 授賞者から 7 名がス テージに上がった。私は観客席から見てい ただけて、ある。 フリートークて、は「フリーソフトウェア を作るうえて、苦労したことは何か ? 」とい う質問が石田晴久氏からあり , それに対し て作者らが回答する場面があった。 もっと も多かったのは , メールの返事がたいへん という意見て、ある。人気のあるフリー ソフトウェアの場合 , 少なくとも数万人の 利用者がいる。これを頭に入れずに「感想が あればぜひお願いします」などとドキュメン トに書いてしまうと「いつも使っています」 といったメールが何千通もきてしまうかも しれない。フリーソフトウェアの場合 , 感 想だけて、はなく , 使い方がわからないとか , 動かない といったメールもくるだろう。 殺到するメールにどう対応するのがよいか は , 早急に解決しなければならない間題て、 もある。 利は誰の手に ? フリーソフトウェア作者らの声を聞いて , ひとつだけ不思議に感じたことがあった。 権利問題に対する苦労の声がなかったのて、 ある。私の場合もっとも苦労したのはなん といっても権利に関する問題だったから。 今から数年前 , フリーソフトウェアの数 もそれほどなかった頃 , ネット上て、「 MS ー C て、コンパイルしたプログラムをフリーソフ トとして公開しても構わないのか」という議 論が盛り上がった。プログラムをコンパイ ルすると , 最終的な実行形式のオプジェク トには , 自分が書いたプログラムから生成 されたオプジェクト以外の部分が含まれる。 Fig. 1 BPL v3E を一 x オプションで起動したときの表示 A> bpl -x Compiled by Turbo C 十十 (Turbo C 十十 Version 1 .01 Copyright (c) 1990 Borland lnternational) BPL. EXE v3E, by Phinloda for CompuServe B Plus P 「 otoc (SM) 98 版 使い方 : bpl [-aefhpstvl 37 ] [ ファイル名 ] Fig. 2 BPL. EXE v3E に添付されている READ. ME より 7 ) 本ソフトウェアは Turbo C 十十を用いてコンノヾイルされています。 Turbo C 十十の 使用承諾条件に従い , Copyright 表示を追加しました ()x option)0 4 ) に加え , ソフトウェア内のこの箇所を編集しないことを利用条件とさせていただきます。 91 / 04 / 07 Phinloda 152 C MAGAZINE 1992 9 ランタイムルーチンや , リンク時に追加さ れるライプラリ関数に対応するオプジェク トて、ある。これらの権利はコンパイラのメ ーカーが所有しているため , コンパイラを 買った人が勝手に配ることはて、きない。し かし , コンパイラを買った人が自分て、作っ たプログラムを配れないというのも問題て、 ある。ランタイムルーチンやライプラリも 全部自前て、揃えたら , メーカーの権利は消 滅するのだろうか ? この間題は錯綜した。実際にメーカーに どうなのか尋ねた人がいたのだが , その回 答がはっきりしなかったのが原因となった。 たとえば , このような権利表示をしろと指 示されたり , 表示するなと指示されたりし たのて、ある。これて、はわけがわからない さすがに今て、は明確な指示があると思う。 私が持っていたのは Turbo C だったから , このような問題は発生しなかった ( 実際は話 は逆て、 , このような問題のないことを確か めたうえて、 TurboC を選択したのだ ) 。すな わち , Turbo C て、コンパイルしたプログラ ムは , 自由にフリーソフトウェアとして公 開したり , 営利目的て、売っても構わない とを知っていたのだ。この原則は今も変わ のて、ある。つまり , 著作権通知を行わなけ 払わずに寄贈・販売て、きると書かれている を行った場合にかぎりライセンス料金を支 使って作成したプログラムは , 著作権通知 わかる。そこには , Turbo 言語コンパイラを ンス規定および制限付保障」の項目を読めば のご使用条件」の「ナンセンスて、ないライセ rbo C 十十に添付されている「ソフトウェア 現困難て、ある。理由は BorlandC 十十や Tu いと何度か書いた。しかし , 現在これが実 ネットて、は , BPL. EXE は将来 PDS にした る間にひとつの変化があった。 っていないのだが , 実は BPL を制作してい
ln a ⅱ行靏 m 町ⅱ Ma れ門 システム・ワン Power C Ver. 2. OJ Power Ctrace 数が呼び出している子の関数に移 この数字は , おのおのの文が実行 の情報の表示を切り換えます。 今回は , Power Ctrace の機能の 動します。 されるたびにひとつずっ増加しま 中て , トレースの軌跡を中心に説 実行された軌跡を このとき , 関数の移動にともな す。 明します。 逆方向にたどる Fig. 1 は , 途中まて、実行したとこ って変数ウインドウの情報も変化 実行の軌跡 Power Ctrace て、は 255 個の文ま しますのて、 , 関数の内部て、使用さ ろて、実行の軌跡を表示したものて、 て、逆方向にたどることがて、きます。 れている自動変数の値を確認する す。この例てはループの中て条件 逆方向トレースモードに入るため 場合などに威力を発揮します。 選択処理を行っていますが , どの Power Ctrace て、はプログラムの には , 国キーや国キーを使用しま 各文が何回実行されたかを表示す 部分がどれほど実行されているか トレースする関数の選択 す。国キーは一時カーソルを最大 ることがて、きます。各文の実行回 わかると思いますにこて、示してあ 255 個まて、逆方法に移動させます。 数を調べることにより , 負荷の分 る実行の回数は , 整数入力に対し 国キーは一時カーソルを実行され 通常て、は , / t オプションをつけて 布や処理の分岐状況が確認て、きま て , 正整数を五個 , 負整数をふた た最後の文の位置に移動させます。 コンパイルされたプログラム中の っ入力して , 最後に 0 を入力した場 す。 すべての関数がトレースの対象と 合の状況て、す ) 。 このとき , ステータスラインの実 Power Ctrace 起動時のソースウ もう一度国キーを押すと , ウィ なります。しかし , プログラム中 行カウンタ , 関数名 , 関数の深さ インドウの左側部分には数字が表 の部分が反転して , 逆方向トレー の全関数をトレースする必要がな 示されています。これは行番号て、 ンドウの左端部分の数字が消去さ スモードに入ったことを示します。 い場合もあるて、しよう。 れ , その分だけソースプログラム あり , プログラムを見やすくして 実行の軌跡をたどるには , 曰キ そうした場合には , 関数単位て、 の表示幅が増加します。ソースプ ーと曰キーを使用します。曰キ 国キーを押すと , ウインドウの トレースを ON / OFF するトレース ログラムをて、きるだけ多く表示さ コマンドを使用します。国キーを ーを押すたびに , 一時カーソルは せたい場合にはこのモードを使用 左端部分に実行の軌跡が表示され します。このように , キーはト ひとつ前の実行文に戻ります。ま 押すとポップアップウインドウが ます。実行の軌跡情報は実行可能 た , 曰キーを押すと一時カーソル 現れ , 現在トレース可能な関数の グル動作により上記に示した 3 種類 な文に対してのみ表示されます。 一覧が表示されます。 こて、 , ト は次に実行された文に移動します。 Fig. 1 実行の軌跡の表示例 レース制御をしたい関数シンボ、ル このようにして , 文がどのように の位置にカーソル移動して曰キー して実行されたかを遡って見るこ とがて、きます。 を押すと , トレースが OFF に設定 され , 国キーを押すとトレースが 逆方向トレースモードて、は , プ ON に設定されます。 ログラムを実際に実行しているわ ファイルの分割もトレース制御 けて、はないのて、 , 変数の値は変化 の方法のひとって、す。この場合 , しません。 ソースファイルを分割してトレー 関数呼び出しの軌跡 スしたい関数を含んて、いるソース ファイルだけを / t オプションをつけ 国キーと国キーを使用すれ てコンパイルし , それ以外のソー ば , 関数呼び出しの軌跡をたどる スファイルは / t オプションをつけな ことがてきます。このコマンドは いて、コンパイルします。 鎖状に呼び出されて , アクテイプ 後者の方法を用いると , デバッ になっている関数の軌跡をたどる グ関連の情報を含まない分だけメ モリを節約することがて、きます。 ために用いられます。 回キーを押すたびに , 現在表示 このため , チェックに関連のない 部分は外しておいたほうがよいて、 されている関数を呼び出した親の 関数に移動します。また , 国キー を押すと , 現在表示されている関 #include VOid く stdio. h> main( void ) int value int pos_count int neg_count 1 pos—count 1 neg count whiie ( 1 ) { 8 scanf( ” % d ” , &value ) ; 8 if ( value > 0 ) { 8 5 pos_count 十十 3 else if ( value く 0 2 neg_count 十十 else { break ; print{ "POSitive 1 s Xd. pos_count printf "Negative 1 s Xd. neg_coun t return in case Of in case Of negative in case Of zero 1 、 1 0 0 lnformation from Compiler Makers 159
却プログラミング Fig. 2 do—while Fig. 1 セグメントとオフセット セグメント オフセット 0 0 0 A 0 0 0 0 A 0 0 0 十 0 0 0 0 ループ本体 do { ループ本体 } while ( 条件 ) ; 条件 成立 不成立 A 0 0 0 0 とえばセグメントの値が 0X1234 , オフセッ 体的には , トの値が 0X5678 て、あれば , char far *p 0XA0000000 ; P 0X1234 0X41 ; 十 0x 5678 とすれば画面の左上隅に A が現れます 00xA 0X179B8 } while ( 条件 ) ; 0000 番地を指定するには 0XA0000000 とする という番地を指定したことになります。同 理由は先ほど述べたとおりて、す。 は , 条件が成立しなくなるまて、「・・・・司の部 テキスト VRAM の番地は機種によって異 じ番地を指定するためのセグメント・オフ 分を繰り返すという命令て、す ( Fig. 2 ) 。 なります ( 固定したテキスト VRAM を持って セットの組み合わせはたくさんあります。 比較 p!= 0 は本来なら , いない機種もあります ) 。 List 1 はテキスト 8086 のこのような特性を生かすために (unsigned char far * ) 0 MS-DOS 用の多くの C 言語て、は , テキスト V 日 AM の番地を調べる (unsigned char far * ) 0X12345678 ; としたとき , p のセグメントが 0X1234 , オフ セットが 0X5678 になるように作られていま す。て、すから , 実際の番地は 0X179B8 て、す。 VRAM の先頭番地を調べるプログラムて、 す。 List 1 て、 do { List P 1 1 : #include く stdio. h> 2 : #include く ctYFE. h> 3 : main() int i; 5 : / * ポインタ p を宣言 * / 6 : uns igned char far *P ; 7 : printf( ” *x1bC2JA%n") : 8 : / * 画面消去 , A を表示 * / P ニ (unsigned char far * ) 0 : / * p を 0 番地に * / 9 : do { 10 : / * 繰返し * / if ()P ー / * p 番地の内容が ' A ' なら * / 12 : printf("%x1bC2JB*n ” ) ; / * 画面消去 , B を表示 * / if (*P 13 : / * p 番地の内容が ' B ' なら * / 14 : printf( ” *x1b[2JVRAM: 0x % 08 lX*n ” , p) ; 15 : / * 画面消去 , 駅 : ox???????? のように表示 * / for (i = 0 : i く 16 ; i + + ) { 16 : printf("X081X: % 02X " , p, (p) ; 17 : 18 : if (isprint(*p)) printf(" ' Xc' " , (p) ; 19 : 20 : / * 夘が文字として表示可能なら表示 * / printf( ” *n ” ): / * 改行 * / 21 : 22 : / * p に 1 を加える ( p = p + 1 と同義 ) * / 23 : 24 : break ; / * ループ脱出 * / 25 : printf("Yx1bC2JA*n") : / * 画面消去 , A を表示 * / 26 : P = (uns igned char far * ) ((unsigned long)p + 0X1000 の ; 28 : 29 : / * p を unsigned long 型に変換して 0X10000 を加え , 30 : unsigned char far * 型に戻す * / 31 : / * p が 0 になるまで繰り返す * / 32 : / * 正常終了 * / 33 : ) テキスト V 日 AM の 番地を調べる printf("A") ; とすると画面に A の文字が 表示されますが , コンヒ。ュータ内部て、は , 次の 2 段階に分けて文字表示をします。 ① A の文字コード 0X41 をテキスト VRAM (ビデオ RAM) というメモリの特定の番 地に書き込む ②これを A という文字の形の点の集まりに 変換して , 画面に表示する このテキスト VRAM が PC ー 9801 て、は 0xA 0000 番地から始まります。て、すから , PC-9 801 て、 0XA0000 番地に 0X41 を書き込むと , 画 面の左上隅に A という文字が現れます。具 }while (p ! = の ; return 0 ; 実践 c プログラミング入門 79
啝し ・関数を 4 つ使ラ事でウインドウの OPE ・上ア左右の スクロール・ページ送ク戻し・移動・大きさ変更・アクテイプ ウインドウの変更・ CLOSE することができるウインドウをご利用する ことができます。 ・ユーザー偲でメモグの確保・用放をする必要はありません。 ・ウインドウを小さくする事に伴い入力領域不足力性じた時には、自動的に スクロール入力ーは久スカすることができます。 ・カーノノレが移動できる目を文字の種類や文字コードにより設定すと ができます。 ・カーソノレが示す項目先頭文字を基準に、ウインドウの大きさ変更や、上下 左右のスクロールをしますので、目的の疲目を容易に選択することができ、 操作性を向上させています。 ・ウインドウ内に表示されている内容を製品中の数で、編集・登録 しながら表示させることが可能です。その時の状況ーはク素早くメニューや メ : 地ージ、の内容を更新させて表示させます。 ・ウインドウの表現力を補足する多くの関数が含まれています。 発されるシステムの工数低減に貢献致します。 ・ノースは全て C 言語で記述されています。 ソースを眺めることで、ウインドウシステム自身を だ握することができます。 ・機能の追加・変更が簡単にできるよラに、 〃個のウインドウ関数が用意されています。
#include く pc98. h> #include く conio. h 〉 void main() pc98fkeyoff() ; textmode( N8025 ) ; clrscr(); れほどに今ては , OOP ( そして OOA,OOD … ) に関する研究や理論 , そして新しい言語の 開発が , 高度に進んて、います。て、すから , 日本の、、業界人〃のかたがたよ , ゞプロ〃のか たがたよ , なんて、も現状を守護し , 現状だ けに事細かに詳しい , 硬化した矮小な専門 家にならないて、いただきたいのて、す。 ちなみに , 将来のもっと進化した , 誰も が安心して使えるプログラミング言語 D や D 十十て、は , 上の① ~ ④などの問題が , どう 解決されていると思いますか。それらが , およそ言語表現一般に関する , 一般人の素 朴て、常識的な願いをますます無視して , 狭 い専門家だけが細部を知っている , 奇怪な quirks の固まりになっている , とは思えませ んがね。 言い換えれば , D や D 十十 , E や E 十十等々 は , ますます literate なプログラミングの実 現 , 最小驚愕の法則の実現に近づいている ことてしよう。残念ながら , 、、現状 (statusq (o) のはく吠える , こわい ) 番犬クにすぎな い日本の今の業界人やプロたちは , そうい う言語の出現に向けて , なんら貢献て、きな いのだ。かたや一介のパンピーたる私は , 6 月号て、すこしは貢献したつもりなのだ , 心 ある人々が読んて、くだすったならばね。 今月のドジ : バッチファイルの 最終行を改行すること / しなしにと MS-DOS は , 立ち上がったとき必ず , 最 下行にファンクションキーの機能と時計 ( 編 画面消去プログラム ( c. c ) / * c. c : 画面消去プログラム / * for PC ー 9800 series & Borland C + + 3.0 * / LiSt C 言語フォーラム 105 集部注 : 時計が表示されるのは DOS の機能 ういう , DOS の仕様なんて、しょっ。 てしまうのて、す。理由は知りませんよ。そ DOS に戻ると , なぜか時計だけは表示され 最下行が完全に消去されますが , 終わって グラムが実行されている間 ( = ごく一瞬 ) は しかし , この方式のプログラムは , プロ 長時間いじくりました (List 1 ) 。 んな構成のプログラムを , なんだかんだと ラムづくりに取り組みました。 て最初はバッチファイルを諦めて , プログ 表示消去云々とは書かれていません。そこ をプログラムが使用する」と書かれていて , S に関する古い資料にはそれは「画面最下行 があることは知っていました。て、も MS-DO ESC [ > lh というエスケープシーケンス す。一発て画面をクリアする方法はないか。 と皿十囮という二度手間になりま 画面消去とともにやりたいときは , 十 の表示は , 十囮を押せば消えます。 最下行のファンクションキー機能と時計 ジの数々の解説て、すが。 いなコンピュータのための , メモリクラッ えたぶんのほとんどが , i80X86 というけった ル類の厚さが計 10 センチ近くあります。増 ません。 MS-DOS も 5.0 となると , マニュア のあちこちを探してみましたが , 見当たり して、立ちあげる方法はないか , マニュアル が視覚的にうっとおしいのて、 , この表示な FEP の機能てしよう ) が表示されます。これ て、はありません。おそらく組み込んて、いる て、 , 最初は案として退けていたバッチフ ァイルを書いてみました。 DOS5 の『プログ ラマーズリファレンスマニュアル』には , ESC [ > lh が「ファンクションキーの内容を 画面に表示させない」と明記してあります。 しかし画面下右隅の時計は , 、、ファンクショ ンキーの内容クて、はありませんしねー ても , 以下のようなたった 2 行の簡単なバ ッチファイルは , ほば目的を達することが て、きました。 [ ファイル C. BAT ] ( これを起動する行を AU TO EXEC. BAT の最後にも書く ) ECHO ESC [>lh CLS しかし , 常識どおりというか , 慣行どお りに , 最後の CLS の行も改行て、終わらせる と , 画面完全クリアにならないのて、すよ。 最上行のプロンプトが画面に残り , カーソ ルは 2 行目に行ってしまいます。つまり , M S-DOS の , バッチファイルを実行する部分 が , 最後に ( ユーザが頼んて、もいないのに ) 勝手に一つ改行を挿入するのて、す。 問題は , 「最後の CLS の行は改行しない」 というバッチファイルを作ることによって , 解決しました。「バッチファイルの実行が終 わると , 改行が実行されます」なんて , マニ ュアルのどこかに書いてあったかしら。 ああーん , RAMi•イスクとして使ってい たメモリを BC 十十 3 のランタイムに奪われて しまったため , 神への誓いを破って MS ー DO S マシンのためにハードディスクを買ってし まった。しかし , 辞書も , 工デイタなど頻 用するプログラムも , RAM から使うほうが だんぜん精神衛生に良いて、すな。て、もこう なりや , わが爪をもう 2 ~ 3 本燃やして , テ ストスーツて、不合格ゼロという , MS ー C 十十 への鞍替えを決行しましよう 0Microsoft に は , 居丈高て、こわい Watchdog of Status Q uo が一匹もいないこと , 客への応対態度が まともて、あることを期待して・・・ P. S. このバッチファイルを実行すると , lh と いう名前のファイルが作られてしまうとい うドジもあるものてす !
ln れ川 a ⅱ行町ⅱ計 Ma れ門 FUJITSU High C VI フ 拡張ライプラリⅡ Q ウインドウ内の描画関数 WGB XXXX を使うとき , どのような点 に注意すればよいのでしようか ? A ウインドウの、一ザ枠内に , 図形や文字などを表示する場合は , クリッヒ。ング枠に注意する必要が あります。「ウインドウ実行関数」 として登録された関数内て、は , ク リップ枠の設定はすて、に行われて いますから , WGB て、始まるウィ ンドウ描画関数を使えば自動的に ウインドウの重なりを考慮した描 画が行われます。ウインドウ関数 以外 , たとえばトップメニューか ら選択された実行関数内て、ウイン ドウ内に描画する場合はクリップ 枠の設定が必要になります。クリ ップ枠の設定は , Fig. 1 のようにな ります。 Fig. 1 て、 ID drawwindow には描画対象のウインドウ部品の ID を指定します。 Q スクロールバー部品のパラ メータ設定がよくわかりません , どのように設定すればよいのです A スクロールノヾー型部品は , スクロールバーの状態としていく つかの値を持っています。また , スクロールバーを動かすとその値 は変化するのて、 , 変化する範囲を あらかじめ設定しておく必要もあ ります。スクロールバーの値の設 定は , Fig. 2 のようにします。 Fig. 2 て、 min と max は , それぞれスクロ ールバーの取り得る値の範囲て、 , prt は現在スクロールバーが指し示 している値になります。 MM GET 158 C MAGAZINE 1992 9 SCROLL て、 prt に得られる値が , m in と max の範囲を取るということ になります。 len はスクロールバー のスライダー部分の長さを規定し ます。これは max 値に対する len の 比率によってスクロールバー内て、 のスライダーの長さが決まるよう になっています。 page はスクロー ルバ、一のペーシシャンプ機能によ って prt の値が変化する量を設定し ます。たとえば , テキスト部品と 組み合わせて , スクロールノヾー よってテキストがスクロールする ようなものを考えてみます。まず , テキストの見える部分の行数を dl , テキストの全体の行数を tl としま す。この場合 , 最初に Fig. 3 のよう にスクロール部品にノヾラメータを 設定しておきます。 dl を min に , d 1 と tl の大きいほうを max に設定し ているのて、すが , dl ー 1 のように 1 を 引いているのは , スクロールノヾー の位置情報としては 0 から始まって いるためて、す。 スクロールバーの実行関数の中 て、は , スクロールバーの値を読み 取って , テキスト部品をスクロー ルさせます。これには , TE Scro 11 ( ) 関数を使います。このときスク ロール方向と変位を指定する必要 があるのて、 , List 1 のようにすると よいて、しよう。 Q 「拡張ライプラリⅡ」の GU けイプラリで , 初期化以外で画面 モードを切り換えるにはどうすれ ばよいのですか ? A GUI ライプラリて、は初期化 時に , そのアプリケーションて、使 う画面モードを任意に設定て、きる Fig. 1 クリップ枠の設定 WINCLIP *pwclp WIN beginUpDateObj い D drawwindow, &pwclp) / * ウインドウ内の描画を行う * / WIN endUpDateObj(pwclp) Fig. 2 スクロールバーの値の設定 MMI SendMessage( kobj, MM SETSCROLL, 5 , prt, min, max, len, page ) Fig. 3 スクロールバーの値の設定例 MMI SendMessage( kobj, MM SETSCROLL, 5 , 引ー 1 , 引ー 1 , ( 引 >tl) 引ー 1 ) : ( ー 1 ) , 引 , 引ー 1 ) テキスト部品をスクロールするプログラム / * テキスト内容設定部分 * / / * スクロールするテキストの設定 * / TE_GetTextLine( &tl ) ; テキストの行数を裘犇 / , / dl = 25 ・ / * スクロールバーの設定 * / MMI_SendMessage( kobj, SETSCROLL, 5 , Lsit 1 dl ー 1 , d ト 1 , ( dl 〉 (l) ? ( dl ー 1 ) : ( t ト 1 ) , dl , d ト 1 ) ・ int scrol IFunc( Obj, messld, argc, pev, trig ) / * スクロールバー実行関数 * / TEHandle *th ・ / * テキスト部品のハンドルを求める * / MMI SendMessage( ID_text, MM_GETHANDLE, 1 , &th ) TE-Äctive( th, 0 , 0 ) ; / * テキストをアクティブにする * / / , スクロールのを読みだす , / MMI_SendMessage obj, MM_GETSCROLL, 5 , &prt, &min, &max,&len, &page) return NOERR TE_Deactivate() ・ MG-mosDisp( 3 ) ・ MG-mosDisp( 2 ) ・ df 1 ine = df if( line く 0 ) line = ( prt ー min ) ー th->dspline ・ / * テキストをインアクティブに * / TE ー r011 ( df, line ) ; / * テキストをスクロールする * / —line / * スクロール方向を調べる * / / * 表示位置 * / ようになっています。 GUI 画面はそ の設定したモードに従って描画さ れるわけて、す。しかし , グラフィ ックの表示など GUI の画面モード とは違ったモードて、画面表示した い場合があります。このような場 合は , 一時的に画面モードを切り 換えることがて、きます。通常の画 面のモードを切り換えるときと同 様に , EGB resolution などを使っ て設定してかまいません。ただし この状態て GUI の部品などを表示 させると , 画面に正しく表示され ません。したがって , 再び GUI を表 示させる場合は , もとの画面モー ドに戻しておく必要があります。 アプリケーションの最初て、設定し た画面モードとは違った画面モー ドて , GUI も表示させたい場合は , 一度 MMI Close してから MMI O pen を再設定する必要があります。 この場合は , ヒープ領域などもす べて開放されて再初期化されてし まいますのて、注意してください
実践アルゴリズム戦路解法のテクニック 表す enum を用いることにします。これだと 将来 , 変数や予約語が出てきたとき容易に 対応て、きるからて、す。この enum は以下のよ ーします。 フに旦高 enum {C NUMBER, C—OP, C NEWLINE, C EOF, C_OTHERS 接頭語の C は calculator の頭文字て、す。数 値はすべて C NUMBERC' 代表し , その値 は大域変数 value にセットします。演算子は 4 種類ありますが , get token ( ) のセットす る値としては , いずれも C OP を返すことに し , 演算子の種類は大域変数 operator て、返 すことにします。そのほか , C NEWLIN E, C EOF, C OTHERS はそれぞれ , 改 行 , EOF, そのほかの字句という意味て、 す。 get_token( ) の仕様が決まったのて、 , 1 行 の処理を行う関数を書くことがて、きます。 List 2 に疑似コードて、概略を示します。電卓 といっても結構複雑て、すね。 List 2 を用いて 説明したいことはたくさんあります。まず 基本的な戦略として , 「先読み」を使ってい ます。入力の字句として , 数値がくるか , 演算子がくるか , 改行がくるか , これらは とにかく読んて、みないことにはわかりませ ん。 このため先読みを行うのて、すが , ケース バイケースて、先読みをしたりしなかったり するのは , たいへん紛らわしく , 読むこと が難しいプログラムになってしまいます。 このため , 常に字句ひとつ分だけ先読みし た状態を維持することにします。 先読みした状態を維持するとは , 字旬を 使ったらその場て、次の字句を読み込む , つ まり ge い oken ( ) を呼んて、おくということて、 す。読み込んだ字句は即座に使うとはかぎ りません。だからこそ , ge い oken ( ) の返す 情報を大域変数に格納しているのて、す ( コラ ム参具 ) 。 次に説明しなければならないのはエラー チェックて、す。 List 2 には , 「・・・・・・のはす」と いうコメントが 3 か所あります。 こには工 ラーチェックを置かなければなりません。 電卓といえども簡単なプログラム言語て、あ り , コンパイラのようなものを作っている わけて、すから , シンタックスエラーに対す るチェックは不可欠て、す。まちがった式は まちがいと指摘しなければならず , もっと もらしい値を表示することは避けなければ はなりません。このようにエラーチェック は重要て、すが , 先を急ぐのて、 , その重要性 を指摘するにとどめます。詳細は後述のプ ログラムリストをご覧ください 最後に get token ( ) の作り方を説明しま す。 get_token( ) の基本的な仕様としては , 以下のものをあげることがてきます。 ・空白は読み飛ばす ・演算子など 1 文字の字句を返す ・数値はひとまとまりで読み込む こて、問題になるのが数値の処理て、す。 数値は何桁あるかわからないのて、 , 数値の 末尾を認識するためには , 1 文字余計に読 なければなりません。つまりここて、も先読 みが必要になります。例によって , 常に 1 文 字先読みした状態を維持することにします。 ただし改行と EOF の後だけは例外て、 , 先 ロ丿し みをしないことにします。この理由は皆さ んが考えてみてください List 3 に字句解析を含めた電卓全体のプロ グラムを示します。このリストには単純な 工ラー処理も含んて、います。工ラー処理て、 は , 行の残りを読み飛ばし , 、、 ? 〃を表示して いるだけて。す。この読み飛ばしは必須て、す。 これがないと , この後の式の処理のつじつ まが合わなくなるからて、す。前記のつじつ ま合わせは , コンパイラの用語て、は「構文ェ ラーからの回復」と呼ばれます。そのもっと も単純な例ということになります。 List 3 は電卓としての最低限の機能を含ん て、いますが , 本格的に使うとなるとやや不 満があります。たとえば演算子の優先度を 考慮していないため , 「 2 十 3 * 4 」のような式 て、は数学のルールて、求めた値 ( 14 ) とは異な る値 ( 20 ) を表示します。このため , 先の電 卓に , 演算子の優先度を考慮する機能を追 加することにします。 まず電卓の仕様を厳密に記述しなければ なりませんが , これには文脈依存文法とい うものを使います。このため , 文脈依存文 法の説明を簡単に行うことにします。 文脈自由文法はプログラム言語などの構 文を厳密に表現するための方法て、す。文脈 自由文法の表現方法には , BNF や EBNF, 構文図など , いろいろな流儀がありますが , こて、は EBNF を用いることにします。 文脈自由文法の説明のために , 足し算と 掛け算からなる簡単な式の構文を考えてみ ます。以下は文脈自由文法て、はなく , 「日本 語」て、記述したものて、す。 式は項 + 項 + ・・十項 項は因子 * 因子 * ・・ * 因子 因子は数値または ( 式 ) 上記の表現は , 直感的にわかりやすくは ありますが , いろいろな点て、曖昧さがあり ます。とくに曖昧なのが、、 ・クの部分て、 , 0 回以上の繰り返しなのか , 1 回以上なのか , はたまた 2 回以上なのかはっきりしません。 ・クなどの記号か , 言 語の文字列を構成する記号なのか , 構文を 表現するための記号なのかも曖昧て、す。 曖昧さをなくすためには , 構文を日本語 て、はなく一種の式の形て、表現することが考 えられます 0EBNF(Extendend Backus-N aur Form) は文脈自由文法を厳密に表現す るための式の一種て、す。 EBNF はその名の とおり BNF を拡張して読みやすく書きやす くしたものて、す。 BNF は K & R の第 2 版の付 録などに出ているのて、 , すて、に慣れ親しん 文脈自由文法入門 実践アルゴリズム戦略解法のテクニック 63 因子ニ数値ー "(" 式 ' ア . 項 : 因子 { ” * ”因子 }. 式 : 項 { ”十”項 }. 行 = 式改行 . ファイル : { 行 } EO F. Fig. 1 電卓第 2 版の文法 ( EBNF )