30 ■ ーロプ 巻イピ ーオプジェクト指向リレーショナルテータベースシステム開発者 があるのて、 , Smalltalk プログラマになる と , 書く時間より読む時間が増えることに なります。 ライプラリはどの Sma 肚 a ⅸにも付属し ているのですか ? Steiger はい。 Smalltalk 市場は成熟し始 め , 製品ラインアップも充実してきました。 基本システムには , 350 のクラスと 5 , 000 の メソッドが付属しています。追加パッケー ジを購入すれば , さらに多くの機能が手に 入ります。グラフィカルューザインタフェ イス , データベースインタフェイス , コー ド管理ツール , 統計パッケージ , エキスパ トシステムシェルなどて、す。 Sm 訓 ta ⅸには標準規格はあるのです Steiger 必ずしもありません。 Smalltalk はふたつのべンダーから発売されている点 に注意してください。ノヾークプレース・シ ステムズとデジトークて、す。どちらの製品 もプログラミング言語そのものは同一て、す。 ウ内の表示が独特て、すが , ParcPIace Sma しかし , 両社はかなり独自規格を定めてい lltalk は , さまざまなウインドウシステムに て , 一方の環境から他方にアプリケーショ ンを移植するのは容易て、はありません。 収まるように また , 幅広いプラットホー ムに移植て、きるように うまくエンジニア デジトークはゼロックスから Smalltalk 言 リングされています。しかし , ウインドウ 語のライセンスを受けているはずて、す。た Steige 「さんはゼロックス社からスピン の中身は紛れもなく SmaIItaIk て、す。 SmaII だ , そこからの具体化の方法が両社て、は非 オフした Sm 訓 ta ⅸと市販データベースシス 常に異なっています。たとえば , クラスラ テムをリンクするデータベースゲートウェ talk は , 各環境の中て、動く開発ツールのセッ イプラリがかなり違いますし , グラフィカ イ研究を指揮されましたが , データベース トを備えていますから , 単なる言語て、はな ルューザインタフェイスも大いに異なりま く , 開発環境て、もあるわけて、す。標準のプ ゲートウェイについてお話をうかがう前に す。私はあまりよく知りませんが , デジト 今日の Sma 此 a ⅸについて少し説明していた ラウザ , デバッガ , インスペクタなどのツ ールがあり , プログラミング環境は非常に ーク製品は , Windows, Macintosh, OS/ だけませんか ? Sma 肚 a ⅸは言語であり , 整っています。ライプラリも豊富に用意さ 2 PM などをカバーしているようて、す。 かっユーサ環境なのですね ? れてます。すて、に膨大なソフトウェア資産 方 , Steiger そうて、す。 SmalltaIk はウインド ノヾークプレース・システムズ製品は , オプジェクト指向言語 S m allt alk 10 C MAGAZINE 1993 2
2 Step by Step C プログラマのための C 十十入門講座 C 言語フォーラム 難問回答 痛快工ッセイ X68k 活用講座 巻頭インタピュー COMPUTER LANGUAGE 提携記事 COMPUTER LANGUAGE 提携記事 djgcc 詳解講座 Vol. 5 No. 2 FEB. 1993 C 十十の演算子オーハロート。「。 c + + The Booch Method : Notation, Part Ⅱ プーチ法の表記法 ( 後編 ) ProgrammIng on Purpose rcriticismJ p. J. Plauger R ichard Steiger ( 2 ) テーー。 , テム開発者 CONTENTS フリーソフトウェア最新レポートく第 37 回〉 FI ゲームで楽しもう野口雄平・・ 。 = 通信プロトコル研究 フィンローダ 高速テータ転送を可能にする通信規約の実際 Part 1 ・通信プロトコルの基礎知識 Part 2 ・主要通信プロトコル仕様概説 Part 3 ・通信プロトコルを実現するプログラミング 速報 WATCOM C / 386 J9.0 山口誠之 H 0 GCC W0 く第 13 回〉ピット操作クラスとべクタクラス安田英之 実践アルゴリズム戦略解法のニックく第 1 0 回〉ノヾックトラック法の高速化 ( 2 ) 松田晋 新 MS - DOS プログラミング入門く第 29 回〉ノヾイプ機能の高速化 ( 中島信行 実践 C プログラミング入門く第 1 1 回〉構造体奥村晴彦 Try The C 十十く第 8 回〉クラスライフラリ ( その 1 ) st 「 eam ~ コンテナクラスライフラリ山本浩文・白倉伸一郎 恥すかしながらドジりましたく第 39 回〉遅れてやってきた岩谷宏 プログラミングの工ッセンスく第 1 3 回〉「まとめ」結城浩 D r. 望洋のプログラミング道場く第 7 回〉線形リスト ( 1 ) 柴田望洋・ ー田典玄のランダムアクセスく第 20 回〉ふつうの人のノヾソコン文化の話・ ANSI C more く第 17 回〉「定数」きだあきら GCC で学ぶ X68 ゲームプログラミングく第 1 5 回〉 BG 画面を使ってみましよう ( l) 通信ソフト「 WTERM 」開発記 C MAGA News Square ・ lnformation from Compiler Makers マイクロソフト・ フィンローダのあつばれご意見番く第 1 0 回〉「微妙な構造」 lnformation from Compiler Makers 工ル・エス・アイジャノヾン / ライフホート C マガ電脳クラブく第 23 回〉マッチング・ノヾズル吉柄貴樹 吉野智興・ 特別記事 lnformation from Compiler Makers シャープ X グループ / テック情報システム・・ 円羽信夫の迷走プログラミングくその 1 4 〉伊香保ての c ~ ポインタの配列 lnformation from CompiIer Makers ボーランド Readers' Room ティスク内容のお知らせ EDITORS' 日 00M ・本記事中のプログラム名 , システム名 , CPU 名は一般に各メーカーの登録商標です。本文中では TM , ⑨マークは明記していません。 Editorial: Phone ( 03 ) 5488-1318 sales: Phone ( 03 ) 5488-1360 Advertislng. T0kYO. Phone ( 03 ) 5488-1365 Osaka. Phone ( ) 264-1471 EditoriaI and Business 0ffices: NS Takanawa 引 dg.. 2-19-13. Takanawa. Minato-ku. TOkYO 108. Japan publisher: Masayoshi Son PubIiShing Director: GO 「 0 Hashimoto Editor-in-Chjef: Shinichi HOShino Manager Of Sales and Advertising. YOShiO Goshima 表紙・イラストレーション・秋山育 / テサイン・持田哲 ・本誌および付録ディスクに掲載されたすべてのプログラムは著作権法上 , 個人で使用する目的以外で無断で複製することは禁じられています。 ・・・ 34 ・・ 99 ・・・ 176 ・・・ 175 ・・・ 172 ・・・ 170 ・・・ 168 ・・・ 166 ・・・ 162 ・・・ 160 ・・・ 158 ・・・ 156 ・・・ 145 ・・・ 140 ・・・ 130 ・・・ 128 ・・ 116 ・・・ 112 copyright ⑥ 1993 SOFTBANK CO 「 p. TOkYO. AII rights reserved. NO materialin this publication may be reproduced. in whOle 0 「 in part' in any form without permission. Printed in Japan.
「定数」 N 引 mo 第 17 回 今回は , 初歩的ではあるか , 意外に見落としがちな「定数」 きたあきら に関する話題について研究してみよう。 定数とは ANSI C て、呼ぶ定数 (constant) とは , 以下 に示す 4 個て、ある。 浮動定数 (floating-constant) 整定数 (integer-constant) 定義から , 次の表現はすべて正しい浮動定 (ANSI 3.1.3.1 , 一部補足あり )0Fig. 1 の 浮動定数の文法を Fig. 1 に示しておこう 浮動定数 に属している。 の「定数」はすべて算術型 (Arithmetic type) とに注思。これら 数には含まれていない 文字列定数 (string-literal) は , 文法上定 文字定数 (character-constant) 列挙定数 (enumuration-constant) 念のため浮動定数の表している値に 3.14e56L .4e 十 2F 1e3f 1e2 1 . 数て、あることがわかる。 ーっい 3.14e ー 6 という浮動定数は , 3 .14X 10 ー 6 という値を意味している。指数部が省略さ れていたら , >< 1 という意味て、ある。 文法的に見ると , C の浮動定数の文法は比 較的広い自由度を持たせているといってよ 。とくに小数点 (. ) の前後には , 必ずしも 数字を指定する必要がない。これは FORT RAN や Microsoft 系の BASIC と同じて、あ り , ISO-PascaI とは違っている。 Pascal て、 は前後には必ず数字が必要て、ある。 さらに「 1e2 」のように , 小数点をまったく 含まなくても , 指数が含まれていれば浮動 定数て、ある ( ただし , 浮動定数て、あるために Fig. 1 浮動定数の文法 小数定数指数部 0 浮動定数 . は , 少なくとも小数点 , あるいは指数部の どちらか一方は含まれていなければならな 最後に , 末尾には浮動サフィックス f , F および 1 , L をつけることがて、きる。サフィ ックスは FORTRAN や Pascal にはなく , れは C の特徴のひとって、あるといえよう。 C 浮動サフィックス opt とえば scanf や printf を始めとする入出力関 ラリ関数を利用することて、変更て、きる。た して何を用いるかは setlocale というライプ また , 実行環境において小数点の文字と の点に注意を払う必要がある。 る場合には , 字旬解析部分においてこれら かの処理をするようなプログラムを開発す のソースプログラムを読み取って , なんら 数字列指数部浮動サフィックス opt 小数定数 . 数字列 0 ・数字列 数字列 . 指数部 . e 符号 opt 数字列 E 符号 0 数字列 符号 . 次のうちのどれかひとつ 十 数字列 : 数字 数字列数字 浮動サフィックス : 次のうちのどれかひとつ 数字 : 次のうちのどれかひとっ 0 1 2 3 4 5 6 7 8 9 て述べておくと , 130 C MAGAZINE たとえば , 1993 2
問題の解決法 たとえば , 次の問題を考えてみよう。 【問題】 100 点満点のテスト ( 点数は 0 か ら 100 まて、の 101 種類の整数値のみとする ) の点数を格納した配列 x のソートを行いた いとする。どのようなソートアルゴリズ ムを利用するか ? 一般的にはクイックソートが ちなみに もっとも高速なアルゴリズムて、あることは 知っているだろう。みなさんは , クイック ソートを使うだろうか ? もちろん , 点数の分布状況などの条件に よって , 同じアルゴリズムて、も , 実際の計 算所要時間は異なるため , 一概には結論を 下すことはて、きない。人数が少ない ( 配列 x の大きさが小さい ) かぎりクイックソートて、 もかまわないのだが , ある程度以上の人数 て、あれば , この種の間題て、あれば , クイツ クソートよりも , いわゆる度数ソートのほ うが高速にソートを実行て、きる。 この例て、わかっていただきたいのは , 【超重要】真に万能なアルゴリズムな りデータ構造なりは存在しない ということて、ある。少して、も問題が異なれ ば , 最適なアルゴリズムやデータ構造も変 わってくるて、あろうし , 本質的には同じ間 題て、も , 問題の大きさ ( データ数など ) によ って , 最適なアルゴリズムやデータ構造 ( ま たは , それらの実現法 ) も変わるものて、ある。 大石さんは , 「この問題には線形リストは 使えないだろうか ? 」との疑問を持たれてい = ユーザ入力箇所 . 7 Fig. 5 Fig. Fig 6 List 1 のプログラムの実行例 ( 1 ) 先頭に要素を挿入 ( 3 ) 先頭の要素を削除 ( 5 ) すべての要素を削除 1 ( 2 ) 末尾に要素を追加 ( 4 ) すべての要素を表示 ( 6 ) 処理終了 挿入するテータを入力して下さい 番号 : 名前 : 一 ( 1 ) 先頭に要素を挿入 ( 3 ) 先頭の要素を削除 ( 5 ) すべての要素を削除 ( 2 ) 末尾に要素を追加 ( 4 ) すべての要素を表示 ( 6 ) 処理終了 追加するテータを入力して下さい 番号 : 名前 : 一 ( 1 ) 先頭に要素を挿入 ( 3 ) 先頭の要素を削除 ( 5 ) 全ての要素を削除 【一覧表】 2 lkeda 1 Miyama ( 1 ) 先頭に要素を挿入 以下 ' 次のプロックへのポインタ 確保したメモリプロック ヒープ領域の概路図 ( 一例 ) ( 2 ) 末尾に要素を追加 ( 4 ) すべての要素を表示 ( 6 ) 処理終了 ( 2 ) 末尾に要素を追加 プロックの大きさなどに関する情報 top 配列による線形リスト 、 0 言て、答えると , 『使えない』のて、はな 0 1 2 3 4 3 2 1 Mitsuru lketaka lkeda Miyama 3 0 1 ー 1 く , 『不向きて、ある』ということになる。 124 C MAGAZINE 1993 2 さて , 大石さんの目的に完全には一致し 配列を使おう 酉列による線形リスト 配列の添え字
て、はクイーンを左から順に置いていきまし たが , 左から順というのは必ずしも最良の 試行順序て、はなく , もっと効率のよい試行 順序が存在します。また , ある列の上て、ク ィーンを置く位置を決めるときは , 条件を 満たす位置を探し回るのて、はなく , もっと ダイレクトにクイーンを置ける位置を求め る方法が存在するはずて、す。具体的な方法 概略設計 については次節て、検討します。 度に決めることはて、きないのて、 , 順に詳細 ければならないことがあります。全部を一 ムを設計するためには , いろいろと決めな 前節て、議論した内容に沿ってアルゴリズ 化していくこ 84 C MAGAZINE 1993 2 て、すね。したがって , クイーンを置くこと になります。これは Fig. 1 を見れば一目瞭然 置くことのできる行は列ごとに異なること 斜めの利き筋を考慮すると , クイーンを えてみましよう。 利き筋も考慮て、きるようなデータ構造を考 ことに相当しますが , これに加えて斜めの は , クイーンの横方向の利き筋を考慮する 管理しました。未使用の行に着目すること 着目して , 未使用の行を双方リストにより 前回示した「高速版」て、は , 未使用の行に いところて、す。 く見つけることのて、きるデータ構造がほし のて、 , このような条件を満たす行 r 。 w を素速 てについて for 文内の処理を行うことになる 中でクイーンを置くことのできる行 row すべ めの for 文の実現方法て、す。ここて、は co 冽の まず考えなければならないことは , 8 行目 す。 略を練るためには List 1 よりも適していま 化されているのて、 , アルゴリズムの基本戦 リズムは List 1 と似ていますが , より抽象 ンのアルゴリズムを示します。このアルゴ 討から行うことにします。 List 2 に n クイー ますは , おおざっぱなアルゴリズムの検 のできる行は列ごとに管理することにしま す。メモリ消費量が増加しますが , 高速化 のためにはしかたありません。具体的には , 列ごとにクイーンを置くことのできる行を 双方向リストて、持つようにすればよいて、し よう。この列ごとに管理された双方向リス トのイメージを Fig. 3 に示します。また , 双 方向リストについては前回詳しく解説した ばかりなのて、 , ここて、は解説を省きます。 次に , List 2 の 6 行目に出てくる未試行の 列のひとつの決め方について検討します。 これは前述のようにその列にクイーンを置 くことのできるマス目がいくつあるかによ り決めるのがよいて、しよう。クイーンの置 けるマス目が 0 個という列がひとってもあれ Fig. 3 チェス盤のテータ構造 行 ば , それ以上の試行は無意味て、あり , だま ってリターンするしかありません。また , クイーンの置けるマス目がひとっしかない という列があれば , その場所には自動的に クイーンを置くのがよいことになります。 て、は , すべての列について , クイーンを 置くことのて、きるマス目がふたつ以上ある ような場合はどうて、しようか。この場合に は , クイーンを置くことのできるマス目の いちばん少ない列から試行するのがよさそ うて、す。 Fig. 2 て、見ていただいたように , ク ィーンを置くことにより , ほかの列の試行 パターンを大幅に狭めることがてき , ひい ては試行錯誤の回数を減らすことがて、きる と思われるからて、す。
通信フト 高速テータ転送を可能にヴる通信規約の実際 すでに国内のネット人口は百万人を超えると そしてこれらの仕様がしばしばオンラインで配 布されていることも関連書が少ない要因のびど ・いわれているが , フリソフトウェアをダウン ロード , ーアップロードするときに必ずお世話に っと思われる。 通信プロトコルは , 特別な処理を行うという なるのが , XMODEM に代表される , ~ いわゆる よりも , ー ~ むしろデータ転送処理という点におて、 通信プロトコルである。 なぜカ % XMODEM や ZMODEM などの通信 て , もっとも基本的な技術の集大成であること プロトルについて書かれた本はあまり見かけ に注目すべきである。データの変拠タフレム 処理 , 工ラー訂正名イムてウト処理などは , ない。。通信ソフトウェアを自作する機会でもな ければ , にのような処理を書く機会が少な、一 ほかのプログラム作成にもたいへん役に立つ知 通信プロトコルの基礎知識 コンピュータ間でのテータ転送には , 送受信双方におい てエラーフリーを実現する統一された規約 , つまりプロ トコルか求められる。本章では基本的なプロトコル機能 とプロトコル機能理解に必要な用語を解説する。 合には , 0X00 ~ 0x1f に相当する文字はコン れてきたら再開するのが XON/XOFF 制御 トロール文字とみなされ , 文意を伝達する ( X 制御 ) て、ある。 通信プロトコルの必要性 ためのいわゆる通常の文字 , とは異なった このようなコントロール文字がテキスト 意味を持つ。文章中に現れるコントロール 中に含まれていたらどうなるだろうか。テ BBS ( 電子掲示板 ) は , 多くの利用者が読 文字もある。たとえば , 0x0a は改行を意味 キストを画面に表示している途中て、 , Cont するし , 0x0d が復帰を意味する。 0x0c(Co めるように公開されているという意味にお r01 ー S が現れたら , その後に端末から何か送 ntroI-L) は , 画面消去を意味することがあ いて , 駅にある伝言板と同じように , 掲示 信しようとしたときに , まだ Contro ト Q を受 板としての用途に適している。 BBS がて、き る。また , 端末によってはエスケープに続 け取っていないのて、 , 待ち状態に入ってし ると同時に文書以外のデータ , プログラム く文字は特別な意味として解釈される。 まうかもしれない。最悪の場合 , お互いに もやり取りしたいという要求がただちに発 これらの特殊文字のほかに , データ転送 データを待っことになってしまい , 相互の 生した。 時のフロー制御に使われるコントロール文 通信が破綻する。 テキストの場合には , データに現れる文 字もある。 Contro ト S が送られてきたらデー パソコンや各種端末に関しては , ESC に 字がかぎられている。とくに ASCII 文字の場 タ送信を一時中断し , 次に C 。 ntr 。ト Q が送ら 続く文字によって文字や画面の表示属性 , 34 C MAGAZINE 1993 2
マッチング・ノヾズル 第 23 回 吉柄貴樹 最近ちょっとやさしめの問題が続いてい る。そのため , 皆さんの応募解答も多くな っているが , いつも解けないとお嘆きの方 にはチャンスて、ある。 1 1 月号の解答 正解は , 1 通りて、あった。並べ方を Fig. 3 に示す。もちろん , 全体を裏返した解て、も よい。私としては , 全体を裏返したものを 別の解とはしたくないのだが , これを別の 解として 2 通りとした方も正解とした。 今回は解き方に工夫が凝らせるようなと 順にたどることて、裏返しの状態を表現して 回りの六角形は中心の六角形に接する文 ころがなかったのて、 , 皆さんほば同じよう います。 字を中心として , その両隣の文字をお互い なアルゴリズムて、あった。わかりやすい文 七つの六角形がお互いに接している辺の に共有しながらつながっています。 12 個の 字列の変数を設定して解いている大島正季 文字を順に拾っていくと , 12 個の円をなす 文字列においては Fig. 5 のような関係になり さんと , 再帰を用いて解いている坂本治さ 文字列 (Joint [ 12 ] ) となることがわかりま ます。たとえば , 2 番目に置かれる六角形は んの解答を紹介する。 す。中心の六角形のすべての辺は , ほかの a を中心の六角形につけた状態て、 , なおか 六角形と接していることから , 中心の六角 つ , 3 番目に置かれる六角形および 7 番目に Fig. 3 マッチング・ノヾズルの解答 形の文字は 12 個の文字列中にひとっ置きに 置かれる六角形に接する辺の文字を共有す e 0 0 順に 6 個 , 格納されることになります。中心 るよう置かれるわけて、す。このようにして 0 0 の六角形を決定した状態て、は , 12 個の文字 12 個の文字列のつながりに不具合が起きな 3 の 2 4 列は Fig. 4 のようになります。 いよう , バックトラックによる方法て、解を る谷 6 、 Fig. 4 1 番目 ( 中心 ) の六角形を置いた状態 【 1 1 月号のパズル】 Fig. 2 のように , 各辺に a ~ f の文字が書か の置き方があるだろうか。ただし , 板の裏 れた正六角形の板が 7 枚ある。これを Fig. 1 面の各辺には , それぞれ表と同じ文字が書 のように配置するのだが , 同じ文字の辺が かれており , 裏返して使うことが可能であ 接するように , というのが条件だ。何通り る。 Fig. 1 7 枚の板の配置 Fig. 2 a ~ f の書かれた 7 枚の板 -a 5 の 6 0 0 0 f ö 0 大島正季さんの解答 ( プログラムは付録ディスク PUZZLEOI . C) プログラムの説明 Fig. 5 回りの六角形の相互関係 六角形に書かれている文字を a から順に時 計回りて、拾い , 最初と最後がつながるよう に操作することて、エンドレスな文字列とし て表現します。このような文字列て、 7 枚の六 角形を表現 ( 配列 Hexa ) し , その文字列を逆 6 164 C MAGAZIN E 1993 2
C 十十入門講座 The ◆ 山本浩文・白倉伸一郎 第 8 回 クラスライプラリ往新 st 「 eam コンテナクラスライプラリ ットライトを浴びるのは , 「クラスライプラリ」という大 物スタアのようですが・・・・・・ ? 純粋仮想関数と 抽象クラス ( 承前 ) Li st janken の player クラス さて , 前回述べたことを , もう一度振り のて、す ( ぎ ) 。 ログラマに , 断然差をつけられるというも っちょまえの C 十十プログラマ。凡百の C プ いいテクニカルタームを駆使してこそ , い ういったカッコ て、はないて、しよう・ テクニカルタームの 10 個や 20 個 , ものの数 ウゴウゴ君とルーガちゃんのことを思えば , からないお言葉を無理やり聞かされている ようて、す。もっとも , 毎朝毎朝 , わけのわ なにやら物々しい雰囲気につつまれてきた げな用語がビシバシ出てきて , この連載も 純粋仮想関数やら抽象クラスやら , 難し 1 . c lass 円 ayer { / / プレイヤーの抽象クラス 返ってみましよう。 純粋仮想関数をひとって、もメンバに持つ クラスを抽象クラスと呼びます。抽象クラ スは , それ自身による問題の解決を提供す るものて、はなく , ある概念をクラスの形て、 表したものて、あると考えられます。 いい換えると , 抽象クラスとは , インプ リメンテーションはとりあえず棚上げにし て , インタフェイスだけを規定することを 目的にしたクラスて、あるといえます。 というのはどういうことなのか。 卑近な例になってしまいますが , 前回の SubStory 十十サンプルプログラムとして収 録した janken には , Player クラスが抽象ク ラスとして宣言されていました (List 1) 。 こて、は , te() と reaction() のふたつの 2 : 6 ・ 8 . protected ・ char* myname. Te hand, i n t k i nd CPAA + 1 ] : pub ⅱ c : Resu は res ; i n t ⅵ n , i n t ー ose : PIayer(), virtual VOid begin()' virtual Te te() const char* name() : / / 自分の名前 / / 自分の手 / / 勝ち負けの判断に使う / / 勝った回数 / / 負けた回数 / / 勝敗判断の開始 / / 自分の手を返す / / 名前を返す / / 抽象クラスのコンストラクタ virtual VOid oppose(Player* (I) : virtual void judge(); virtual void reaction() 104 C MAGAZINE 1993 2 〃対戦相手の手を得る / / 勝敗を判断する / / リアクションを起こす メンバ関数が , 純粋仮想関数として宣言さ れています。 純粋仮想関数を持つクラスは , インスタ ンスを定義することはて、きません。実際に インスタンスとして活躍するのは , PIayer を継承し , これらの純粋仮想関数をオーバ ライドした Purako, Cko, Pura といった派 生クラスたちて、す。 Purako たちには , おのおのの「手の出し方」 があり , 「リアクション」があるのかもしれ ませんが , それを Player という抽象クラス に統合することによって , 統一的に取り扱 うことがて、きるわけて、す。 逆にいうと , Purako などの具体的なクラ スの持っている共通項を拾い出したものこ そが , PIayer クラスだと考えられます。抽 象クラスの「抽象」とは , まさに辞典に載っ ているとおりの意味を持っているわけて、す。 いわば , この janken というプログラムに な。まあ , 理屈はともかくとして , この仕 ちょっとオプジェクト指向っほ。かったか スだということて、す。 具体的に実現したものが , 個々の派生クラ 表したものが Player クラスて、あり , それを おける、、プレイヤクという概念をクラスに たとえば , ウインドウアプリケーション られます。 組みを応用した有効な利用法は無限に考え
by ste 奥村晴彦 第 11 回構造体 構造体・共用体は C 言語の最後の砦です。ポインタと関連して 用いられることが多いので , ポインタの復習にも最適の題材で す。ちょうど昨年 10 月の情報処理試験にも構造体か出題されま したので , この解説を兼ねて今回は構造体の勉強をしましよう。 実践ログラミング デタベースソトを作ろう 今回は , 簡単なデータベースソフトを作 ってみましよう。データの項目は ・商品名・値段 にしておきます。ちょっと書き換えれば住 所録ソフトや文献データベースソフトにも なりますのて、 , いろいろいじってください 商品名は文字列として格納します。とり あえず商品名の長さの上限を 20 バイト ( 全角 て、 10 文字 ) としましよう。文字列は最後に \ 0 をつけるのて、 , 実際には 21 バイト必要て、す。 また , 商品の値段は整数 ( int 型 ) としておき ますが , パソコンの C 言語て、は int 型の上限が 32767 と小さいのて、 , 実際には long 型のほう がよいて、しよう。 データを収める場所は , 仮に 1000 件まて、 登録するとわかっているなら , 配列て、 charname[1000] [ 21 ] ; / * 品名 * / int price[1000] ; / * 値段 * / のように宣言て、きます。 しかし , 最初からデータの件数がわかっ ていることはまずありません。メモリの許 すかぎり大きい配列を確保しておけばよい と思われるかもしれませんが , 同じ機種の 90 C MAGAZINE 1993 2 パソコンて、も常駐ソフトなどによって利用 可能なメモリ量は違います。また , UNIX の ようなマルチタスクの OS て、は , ひとつのプ ログラムがメモリを食いすぎるとほかに悪 影響をおよばします。必要に応じてデータ 領域が増えるような設計がよいのて、す。 てはどうすればよいて、しようか。単純な 構造体とは そこて、構造体の登場て、す。 配列て、はとても無理て、す。 char name [ 21 ] ; / * 品名 * / タにつき , とめたものて、す。前述の例ては , 1 件のデー 構造体とは , いくつかのデータ項目をま int price / * 値段 * / というふたつの項目がありました。このふ たつの項目を次のようにまとめて定義した ものが構造体て、す。 struct { char name[21] ; int price , / * 品名 * / / * 値段 * / これて、ひとつの構造体の変数 x を定義した ことになります。この変数 x は , 単に name [ ] と price のふたつの要素をまとめただけ のものて、す。この x の中の name を扱うには x. name とします。たとえば strcpy (). name, " C マガジン " ) ・ printf ("%s*n", x. name) ・ といった具合にします。 x. price も同様に 980 ; X. prlCe printf ("%d*n", x. price) ; のように使います。 同じ型の構造体がふたつあれば , 構造体 の内容を一括コピーすることがて、きます。 たとえば struct { char name[21] ; int price , } xl, x2 ; としておけば , x2 , のようにて、きるのてす。この代入文は次の 3 行のプログラムと同じ働きをします。 i く 21 ; i 十十 ) xl. name[i] x2. name[i] ; xl price x2. price , 同じ型の構造体をいくつも扱う必要があ るときは , あらかじめ構造体の型に名前を つけておくと便利てす。たとえば xl for (i
して , ある程度以前に送ったバケットもデ ータ保持しておく。このような手法をスラ イディングウインドウと呼んて、いる。これ により , 送信側はよどみなくデータをどん どん送ることが可能になるから , 待ち時間 はほとんど無視て、きる。 テキスト形式のデータを転送する場合に は , 行末の処理を行ってくれるプロトコル もある。 テキストの行末は , CR, LF, あるいはそ の組み合わせて、表現されるのだが , 問題は その組み合わせて、ある。 CP/M や DOS て、使 われているのは CR 十 LF の組み合わせて、あ り , 現在多くのネットて、この組み合わせが 指定て、きるようになっている。これ以外に は , UNIX のように LF だけて、行末を意味す るシステムもある。または CR のみて、改行を 意味するシステムもある。たとえば UNIX て、 作成したテキストファイルを DOS にそのま ま持ってくると , CR がないために行ごとに 行の先頭に戻らない , 変な表示になってし まうことがある。 ′ー末処理 レシューム機能というとブックパソコン の電源を切ったときの状態を保存しておき , 次回電源を入れたときに , そこから再開て、 きるような機能をイメージするかもしれな いが , レジュームというのはもともと復元 するという意味て、あり , 通信プロトコルて、 はこの機能はファイルの途中からの送受信 が可能て、あることを意味する。 あまりあって欲しくはないことだが , 大 量のデータを受信中にトラブルて、ハングア ップしてしまったり , センターがダウンし たり , キャッチホンにほかから電話がかか ってきたり , ということを経験した人も多 いだろう。このような場合に再度初めから データを受け取るのはたいへんだが , 中断 したところから続行て、きれば便利て、ある。 とくに , 電話回線を使ったファイル転送は , 大量のデータ処理にかなりの時間がかかる のて、 , このような処理は BBS を利用する場 レジューム 単て、ある。受信側が指定したバイト位置か この機能そのものの実装は簡 合にとくに便利て、あるといえよう。 基本的に ら , 送信を開始すればよいだけだ。 もちろ ん , 受信側は , 指定したファイルに受け取 ったデータを追加しなければならない。し たがって , 問題は , どのようにして受信側 がその情報を送信側に送るかということて、 ある。 プロトコルによっては , 誤って違うファ イルを途中から受け取ったりしないような 処理が追加されている。もっとも確実なの は , すて、に受け取ったデータを全部比較す ることて、あるが , これて、は最初からデータ を全部送り直すのと同じ時間がかかってし まうのて、お話にならない。そこて、 , よく使 われている手法は , ファイルの途中まて、の CRC を計算し , 比較するというものて、あ る。 CRC が一致しない場合には , 異なるフ ァイルと判断し , データを最初から送り直 すことにする。 コントロールコード 0X00 ~ 0x1f に相当するコードて、 , プロト コルによって , 実際に利用するコントロー ルコードはこの中の一部て、ある ( Table 2 を 主要通信プロトコル仕様概説 通信プロトコルは XMODEM を母体として派生したもの と , B P 旧 s や Quick - VAN などの独自派に大別でき る。本章では多数存在する通信プロトコルの中から主要 プロトコルを紹介しそれそれの仕様を解説する。 XMODEM はネット黎明期に急速に広ま った通信プロトコルて、ある。非常に簡単な XMODEM に実装されている。 XMODEM は確かに多 くの欠点も合わせ持っているが , それにも まして簡単に実装て、きるというメリットが 魅力となっている。 40 C MAGAZINE 仕様て、バイナリデータの転送が実現て、きる のて、 , 多くのコンピュータ , ソフトウェア 1993 2