編肝 + 3.0 9 MAGAZINE 1992 年 9 月 1 日発行 ( 毎月 1 回 1 日発行 ) 第 4 巻第 9 号通巻 36 号 1990 年 2 月 2 日第 3 種郵便物認可 提携・ LANG E 誌 / 監修・石田晴久 C 言語技術情報誌・ C マカシノ 、 SOFT BANK MS-DOS と Windows 開発機能を探る 1992 SEP. Vol. 4 No. 9 980yen 0 0 く特別記事〉フォーマットトランスレータ「 Japan2HD 」作成記・ PC AT マシンで PC -9801 フォーマットディスクを読む 提携記事 >Who ' s Minding the store? Reference Counting in C 十十 / 実践 C プログラミンク入門ポインタと情報処理試験予測 / X68k 活用講座 アルゴリズムとデータ構造入門最終回 / 'C 十十入門講座 T Ⅳ The C 十十クラス機構 2 / 実践アルゴリズム戦略再帰降下型構文解析 D 「 . 望洋のプログラミング道場見えないエラー / プログラミングの工ッセンス / 【 5 " 2HD 特別付録】・テキスト整形プログラム「 Efin 」 ・フォーマットトランスレータ apan 2HD 」・メニュープログラム℃ AS 」・アウトラインプロセッサ℃ fin 」・本誌掲載ソースプロクラム
とすれば abcdefghij が表示されることがわか れば合格て、す。 s のサイズはこの場合 5 文字十 5 文字十 1 文字 ( ' \ 0 ' ) = 11 文字分以上必要 て、す。 さらに , メモリ領域を確保する malloc ( ) の説明 ( コラム III) を読んて、みましよう。 ヒープ領域とは malloc( ) て、切り出すため のメモリの空き領域のことて、す。 この説明て、 , malloc( ) を使うためには が必要て、あることがわかります。どちらか #include く m 訓 OC. h > または , #include く stdlib. h > プログラムの先頭に ひとっ書いておけば十分て、す。 ANSI / ISO 規 格て、は stdlib. h になっていますが , 古い C と の互換性のために malloc. h て、もいいことにな っています。 malloc ( ) の戻り値は void * 型となって います。 void というのは虚無 , 何もない とて、す。 void * は「指すものの型をとくに 情報処理試験 情報処理技術者試験と C 言語 語対策講座 第 2 種・第 1 種情報処理技術者試験が C 言語て、も受験 て、きるようになりました ( 第 2 種は今年秋から , 第 1 種 は来春から ) 。 これらの試験は通産省の後押して、 , 第 1 種は毎年 4 月 , 第 2 種は毎年 4 月・ 10 月に行われ , 毎年数十万人 が受験しています。以下て、は第 2 種について説明し 試験は , ハードウェア・ソフトウェアの基礎知識 と関連知識 ( 多肢選択式 ) , プログラムの作成能力 ( 穴 埋め式 ) から成ります。後者は FORTRAN, COBO L, PL/I, アセンプラ C から選べます。 C はも に 1 ロロ ちろん ANSI/ISO 規格のものて、す。 1992 ー 4 ー 1 KARA NO BIO-RHYTHM CALENDAR KAKO-KI 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 20 21 22 23 24 25 26 28 29 82 C MAGAZINE 1992 9 0 印字例 1942 ー 10 ー 31 UMARE JOSHO-KI 29 28 26 24 23 22 21 20 19 17 15 14 13 12 9 8 7 6 5 4 3 2 1 0 図 こて、は C 言語の予想問題を・・・・・・といいたいところ て、すが , まだ 1 回も行われていないものを予想するの は私の能力を超えますのて、 , 今年 4 月の FORTRAN の 問題を C に焼き直したものをご紹介します。この問題 はバイオリズムをグラフにするものて、 , 試験問題と してだけて、なく , 学園祭などて、実演しても楽しいも のて、しよう。 ' 92 年 4 月の FO 日 T 日 AN の問題より 問次の C プログラムの説明およびプログラムを読ん て、 , 設間に答えよ。 〔プログラムの説明〕 生年月日を入力して , バイオリズムを計算し , 指 定した年月日から 30 日間のバイオリズムを印字する プログラムて、ある。 (I) バイオリズムとは , 人間の肉体 , 感情および知 性が一定の周期を持っという説によるリズムの ことをいう。リズムは , 肉体が 23 日 , 感情が 28 日 , 知性が 33 日周期の正弦曲線て、表すことがて、 きる。 ②ここて、バイオリズムは , 次のようにして求める。 ①生年月日 (nenl, tsukil, hil) から , 指定した年 月日 (nen2, tsuki2, hi2) まての総日数 (sou) を求 める。 ②総日数を , 肉体 , 感情および知性の周期 ( 配列 sh uki) て、割って , それぞれの余りを求める。 ③求めた余りに 0 ~ 29 の数を加え , これに刻み幅を 掛けて求めた値の正弦が , 肉体 , 感情および知 性の値になる。 ( 3 ) 生年月日とバイオリズムの印字期間を指定する 年月日は , 西暦年を 4 桁の数字て、 , 月と日をそれ ぞれ 2 桁の数字て、入力する。
新 - OS プログノクス門 C プログラマ のための ESC / P プリンタ印刷ユーティリティ vp を紹介します。 ました。今回はその応用例としてプリントアウトの実例として 1992 年 5 月号の特集で機種依存するプログラムの記述法を説明し 第 24 回プリントアウト 中島信行 98 で ESC / P プリンタを 使うと・・・ プリントアウトにはワープロを使ってい る人が多いて、しようが , 筆者はワープロを 使わないのて、今回紹介するユーティリティ て、プリントアウトしています。ワープロを 使えばきれいに印字て、きるのて、すが , 筆者 は飾りをつけないため , ワープロて、印字し てもあまりメリットがありません。逆に半 角罫線などが印字て、きないため , 役に立た ない場合もあります。 PC -9801 シリーズて、 ESC/P プリンタを使 用すると漢字フォントの違いから一工夫し ないといけません。たとえば , ・ NEC 罫線をプリンタの漢字フォントの 罫線へ変換 ・ NEC 特殊漢字のビットイメージ出力 ・ N EC 半角漢字の処理 などて、す。 NEC の特殊漢字はほかのパソコ ンて、読めないため , 本当は使用しないほう がよいのてすが , 表を作成するときには全 角罫線と半角罫線が便利なのて , 多用して います。そのため , 今回紹介するユーティ リティて、ないと印字てきない原稿がけっこ うあります。 印刷ユーティリティ vp の使用法 プログラム ( 付録ディスク収録 vp を参照 ) の使用法を Fig. 1 に示します。 デフォルトて、はプリンタに出力しますが , 本スイッチを指定すると標準出力 ( スクリー ン ) に出力します。テキストべースて、出力す るため , 後述のビットイメージ出力の関係 のスイッチは無視されます。 罫線て、書かれた表を普通にプリントアウ トすると罫線がつながりません。本スイツ チを指定すると罫線をつなげて印刷します。 罫線はビットイメージて、印字するため , 印 ( 1 ) -s ( 2 ) -k 二重打ち文字を指定します。二重打ち文 ( 4 ) -w 縮小モードて、印刷します。 ( 3 ) -r 字速度は遅くなります。 字のプリンタの制御コードを始めに出力し ているだけなのて、ビットイメージ出力て、は 無効て、す。筆者はインクリポンが薄くなっ たときに本スイッチを指定しています。 ( 5 ) -x 漢字を高速て、印字します。漢字の印字が 少し粗くなります。 ( 6 ) ー 0 ページの右上にファイル名 , 印刷日時 , ページを印刷しません。 ( 7 ) -n 行の左端に行番号を印刷します。 改ページ動作に用紙送り文字 ( \ f ) を使用 します。 JIS 第二水準 ( ー j2 ) , NEC 特殊漢字 (-j3) を ビットイメージて、出力します。筆者の手元 にあるプリンタ VP ー 130K は , 第一水準の漢 字 ROM しか持っていないためにサポートし たスイッチて、す。最近のプリンタは JIS 第二 水準まて、標準て、持っていますから , ー j2 を使 ( 8 ) -f うことはないて、しよう。 Fig. 1 ESC / P プリンタ印刷ユーティリティ vp の使用法 vp [ ー sk xonfj く 23 > d くドット数 > p く行数 > l< 行数 > c く桁数 > t くタブ刻み > ] [ ファイル名 ] 新 MS-DOS プログラミング入門 85
亠「月や 0 」では 「 92 年度ベストパソコン大賞」の ユーサー投票を 行います ! 1992 年 10 月 17 日。ソフトバンクから駅モノを 主役としたまったく新しい大型パソコン総合 誌″「月刊 PC 」がテビューします。その創刊を 記念して、大々的にユーサー投票を行い、 92 年度の「ベストパソコン大賞」を選出します。 今年、数々のパソコン、ソフト、周辺機器のな かで、あなたは何を選び、何に感動しました か ? ユーサー 1 人 1 人のメッセージの集結 か、よりよいパソコンを育てます。新雑誌 PC の新しい試みにせひ、参加してください。 ンピュータの市場は複数のア、キアらチャが勢を競い合 うなかで、量大多様化に拍車みかかり、 , しよいよ混 沌としてきましもはやザ爿こは、自が使ってい くノヾソコンの真の姿が見えにくくなってきし ン関連製 品を購入して、ユーザに、必要な製品報 提供する 、合情報誌 " とし 、ソヾーソナル がテビューし 「 PC 」の主力特の通り ・毎号、 入可能な パソコン連の情をす・て ・話題 ヾソコン、 ソフト、一辺機器を 100 。以上 ュー 投稿ペー ストーちの参加」 ジを充 / 。・気軽 ィアで 実。・写真がキイでピジュカ 構成。 pcc は、号の年に費き 連製品のなかい 、読者ア冫 - トの計結そして集 ー , しギ五一 計データを。 たちによ る選考会 、コン、 ~ 、八一ドテ イスクカど、、ヤシルの ストロダーを選定 してしきます。 なお、ユーザー投票による トパソコン大」のノ ミネート発表は 10 月 17 日発売 号で、各シャ、ルのべ ストワンを決る部門賞およ トパソン大発表は 1993 年 1 月号 ( 12 月怛卩売 ) 、、行いま て投函お願いしす。 ストバ ばれつヾソコンまじめ、プ丿ンタ、 プ、表計算カど各種周辺器やア プリケ のモ = タ房募集しチす。表は 93 年 1 月 20 名以よ方にチャンがります くださし、」 ので、 郵便はがき 〒 108 お手数ですが 62 円切手を お貼り下さい 東京都港区高輪 2 ー 19-13 NS 高輪ビル ソフトバンク ( 株 ) 出版事業部 編集部行 月刊 PC 新雑誌「 PC 」の特徴 いまどんなノソコンを選べば良いのかよ、 性別 年齢 お名前 男性 女性 才 勤務先または学校名 ( 学部 ) ベストパソコン大賞 職種および役職 ( 技術、営業、事務、ほか ) こ住所〒 TEL ご使用のパソコン 自宅 勤務先・学校 刻 アンケートには豪華特典付き ! 趣味 パソコン経験年数 併読雑誌ベスト 3 ( 一般誌含む ) 投切り は 9 月 1 日です ( 当日第印有効 ) モニターを希望するパソコン関連製品 ( 例ハードティスクなど )
COMPUTER LANGUAGE 提携記事 C 十十に実装するメモリ管理機能 「リファレンスカウンティング」 。 Wh0's Minding the S 加祀 ? Reference 聞 ti C 十十 Bruce Ecke レ岩谷宏訳 .COM UTER LANGUAGE May. 1992 ) ポインタメンバだけを複写するとテータ本体はオリジナルの 1 個しかないという危険な状態への対策は ? C などの言語て、は , プログラマが自分の時 にガーベッシコレクションがない ことを知 っても , ばくは Smalltalk のプログラムに 間を費やして , あれこれ考えなければなら って , C 十十は欠陥言語だとよく言います。 よって制御されている飛行機には乗りたく ない細かい点を , C 十十て、は言語自体が相当 彼らの言い分にも , 一理はあります。 C 十十 ありませんね。 大々的に面倒見てくれます。て、すからプロ は , プログラマの無駄な負担をかなり取り さらに , ガーベッジコレクションといっ グラマは , プログラムの本質的な部分に専 去ってくれているのに , なぜ , 要らなくな ても , 方式がいろいろあります。あるアプ 念て、きます。て、すが C 十十は , メモリ管理に ったメモリの後始末のような細かい雑務を , リケーションに適した方式が , 別のアプリ 関しては何もしてくれません。メモリ管理 プログラマに強いるのか。 ケーションには適していない ということ とは具体的には , メモリの個々の断片を正 C 十十は汎用的な言語て、あり , ROM 化さ がありえます。て、すから , C 十十はガーベッ しいオーナーに割り当て , 不正な使用を防 れる組み込みシステムから , ワードプロセ ジコレクションを提供していませんけど , ッサや CAD システムのようなものに至るま それはプログラマが必要に応じて独自のも 断片を〔何らかの共用メモリプールへと〕 て、 , どんなアプリケーションて、も書けるよ のをインストールて、きるのて、す。それに 返却開放することて、す。 うに設計されています。そのような言語に 多くの場合 , その必要性がありません。と C 十十にあえてメモリ管理機能がないの こういう広い範囲のアプリケーション くに , C 十十を C の改良版として使っている は , は , すべての目的にとって最適の , 万能の のどこかの部分に悪影響を及ばすかもしれ かぎりは , 、、ガべコレ〃が課題になることは メモリ管理方式というものは存在しないか ないような , 特定の偏った仕様を持ち込む まずないて、しよう。何らかのメモリ管理が らて、す。しかし , この言語が持っている構 ことはて、きません。たとえばガーベッジコ 必要なときて、も , C 十十ならアプリケーショ 文を使って , プログラマが独自のメモリ管 レクタが便利だからといって実装すると , ンに最も適した方式を選べるのて、 , プログ 理系を作ることはて、きます。本稿て、は , リ ランタイムのそういう複雑な機構があるこ ラムの速度やサイズをむやみに犠牲にせず ファレンスカウンティング ( referencecoun とによって , C 十十を使えないアプリケー に済むて、しよう〔訳注 : LISP などのシステ ting, 参照計数 ) と呼ばれるメモリ管理システ ション分野がたくさん存在してしまうて、し ムは不意にガべコレを開始し , その間アプ ムを , C 十十て、作っていきます。 リケーションは無条件て、、、待たされる〃とい ガーベッジコレクタのある LISP や Small う場合が多い〕。 日語の欠陥か ? talk のような言語がとてもよく適したアプリ リファレンスカウンティングは , そうい ケーション分野もありますが , ( その擁護者 うメモリ管理方式の一つて、す。これを , リ ガーベッジコレクタ (garbage collectors, たちの言うこととは裏腹に ) どんなアプリケ ファレンスカウント方式のガーベッジコレ 不使用メモリを自動的に見つけて開放する ーションにも向いているわけて、はありませ クション〔訳注 : 本稿て、述べられるリファ 機能 ) を持っている言語て、プログラミングを ん。こフいフロⅱロ , 衄がぜったいに使えない レンスカウントを , ガべコレの動作のため している人々は , C 十十のような高度な言語 分野もあるのて、す。たとえば , 誰が何と言 の制御変数として使う方式〕と混同しない ぐこと , そして用が済んだら , そのメモリ 14 C MAGAZINE 1992 9
COMPUTER LANGUAGE Mar. 1992 をド血い暉咄、 P. J. PIauger 野口修男訳 / 福富寛監訳 『 RemediaI software engineering 』 大学講師事始 昨年 1 年間 , オーストラリアのシドニ あるニューサウスウェールズ大学て、ソフトウ ェア工学を教えてきた。私がアカデミックな 生活をしたのは , 20 数年前に博士号を取得し たとき以来のことだ。実はオーストラリアて、 生活してみたいと思っていたのて、 , ちょうど よい機会だった。この仕事が終わってまたフ リーの物書き生活に戻れたのもうれしいが , キャンパスて、の 1 年間も楽しかった。 子習思欲のある若者を見るのは気持ちのい いものだが , 現代の若者は読者や私ほどには 勉学に専念していないようだ。ビールは飲む し講義の最中に居眠りはするし課題の結 果もひどいものばかりだ。それて、もたまには フラストレーションを解消してくれるヾなる ほど〃と思えることもあった。私の年齢ぐら いになると , そんなちょっとした、、補償クがあ るだけてもうれしい 教えることは自分が知らなかったことを学 ぶにも役立つ。 10 年以上前からいろいろ主張 してきたことを集めた , 数百ページもの講義 草案を携えてキャンパスへ向かった。しばら くすると , どの部分が評判よくて , どれが見 当違いだつのかがわかった。数百ページもの 草案を修正し , 再び黒板に戻った。 最初の学期 , 私はソフトウェア工学の上級 コースを教える 3 人の講師のひとりてあっ 。 170 人を越える学生の中には , 英語を母 10 C MAGAZINE 1992 9 国語としない者も多かった ( オーストラリア の学校は , アジアからの移住者や海外からの 留学生に大変人気が出てきた ) 。そのため私 のダジャレも空回りしてしまった。て、も , 方て、は私の考えをさらに明確かっ単純に表現 する必要も認識て、きた。 そのときの私の仕事は , 従来からある構造 解析テクニックを教えることだった。テキス トは ( あらかじめ決められたものだったが ) T om DeMarco の秀作「 Structured Analysis a nd System Specificati on 』 ( Yourdon Press, 1978 ) だった。て、も , 講義内容が DeM rco の 主張から離れることもしばしばだった。ご存 じのように , この話題になると私は自分自身 の考え方を従来から主張してしまラ 9 しかし大きなクラスからのフィードバック は限られたものだった。このクラスて、は , 学 生 3 人を 1 組とした各チームが解析プロジェク トに 1 学期かけて取り組んだ。彼らがデータ フローとそれに関連した解析テクニックを , そのプロジェクトにどのように適用したか を , 初期に提出させたレポートと最終的なレ ポートからチェックした。また宿題と学期末 テストの問題を書き採点もしたし , 学生から の多くの質問にも答えた。 その結果私が学んだのは ( ないしは思い出 したのは ) , データフローダイアグラムを書 くのには職人芸的な要素 , つまり言葉て表現 てきない曖昧な要素が必要だというこ 、 0 問題が複雑だと , 60 組の学生が 60 種類のダイ アグラムを作ることもある。それらの多くが 正しいことは確かだが , エレガントといえる ものは数えるほどしかない。エレガントな方 法を教えるのは , 機能的な構造 ( 仕組み ) を教 えるのと同じように大切なはずだ。 もうひとつ学んだことがある。学生は自分 が知っていると思い込んて、いるだけて、 , 実際 はほとんど理解していない 学生の多くはカーナウ図表 (Karnaugh ma p ) やデシジョンテープル , そして状態遷移図 のコースをすてに受けていた。て、もそれらの 適用方法を、、本当にク理解しようと悩んだ者は ほとんどいなかった。その代わり私の講義て、 それらを復習しても , 多くの学生は退屈さを 我慢していた。以前のコースて、の経験は , ち ようど抗体を作るのに十分な程度だったのだ ろう 私が教えようとしたことによって , このよ うな障害が取り除かれればよいのだが。学生 は十分その危険性を学んだことだろう。私 は , 少なくとも , 楽しむことがて、、きるように 矯正ソフトウェア工学 第 2 学期はもっと楽しかった。大学院 1 年生 を対象とするセミナーを受け持った。成績優 秀者や大学院生が 50 人近く出席した。その多 くが私のダジャレを理解したが , 理解てきな い者もいっしょに笑う程度には慣れていた。 月曜の夜 6 時から 9 時まて、が講義時間だった ( よいのやら悪いのやら ) 。
日 EFCOUNT の出力結果 z in ¯horse(): before A + C B : contents Bstuff ・ A: contents Astuff After g(B) contents Bstuff ・ before decrement for B: T in ¯horse(): contents Bstuff ・ before decrement for B : T in ¯horse(): B : contents Bstuff ・ A : contents Astuff ・ inside g() B: contents Bstuff A: contents Astuff ・ after horse C = A; B : contents Bstuff ・ A: contents Astuff ・ after horse A, B; List 1 refcount refcount refcount refcount refcount refcount refcount refcount refcount refcount 1 1 2 1 2 2 3 2 2 1 before decrement for result of A + A: contents Astuff Astuff ・ refcount 1 destroying physical rep for result Of refcount 0 contents Astuff Astuff ・ After A + C A: contents Astuff refcount 2 B : contents Bstuff ; refcount 1 before D ニ A + B destroying physical rep for D: contents Dstuff; refcount 0 Z in -horse() : before decrement for result Of A + B: contents Astuff Bstuff refcount 2 After D ニ A + B A: contents Astuff ; refcount 2 B: contents Bstuff ・ refcount 1 result of A + B: contents Astuff Bstuff ・ D in ¯horse(): before decrement for result of A + B: contents Astuff Bstuff ・ refcount 1 destroying physical rep for result Of A + B: contents Astuff Bstuff ・ refcount 0 refcount するのがもっとも一般的なやカ方て、す ) 。 のとき , リファレンスカウントが , g( ) をコ ールする前の値に戻っています ( これは良い 兆候て、す ) 。 A 十 C のコールは , 使われないテンボラリ を作ります。新たな cart も作られますが , そ れはうまい具合に このテンボラリが破壊 されるときに破壊されます (Z というタグ は , cart を指すポインタを取るコンストラク タが , operator 十 ( ) の中て、使われた , とい うことを示します ) 。しかし , D = A 十 B が実 行されるときは , テンボラリは D への代入に 使われるのて、 , 破壊されません。 最後に , すべてのデストラクタが , オプ ジェクトが作られたときと逆順て、呼び出さ れます ( この順序はコンパイラ作家が決めて よい ) 。 C のためのデストラクタが呼び出さ れると , それはただ , A の物理的表現の refcoun t をデクリメントするだけて、 , それを破壊はし ません ( まだ A がそれを使っているから ) 。 今回は , リファレンスカウンティングと いう方式の , ほんの表面に触れただけて、す。 もっといろんな式を書いてみて , コンパイ ラがそれらを評価するとき何が起きている か調べてみてください くすべてのクラスに り込む必要はない , これから書いてい このテクニックを盛 ことはお分かり 1 C in -horse(): before decrement for A: contents Astuff ・ refcount 2 B in -horse(): before decrement for B : contents Bstuff ・ refcount 1 destroying physical rep for contents Bstuff ; refcount 0 A in -horse() : before decrement for A: contents Astuff : refcount 1 destroying physical rep for contents Astuff ・ refcount 0 B : A: て、しよう。しかし , これが必要なときには , 実にこたえられないほど便利なテクニック て、す ( 信じられない人は , このコードの mul e のバージョンを動かして見てください ) 。 Bruce EckeI 氏は , fThinking in C 十十』 (Prentice HaII, 1993 ) の著者て、 , 本稿は同 書からの転載て、ある。また彼は , ℃十十 lnside & Out 』 (Osborne/McGraw-HiII, 1992 ) の著者て、もあり , こちらは fUsing C 十十』という本の第二版て、ある。彼は AN SIC 十十委員会の投票メンバーて、あり , TT he C 十十 Report 』誌の特集記事担当編集 員 , そして C 十十のコンサルティングを専門 C + + に実装するメモリ管理機能「リファレンスカウンティング」 ある。 とする Revolution2 という会社のオーナーて 21
SEP. 1992 VO 4 NO. 9 CONTENTS 。 4992 年 9 月町旧 ( 毎月卩回一日発行 ) 第 4 巻第 9 号通巻 36 号ヨ 990 年 2 月 2 日第 3 種郵便物認可 ~ Programming on Purpose ・・・ Remedial software engineering 』 P. J. PIauger C 十十に実装するメモリ管理機能「リファレンスカウンティング COMPUTER LANGUAGE 提携記事 Who's Minding the Store? Reference Counting in C 十十 フリーソフトウェア最新レポートく第 33 回〉 Wind 。 ws ソフトウェア大特集野口雄平・・ Book Review 。 = BorIand C 十十阨れ 3 - 0 研究 プロローグ・ Turbo C から Borland C 十十へ大野元久 Part1 ・ BorIand C 十十 Ve 「 . 3.0 の機能天元広海 / 山本浩文 Pa 2 ・ Application Frameworks の中核 rObject Windows 」「 Turb0Vision 」倉橋浩ニ Pa 3 ・ Windows 専用開発環境「 Tu 「 bo C 十十 for Windows 」白倉伸一郎 Pa 4 ・ Bo 日 and ノヾージョンアップ事情桜木涼一郎 実践アルゴリズム戦路解法のテクニックく第 5 回〉再帰降下型構文解析松田晋 フォーマットトランスレータロ apan2HD 」橘家鶴蔵 特別記事 実践 C プログラミンク入門く第 6 回〉ポインタ ( 続 ) , 情報処理試験予測奥村晴彦・ Step by Step 新 MS- DOS プログラミンク入門く第 24 回〉プリントアウト中島信行・ C プログラマのための 十十く第 3 回〉クラ = 機構 ( その 2 ) ークラ = とその周辺ー白倉伸一郎・山本浩文・ ・・ 92 むすかしなからトシりましたく第 34 回〉 Th 。 se watchdogs of status Quo 岩谷宏・・ ・・・ 101 C 言語フォーラム プログラミングの工ッセンスく第 8 回〉名前をつける結城浩・ アルゴリスムとテータ構造入門く最終回〉総まとめ近藤嘉雪・ ・・ 113 D r. 望洋のプログラミング道場く第 2 回〉見えなし江ラー柴田望洋 難問回答 三田典玄のランタムアクセスく第 1 5 回〉互換機の行方・・ ・・ 126 痛快工ッセイ の道具箱く第 27 回〉レーサプリンタの制御⑤豊国永健・ 128 応用 C 言語 C 言言吾雑学言冓座く第 1 8 回〉ファイル名の処理乗松保智・ ・・・ 134 ワンポイントプロクラミング講座く第 22 回〉一度にたくさんのファイルを読み書きする・ ・・ 138 GCC Ver. 2 の移植と G 十十く第 4 回〉 2.1 移植リポート 2 吉野智興・ ・・・ 141 X68k 活用講座 C MAGA News Square ・ ・・・ 148 lnformation from Compiler Makers マイクロソフト フィンローダのあっぱれこ意見番く第 5 回〉「ソフトウェアは誰のもの ? 」・・ ・・・ 152 lnformation from Compiler Makers 工ル・エス・アイジャノヾン / ライフホート・・ C マガ電脳クラブく第 1 8 回〉母子の情吉柄貴樹・ ・・・ 156 lnformation from Compiler Makers 富士通 / システム・ワン・・ ・・・ 158 円羽信夫の迷走プログラミングくその 9 〉朝に道を聞かばタベに死すとも可なり・・・ ・・・ 160 ・・・・ 162 lnformation from CompiIer Makers ホーランド・・ ・・・ 164 Readers' Room ・ ティスク内容のお知らせ ・・・ 167 ・・・ 168 EDITORS' ROOM ・本記事中のプログラム名 , システム名 , CPU 名は一般に各メーカーの登録商標です。本文中では TM , ⑧マークは明記していません。 ・本誌および付録ディスクに掲載されたすべてのフ・ログラムは著作権法上 , 個人で使用する目的以外で無断で複製することは禁じられています。 表紙・イラストレーション・秋山育 / デザイン・持田哲 publishe 「 : Masayoshi Son Publishing Director: GO 「 0 HashlmOtO Edltor-jn-Chlef. Shimchi HOShlno Manager Of sales and Advertising. YOShiO GOShima EditoriaIand Business 0ffices: NS Takanawa 引 dg.. 2-19-13. Takanawa. Mlnat0-ku. TOkYO 108. Japan EditoriaI: Phone ( 03 ) 5488-1318 sales: Phone ( 03 ) 5488-1360 Advertising T0kYO Phone ( 03 ) 5488-1365 Osaka Phone ( ) 264-1471 copyright ⑥ 1992 SOFTBANK CO 「 p. TOkyo. AII rights reserved. NO matenalin thlS publlcation may be reproduced. ⅲ whOle 0 「 in part• in any form without permission. Printed in Japan. ・・・ 22 24 ・・・ 26 C MACAZINE
,ho's Minding the S ? Reference 聞 ti 叩 ln C 十十 名前やリファレンスて、引数を渡すときは , オプジェクトのアドレスを渡しているのて、 す。両者〔名前渡しとリファレンス渡し〕 の唯一の違いは , 名前渡しの場合 , コール 側がオプジェクトのアドレスを明示的に生 成し , そしてコールされた関数側は , その アドレスからの明示的な逆参照によってオ プジェクトにアクセスする , という点だけ て、す。 オプジェクトを渡す リファレンスて、渡すときはにれは C 十十 と Pascal にしかない機能 ) は , アドレスの生 成やそのアドレスからの逆参照を , コンパ イラがプログラマに代わってやってくれま す。つまりリファレンスは , 間違いを防ぐ ための便宜的な表記法て、す。名前渡しやリ ファレンス渡して、は , オプジェクトの複製 づくりに関連した問題は生じません。なぜ なら , つねに唯一のオプジェクトしか存在 していないからて、す。ただ単に , それのア ドレスを渡しているだけだからて、す。 値て、渡すときには , コール側の関数の中 て、オプジェクトのコピーを作ります。関数 の返し値として値返しをするときは , コー ルされた関数の外部に , オプジェクトのコ ヒ。ーが作られます。単にオプジェクトのア ドレスを渡すのて、はなく , オプジェクト全 体のコヒ。ーを作るのて、す。 char や int のよう な内蔵型のオプジェクトを渡すとき , ある いは , 固定サイズの単純なオプジェクトを 渡すときには , コンパイラにもオプジェク トの大きさが分かり , それをスタックを介 して渡すコードを作ります。 しかし , 複合型オプジェクトの場合は , コンパイラは物理的表現に関して何も知り ませんから , オプジェクトの固定サイズの 部分を渡すことしかて、きません。このとき , 物理的表現をポイントしているポインタも コヒ。ーされるのて、すから , べつに問題ない 16 C MAGAZINE 1992 9 じゃないか , と思われるて、しよう。つまり , 関数の中て、作られたオプジェクトからも , 物理的表現にアクセスて、きます。 しかし , 関数内部のオプジェクトが〔通 常のスコープルールに従って〕破壊された ときには , 問題が起きます。コンストラク タを適切に書いておいたなら , そのデスト ラクタがコールされたとき , 物理的表現も 掃除されるはずて、す。ところが , その物理 的表現は , 今二つのオプジェクト ( 関数の外 にあるオリジナルのオプジェクトと , 値渡 しによって関数内部に作られた新しいオプ ジェクト ) が使っています。関数内部のオプ ジェクトに対してデストラクタがコールさ れたとき , 物理的表現も清掃されてしまい , そうすると関数の外のオリジナルのオプジ ェクトにとっても ( 悲しいかな ) 物理的表現 が破壊されてしまうのて、す。オリジナルの ほうはまだ必要という場合にもて、す。 同様に , オプジェクトを値返しするとき は , オプジェクトが関数の外へコヒ。ーされ , ローカルなオプジェクトは破壊されます。 そうすると , 関数の外部て、使われるはずの 物理的表現まて、 , 破壊されてしまいます。 どちらの問題も , プログラマが明示的に指 定しないときにはオプジェクトの渡しや返 しをコンパイラが勝手に行なう , という点 に原因があります。コンパイラは , プログ ラマの心の中まて、は読んて、くれません。 解決策は , プログラマが明示的に , コヒ。 ーコンストラクタというものを書くことて、 す。この特殊なコンストラクタは , オプジ ェクトが値渡しまたは値返しされるとき , あるいはテンボラリオプジェクトが作られ るときだけ , コンパイラがコールします。 コピーコンストラクタは , 自分のクラスの オプジェクトのリファレンスを一つだけ , 引数として取ります。 たとえばクラス X の場合は , X(&X) のよ うな形になりますにのクラスのオプジェク トからこのクラスのオプジェクトをもう一 っ作れという意味 ) 。コピーコンストラクタ を書かすに , オプジェクトの値渡し ~ 値返 しをしようとすると , コンパイラはしかし 何らかのコヒ。ーコンストラクタを必要とし ますから , 勝手にそれを作って使います。 単純なオプジェクトの場合はそれて、も間に 合いますが , オプジェクトが複合型 ( ポイン タを含むもの ) て、あるときは , 上のような問 題が起きるのて、す〔訳注 : プログラマが明 示的に書かなかった場合のデフォルトのコ ピーコンストラクタの振る舞いは不定。た いていの場合は , 単に固定サイズメンバの ビットごとのコピー ( 丸写いを行なうもの と想定される ( そういう前提て、書いてある文 献が多い ) 。たとえば Borland C 十十 Ver. 2.0 のマニュアルは , デフォルトのコヒ。ーコ ンストラクタの動作内容を明記していない 参考資料は , 『 C 十十 : C プログラマのための 実践ガイド』 8 章 6 節 ( ソフトバンク刊 ) , そ して fAdvanced C 十十 Prgramming StY les and ldioms 』 (). O. Coplien, Addison -wesley, 1992 年 ) の第 3 章〕。 コンパイラにコヒ。ーコンストラクタを勝 手に作らせないためには , プログラマが自 分て、書けばよいのて、す。コンパイラは , 明 示的に定義されているコピーコンストラク タがあることが分かると , そちらを使いま す。 コピーコンストラクタの作り方は , 後て、 サンプルプログラムの中て、リファレンスカ ウンティングを使うときに見ていきます。 テンホラリオプジェクト コンノヾイラカ , ソースプログラムをコン パイルするときの便宜のために作るオプジ ェクトが , テンボラリオプジェクトて、す。 たとえば , 関数からオプジェクトが値返し されていても , コンパイラにはそのオプジ ェクトの行き先が分からないことが多いて、 しよう。そこて、コンパイラは , テンボラリ
PC ー 9801 シリーズて、一 j3 を指定すると半角 罫線などの PC ー 9801 シリーズ独自の半角漢字 ( 1 の -d を印字て、きます。 ビットイメージモードのドット数を指定 -d9 -d8 します。 ( 16X24 ) ー d24 : 24 ピンビットイメージモード ( 16X16 ) ー d16 : 24 ピンビットイメージモード : 9 ピンビットイメージモード : 8 ピンビットイメージモード 出力します。 デフォルトて、は漢字コード ( JIS コード ) て、 指定て、き , 省略値は 66 ( 66 行 x ( 1 / 6 ) インチ = 行単位ページ長を指定します。 1 ~ 127 が ( 11 ) -p ポートすることは難しくないて、しよう。 ティを拡張して IBM - PC 用のプリンタをサ カタカナは印字て、きません ) 。本ユーティリ が印字て、きるかもしれません ( ただし , 半角 リンタが標準なのて、 , ー d9 を指定すれば漢字 せんが , IBM-PC 用のプリンタは ESC/P プ タて、は印字て、きません。確認はしておりま いるため , MP-80 などの初期の 9 ヒ。ンプリン して ESC/P 09 ー 81 の制御コードを使用して 確認は行っていません。 ESC / P のレベルと は RP ー 80 がすて、に手元になかったため , 動作 すが , 本ユーティリティを作成したときに ーティリティて、サポートしていたモードて、 -d9 は本ユーティリティの前身になったユ ードて、す。 あげることがて、きるため , サポートしたモ 極端に遅くなりますが , 縮小度をもっとも イメージて、出力します。ー d16 は印字速度が ANK コード ( 英数字カタカナ ) ともにビット メージて、出力しますが一 d16 は漢字コードと -d8, -d9, ー d24 は漢字コードをビットイ TabIe 1 1 行に印字可能な文字数 ( 半角単位 : キャラクタ / ライン ) スイッチ - d24 -d 1 6 -d8 -d9 ー「 d24 ー「 dl 6 - 「 d8 ー「 d9 15 インチ 1 63 1 63 204 1 63 272 272 306 272 10 インチ 108 108 136 108 180 180 204 180 A4 99 99 124 99 1 64 1 64 186 1 64 縦罫線連続 スイッチ -k なし ヨ 74 ヨ 74 ヨ 74 不明 ヨ 74 ヨ 74 不明 11 インチ ) て、す。 A4 11 . 5 インチ 12 インチ ( 12 ) ー ー P69 or ー P70 ー P69 ー P72 のデフォルト値は 62 行てす。 のファイルて、は 4 , これら以外のファイルが フォルト値は , 拡張子が . c ? ? , . h, . k ? ? タブ刻み幅を指定します。タブ刻み幅デ ( 14 ) -t フォルト値は 163 カラムて、す。 1 行当たりの桁数を指定します。桁数のデ ( 13 ) -c 77 行 ( ー d16 の場合 111 行 ) としています。 るときに使っています。 1 ページ最大行数は ます。 1 ページ単位のファイル原稿を印字す する前に行数を数えて改行ピッチを計算し ー 10 は非公開のスイッチて指定すると出力 ( 15 ) -h ー ? 8 となります。 手を抜いています。 からのファイル入力は使うことがないため , 能しません。対応は可能て、すが , 標準入力 判定て、標準入力を読んて、いるためうまく機 皿 + 囮による中断機能と起動時の機種 この機能は不完全て、す。十回 , 標準入力から入力するモードになりますが , ファイル名が指定されなかったときは , 皿十囮を入力してください。 て、起動したときは皿十回または -TOWNS て、プリンタケープルを接続しない グラムを終了します OIBM- ・ PC 互換機や FM または皿十囮のキー入力があるとプロ ードも使用可能て、す。印字中に皿十回 ファイル名は複数指定て、き , ワイルドカ 簡単なヘルプメッセージを表示します。 1 行に印字可能な文字数を TabIe 1 に示し ます。縮小モードは大きな表を 1 枚の紙に印 刷するときに便利て、す。 印刷ユーティリティ vp の使用例 ( 1 ) vp ー f 可 3 ワ 0C108 file 10 インチの用紙に行番号をつけて印字す る例て、す。 JIS 第一水準と JIS 第二水準の漢 字コードは JIS コードて、出力しますが , NE C 特殊漢字はビットイメージて、出力します。 ( 2 ) vp -rfnj3170c180 file 10 インチの用紙に行番号をつけて縮小印 字する例て、す。 ( 3 ) vp -rfnj3170c132d9 file 9 ヒ。ンプリンタの RP ー 80 用の例て、す。 ( 4 ) vp ー 0fj3p6 引 0c99 file A4 用紙に 1 ページずっ印字する例て、す。 ( 5 ) vp ー rofj3p6 引 0C165 file A4 用紙に 1 ページずつ縮小印字する例て、 す。 印刷ユーティリティ vp の説明 機種依存部の判定と 1 バイト出力 機種依存部の判定とプリンタ 1 バイト出力 に関しては 1992 年 5 月号の特集て、説明してい ますから , 今回は省略します。 ・罫線コードについて パソコンの漢字コードには大きく分ける 1 ページ当たりの行数を指定します。行数 86 C MAGAZINE 1992 9