000 - みる会図書館


検索対象: 月刊 C MAGAZINE 1992年11月号
193件見つかりました。

1. 月刊 C MAGAZINE 1992年11月号

ln 種川 a ⅱ行 om 町ⅱ計 Makers ライフボート WATCOM C / 386 Lattice C データを読み込む際 , 構造体の先 頭の int の値が 3333 ( そのほかに 333 Lattice C でまったく同一の ソースを別の名前 ( 同じ文字数 ) で 4 , 3335 など 3 ではじまる 4 桁の数 セープして , それぞれ同一のコン 字 ? ) のときに , そのプロックが正 パイル , リンクしたにもかかわら 常に読み出せなくなります ( Fig. 1 ) 。 ず , 作成された EXE ファイルを MS ほかの数字 ( 1 1 1 1 , 2 2 2 2 , 3 3 3 な ど ) の場合は問題なく読み出せま —DOS の FC コマンドでパイナリ比 較したところ異なっている箇所が す。 fw 「 ite で書き込む直前と書き込 かなりありました。そこで今度は んだ後のファイルには正常に 3333 が書き込まれていることは確認で ファイル名も同一のものを別のデ ィレクトリにコビーして , そこで きています。どうなっているので コンパイルを行い , ふたつを比較 しようか ? してみると EXE の内容だけでなく List 1 てはファイルオープン時 OBJ ファイルの大きさまで異なっ のアクセスモード指定をを〃と w 〃 ていました。動作上まったく問題 はないのですが , 理由がわからず のようにしていますが , この指定 て、はデフォルトのテキストモード 気になります。 になるため 3333 ( 16 進数て、 0X0d05 ) の 0x0d の部分がキャリッジリター Lattice C に付属するリンカ ンコードとしてテキスト変化を受 (LMB) は , 処理速度を向上させるた けてしまいます。 めリンカのワークエリアの初期化 C 言語ては , 行の区切りを、、 \ n 〃 ( 0 クリア ) を行っておりません。と くに未設定のデータ領域は , コン つまり , 0x0a て表すのに対して , パイラ実行時の初期化ルーチンが MS-DOS のファイルては行の区切 0 クリアを行っているのて、 , リンカ りがヾ \ n 〃と \ r 〃 (0x0d) のふた はそのときのメモリ上のイメージ つのコードて表すという違いを自 をそのまま EXE ファイルに書き込 動的に吸収するため , ファイルへ んて、しまいます。そのため , EXE の書き込み時には , \ n 〃 (0x0a) ファイルの内容が異なってしまい をゞ \ n 〃と邸 \ ド (0x0d0a) に変換 ます。 し , 読み出し時には , 書き込み時 OBJ ファイルのほうは , Lattice に追加した第 \ ドを取り除くとい C コンノヾイラカすソースレベノレデンヾッ うものてす。したがって , バイナ ガがソースファイルの位置を自動 リデータ 3333 をテキストモードて 的に探し出せるようにコンパイル 読み出すと上位 8 ビットにあたる 0 した OBJ ファイルにソースファイ x0d を読み込まずに省いてしまいま ルのあるディレクトリ情報を書き す。テキストてはないデータの読 込むため , フルバス名の長さの違 み込み , 書き出しを行う場合 , フ いが OBJ ファイルの長さの違いと ァイルオープンモードをや rb 〃 , "w なって現れます。 b" のように指定してバイナリモー ドにすれば , データの変換を行わ ないのてこのような問題はおこり List 1 のようなプログラムで , ません。 ラ 1 人り 14 り 11 つ ・ 1 0 ん 1 人っな 11 っ 0 , 1 り 11 っ ・ 1 り 1 よっ 、 1 つ 、 1 0 ム 、 1 り ・ 1 り 、 ). 1 っっ 0 4 +> ・ 10 もれ 0 4 48.1 り介 0 Ⅳんん % Ⅳんん影んⅣんⅣんⅣん ′ ( 14 00 0 ・ 1 0?Æf. ・ { ・ 7 ・よーヨ・」 1 人 30 ・新 : 2 4567891 100 3 4 -0 6 7-8 9 01 よ 00 3 4 - -0 6 7 8 9 01 っ 00 4 0 6 「ー 8 9 01 人りっ 0 4 【 0 6 7 8 9 011 りな ^ 0 4 一 -0 6 叮ー 8 9 014 りっ 0 111111 よ 1 、人 11 人り 0 つ 0 りりなりりりり 00 っ 0 っ 0 介 0 00 00 っ 0 っ 0 っ 0 れ 0 4 4 4 -4 4 4 4 4 4 4 ′ 0 -0 戸 0 ′ 0 List 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 人り 1 人っ 1 人っ 1 人り 1 人 ? 9 0 0 8 0 0 行 叮ー 0 0 140 00 0 0 1 よ 0 ん 8 0 0 り 0 0 つ 0 0 ・ 1 り 14 0 0 1 人り 1 0 0 11 り 9 0 0 り 0 0 ・ 1 りな ー 4 0 , 1 0 な 1 人 0 っ 0 4 0 0 0 0 、 100 3 0 0 4- ト 0 6 ー 8 9 ・ 1 lnformation from CompiIer Makers 159

2. 月刊 C MAGAZINE 1992年11月号

最新ロ口ロレポート ことがて、きないのて , 用紙が小さい場合に は不都合があるかもしれない TB-PRINT 』 対応機種 PC ー 9800 シリ—ズ ( 除く初代 , LT, ノ、イレゾ機 ) 動作環境 MS-DOS ver. 3.1 以上 メモリ 640K 六イト以上 対応コンパイラ MS-C/QuickC 用 Lattice C 用 Turbo C/Turbo C 十十用 89 , 000 円 ( 一式 ) 価格 59 , 000 円 ( レイアウトデ、イタ ) 39 , 000 円 各言語用ランタイムライプラリ ) 問い合わせ先… ( 株 ) ビッツ 〒 105 東京都港区東新橋 2 ー 1 ー 7 住友生命東新橋ビル 6F TE し匐 3 432 ー 1677 て、データを印刷するための関数て、ある (Tab には , グループ用の関数を使用する。グル ープやフィールドの指定方法は , 番号また le 2 ) 。初期化や終了処理のための関数 , 1 ペ は名前て、行う。番号や名前は , レイアウト ージ分の印刷を行う関数 , フィールドへデ 工デイタのフィールドー覧やフィールドグ ータを引き渡す関数の三つからなる。 ループー覧て、確認て、きる。 基本処理手順 B-PRINT の印刷例を Fig. 6 に示す。 B ー PRINT の基本的な処理手順を Fig. 5 題点 に示す。あらかじめ , B-PRINT 関数を初期 化し , 帳票シートを指定しておく。そして 問題点としては , ふたつある。まずプリ 順次データファイルからデータを読み込み , 各フィールドにデータを送ってから 1 ページ ンタの対応機種が PC ー PR201 系だけて、あるこ とだ。メモリの問題もあろうが , NM 系やェ を印刷するという手順になる。 プソン系 , レーザーショットなど主要なプ 基本処理チャート リンタには対応してほしい データの種類や符号の有無によって使用 ふたつめは , 行送りや文字送りが標準の みなのて、 , 一部の用紙て、印刷て、きなかっナ する関数が違っている。また , グループ化 されているフィールドへデータを送る場合 りする。さらに , 行数や文字数を多くする 6 印刷例 Fig. 印刷日 92 / 10 / 01 Page : 01 : 05 1 松平竹千代 1 SAMPLEOI 三佐々木小次郎 2 SAMPLE02 今川 義元 3 SAMPLE03 藤原 定家 4 SAWLE04 糖木 正成 5 SAMPLE05 豊臣 秀吉 6 SAMPLE06 徳川 家康 7 SAMPLE07 新田 義貞 8 SAMPLE08 北条 早雲 9 SAMPLE09 坂本 竜馬 10 SA.MPLEIO 羽柴 秀吉 11 SAWLEII 織田 信長 12 明智小五郎 13 SAMPLE13 宮本武蔵 14 SAMPLE14 細川珠子 15 SAMPLE15 F a x 松平システム ( 株 ) 部長 神奈川県横浜市戸塚区 0745 ー 73 ー 0000 ソフト開発部 吉田町 0 ー 0 0 0745 ー 73 ー 0000 佐々木マイコンシステムズ株 代表取締役 大阪府枚方市 03 ー 3362 ー 0000 03 ー 3362 ー 0000 ( 株 ) 今川コンピュータシステム 課長 東京都千代田区富士見 0 ー 0 ー 0 0568 ー 67 ー 0000 池田ビル 3 F 2 0568 ー 67 ー 0000 藤原コンピュータ ( 株 ) 主任 埼玉県和光市下新倉 0 0 0 03 ー 3781 ー 0000 1 03 ー 3781 ー 0000 ( 株 ) 楠コンピュータシステム 代表取締役 和歌山県和歌山市黒田 0 03 ー 3688-0000 銀座ビル 6 F 03-3688 ー 0000 豊臣コンピュータシステム ( 株 ) 代表取締役 神奈川県横須賀市船越町 0 ー 0 0 03 ー 3263 ー 0000 03 ー 3263 ー 0000 徳川電子産業 ( 株 ) 代表取締役 大阪府門真市松葉町 0 ー 0 0 0484 ー 61 ー 0000 0484 ー 61 ー 0000 ( 株 ) 新田システムズ 和歌山県和歌山市白畑 0 0 ー 主任 0568 ー 88 ー 0000 0 、務部、務課 0568 ー 88 ー 0000 北条システム開発 ( 株 ) 東京都立川市栄町 0 ー 0 代表取締役 045 ー 545 ー 0000 ー 0 045 ー 545 ー 0000 ( 株 ) 坂本ドラゴンシステムズ 大阪府吹田市千里山東 0 事業部長 08263-2-0000 システム業 08263 ー 3 ー 0000 羽柴システム開発 ( 株 ) 大阪府吹田市万里山南 0 事業部長 03 ー 3352 ー 0000 ー 0 ー 0 戦情部 03 ー 3352 ー 0000 神奈川県横浜市神奈川区 織田システム ( 株 ) 代表取締役 0471 ー 29 ー 0000 ハ錦町 0 0 0 A B C ビル 3 F 0471 ー 29 ー 0000 大阪府大阪市天王寺区 0 ー 0 ー 0 ( 株 ) 明智情報システムズ 代表取締役 03 ー 3657 ー 0000 03 ー 3657 ー 0000 東京都江東区豊洲 0 宮本システム開発 ( 株 ) 代表取締役 ー 0 ー 0 03 ー 3279 ー 0000 03 ー 3279 ー 0000 愛知県安城市高柳町 0 ( 株 ) 細川システム開発 専務取締役 052-872-0000 ー 0 ー 0 052 ー 872 ー 0000 Print format rocessor B—PRINT V 1.0 Fi1e processor B-FILE V 1 .0 ( 株 ) ビッツ ー B ー p R I N T ーで作成した帳票フォームを使用して印刷したものそす . 148 C M AGAZIN E 1992 11

3. 月刊 C MAGAZINE 1992年11月号

実践アルゴリズ壓路解法のテクニック 割は O ( n ) の計算量て、行えます。一方 , ソー ライプラリ関数を使える場合は , とりあえ 率の高いアルゴリズムを用いるほうが賢明 トに要する時間は O ( nl 。 gn ) て、すから大き ず既存の関数を使って実装しておき , 本当 て、す。性能の評価については , 最後にまと な違いて、す。しかし , qsort のような既存の に効率が悪いことが証明されてからより効 めて書くことにします。 Fig. 8 環状双方向リスト 環状双方向リストの図 Fig. 7 ショートカットノヾスの選択 typedef struct link link—t; struct link ( point—t xy ; link—t *prev; / * 順方向ポインタ * / link—t *next; / * 逆方向ポインタ * / a ー c ー d を a ー d にショートカットするよりも b ー c ー d を b ー d にショートカットしたほうが 経路は短くなる。 List 3 マージ処理部 分割統治 List 5 0 0 0 8 る す ・う 0 0 算 果 す る 効 & & 指 の ジ X O X 一 点 ッ ッ 有 x カ カ マ ・ 1 、 0 共、 2 を 路釀 カ 0 A 0 ョ ョ 00 1 人・・ー、 経 00 1 よ′ー、 シ 1 ・ 4 11 人 》 1- つ 00 4 0 れ 0 っー 8 9 0 1 人っっリ -4 - -0 6 叮ー 8 0 》 0 ・ 1 つな 00 4 LD 6 ー 8 0 11 りっ 0 4 【 0 6 っー 8 9 0 1 人 11 ・ 1 イ 1 、 1 1 人 1 人 1 人 1 ・・ 1 1 っ 0 りっ編っ臨りなりなっりりなれ 0 っ 0 っ 0 っ 0 っ 0 っ 0 れ 0 00 れ 0 00 4 4 1 : / * 分割統治 3 : link t *divide and_conquer(point_t xy[], int n) 5 : int m; 6 : 1 ink_t *p, *q; 7 : point_t node_xy; 8 : / * 自明な場合 ( 三角形以下の場合 ) 9 : 10 : if (n ← 3 ) 11 : 12 : return set_link(xy, n); 13 : m = divide(xy, n); node-xy ニ xyCn] = xyCm] ; 14 : 15 : / * 再帰的な分割 ( 後側を先に ) 17 : P = divide_and_conquer(&xy[m + 1 ] , n ー m) ; q = divide and_conquer(&xy@], m + 1 ) ; 20 : 21 : return merge(), q, &node—xy) ; / * 統合 * / 22 : } / * 分割 * / / * 共有点の複写 * / 分割関数 divide List 4 1 : / * 分割処理 2 : 3 : int divide(point—t ロ , int n) = horizontal) if (direction(xy, n) 5 : qsort(xy, n, sizeof(xyCO]), comp-h) : 6 : 7 : else qsort(xy, n, sizeof(xy[0]), comp—v) : 8 : 9 : return n / 2 ; 実践アルゴリズム戦略解法のテクニック 79

4. 月刊 C MAGAZINE 1992年11月号

・い言ゞ・ 。、朝以気ソ難よ、りまら 1 設くなる - ) 要 , 読 0 て、 = 。。、るたけ , = , 。 0 , 、 , , て DRC 物ド ークボン券。 PC クーボン」かついに登堺レました。、・、・ , 、・コレ使えあ声しろた種、、 - ブドさ . 。 弋 0 、、一店頭価格より = 0 ・ = 安く購 0 = る 00 す、不ま 一次 ' 頁のクー永ン用に , / 、 , 2 = 読んて = 。添イ、、〒 、薹トボン券をクーポン加盟店にて正レくご利用いたたけは、 - との販売価格てす / ・ ) に消見を課税し是額からクギ に = 己載の金額分引きれるのです・える商叩 効期間はクトホン券の券面に記載されています。さあ : ャンスをおし - : ぐ - もびこ羽く , たさし、 広告企画を

5. 月刊 C MAGAZINE 1992年11月号

X 68 k 活用講座 ころ , 「運を天にまかせて」が本物の台て、す。 が , シミュレートプログラムの場合には ライプラリ関数の rand ( ) を使っているの て、 , List 2 のような割り算による余りて、判定 するのは最悪の手法て、す。もう少しマシに するには , 判定用のテープルを作成して ra nd ( ) が返す値て、そのテーカレを引くのがよ い方法て、す。今回はテープル作成がめんど うなのて , 手抜きしています。 キー入力待ちの間に rand ( ) を何度も呼び 出して人間がキーを押すタイミングのラン ダム性を利用しています。て、すから , 「キー を押しつばなし」にすると相当にクセがて、る のて , まともに遊びたい場合は「天にお祈り」 しながらキーを叩いてくださいい一 際 , 世の中には「 R レジスタ」に生活を賭して いる方々もおられるわけて、 , デフォルト設 定て、は 1 叩き 600 円なのて、すから , 「キーを押 しつばなし」にするとバチが当たります ( を 垂直帰線割り込みを使って本物に近い方 法て乱数を発生させればこの間題はある程 度回避て、きそうて、すが , 今回は時間的に作 成てきませんてした。お許しください 最後に C マガのネタとは思えない内容て、したが , いかがだったて、しようか ? 個人的な趣味 の内容て、すが , 専門雑誌には「フローチャー ト」や「フラグ成立」といった言葉が乱舞して いるのて、 , 逆にプログラム専門雑誌て、こう いったネタをマジメ ( ! ? ) に扱うのもおもし ろいと勝手に判断して , このような内容に なってしまいました。 X68000 のフリーウェアゲームに「かなりハ マれる」パチスロゲームがあります。このゲ ームはなかなかフリークを「納得」させるプ ログラムがしてあり , おもしろい作品てす。 NIFTY-Serve FSHARP2 に最新版がアッ ニ 0 : 物 3 当 3 LiSt 2 265 : 266 : 267 : 268 : 269 : 270 : 271 : 272 : 273 : 274 : 275 : 276 : 277 : 278 : 279 : 281 : 282 : 283 : 284 : 285 : 286 : 287 : 288 : 289 : 290 : 291 : 292 : 293 : 294 : 295 : 296 : 297 : 298 : 299 : 300 : 301 : 302 : 303 : 304 : 305 : 306 : 307 : 308 : 310 : 311 : 313 : 316 : 318 : 319 : 320 : 321 : 322 : ー 325 : 326 : 327 : 328 : 329 : 330 : 331 : 332 : 333 : 334 : 335 : 336 : 337 : 338 : 339 : 340 : 341 : 343 : 344 : 345 : 346 : setup ( ) : printf " 設定齟( 個 /turn)*t 日数日 \ t デジタル表小 . printf resflag = = TRUE ? " する " ”しない” ) ; printf ( " \ t ゾーン表示 : " ) : printf (zoneflag = TRUE ? " する : " しない *n") : havemoney = 30000L : printf ( " スタート時の所持金額円 \ n " , havemoney); rand ( ) ; do if (resflag = TRUE) turncoun t 十十 ; r = rand ( ) % set; lostmoney + = 1 圓 0 : = 10 圓 ; havemoney ね = 250 : srand (ONTIME ( ) ) ; lost = 0 : whi le (day ← daymax) totalinput = totaloutput bigcount turncount = 1 uckycount = b igcount zone = FALSE ; lostmoney = 0 : playtime ニ 0 ; day = 1 : while ( tama > 0 playtime く 36 のⅡ playtime + + ; lost if (lost > = 83 ) lost + + : tOtal input + + ; tama- else printresult ( ) ; dynamite ( ) : B_KEYINP 0 ; while ()B KEYSNS ( ) ) ; set, daymax) : tama > 0 & & tama く 20 圓 & & playtime > = 36 の ) : if (tama ← 0 & & playtime く 30 の if (resflag = TRUE) printf ( " はまり % ld 円 \ n ” , lostmoney); cont i nue : havemoney + = tama / 40 * 100 : lostmoney, tama > 0 ? tama / 40 * 1 圓 printf " 回収金額 % ld 円 \ t 投資金額 % ld 円 \ t 割数 % 6.1fXX*n" printf " ( 第 % 31d 日目成績 ) 所持金 % ld 円 \ n ” , day, havemoney) : lostmoney = 0 : zone = FALSE : playtime = 0 : day + 十 : (double) ((double) (tama / 40 * 10 の / (double) lostmoney * 100. の ) : (double) bigcount / (double) turncount * 100. の : ( ” 7 の出る確率 % 6.3fXX%n ” , (double) totaloutput / (double) total input * 100. の ; totaloutput, total input, printf ("input : Xld*toutput : % ld \ t 割数 % 7.2fXX%n"' printf プロードされているのて、 , みてください 一度プレイして 134 C MAGAZINE 1 2 11

6. 月刊 C MAGAZINE 1992年11月号

本誌が選ぶ 32 年 読題 み騒 逃然 之 0 月 S P E C ー A L / ユーサー投票により、パソコン、 P C EFSON PC ・ 486GR に 0 熱 lac 洫 ( 新 1 ( ⅲ PCvßign ・ COLLJMNS 小田鷓隆、水玉蛍之丞、中尊寺ゆっこら か語るフリーエッセイ 0 日 EADE 日 S 読者がつくる、秋 葉原感覚あふれるべージ・ P 日 0 ロ UCTS ジャンレ別・ 価格帯別で、あらゆる新製品を分類・網羅・ DATA 独自 創刊記念プレゼント 創刊記念モニター大募集 PC オリジカレテレホンカードほか プロセッ状ソフトウェアほか 486 パソコンオーバードライプ ソコン界の最新動向 調査のテータベースで現行商品を一望・ NEWS 日米バ バーソカレコン

7. 月刊 C MAGAZINE 1992年11月号

之 0 ナ 0 品騾隼 UNIZVDVJN 品辟田阜ハくエハ ) ミ 2 SN 9767e ( Y ) ト 0 9 純レØくト Y4 ◎要 E4 ーっトト◎囲Ø 細細 0 •< ロト 0 一繼辟 辟朴・朴・経朴 己一口甲ロロロ 工 LI M L 9 斗 086 ロ 4 む 0 仙・・ 9 ・、 u つ 処レ ー丑 。都田一籵 266 家Øエー VØ凵 ( 経 )

8. 月刊 C MAGAZINE 1992年11月号

ている。 ①システムの初期化 ②フレームの作成 ③サプウインドウの作成 ④イベント管理ルーチンの呼び出し まず , システムの初期化て、あるが , これ は xv init 関数によって行う。プログラム中 て、 XV LC LOCALE, とある が , これはとくに日本語を使用て、きるよう List 54 : 55 : 56 : 58 : 59 : 62 : 64 : 65 : 66 : 68 : 69 : 72 : 74 : 75 : 77 : 82 : 83 : 84 : 86 : 89 : 92 : 93 : 94 : 98 : 99 : 100 : 101 : 102 : 104 : 105 : 106 : 107 : 108 : 109 : 110 : 111 : 112 : 113 : 114 : 115 : 116 : 117 : 118 : 119 : 120 : 121 : 122 : 123 : 124 : 125 : 126 : 127 : 128 : 129 : 130 : 131 : 132 : 133 : 134 : 135 103 : #endif select—g2gset(2L) ; select-g2font(2L) ; select—g1gset(3L) ; select_g1font(3L) ; select—g0gset(IL) : select—g0font(1L) ; 96 : #ifdef UNIX 95 : #endif select—g2gset(3L) ; select—g2font(3L) ; select—glgset(2L) ; select—gIfont(2L) ; select—g0gset(IL) ; select—g0font(IL) ; 88 : #ifdef MSDOS draw—picture() : zahYOV-unit(MM, (L) ; start—picture( ”” ) ; set-gsets() : mincho—font—list-declare() : else( gothic—font—list—declare() ; if(Gkyok-font-kind = 1 ) { page—orientation_vector(0L) ; else{ page—orientation—vector(-1L) ; if(Gkyok page_orientation = go—to—vector( ” (") ; print_maisu Gkyok—print_maisu) : return( の ; job-enä() ; return to_text(&p) ; end—picture(); kaipage() ; kaipage(); if(lkaipage = IL)( mkvprint()x + 1 leftmg, ly + lupmg, GkY0k-moj i Ci]) : kazarimoji—set(lpattern, lrinkaku, lkaiten, OL, (L) ; if(lön > の ( moji size vector(lbai); len = strlen(Gkyok-moji[i]); lkaiten = atol (Gkyok-kaiten[il)j) lrinkaku = at01(Gkyok—rinkaku i ) ; lpattern = atoldkyok_pattern i ) ; ly = atol(Gkyok sCi]); lx ニ atol (Gkyok-xs[i]) : 1 i ニ atol(Gkyok-bairitsu[i)); for(i=0;i く 2 ; i + + ) { moji-attrib-level (2Lj; lupmg = atol (GkY0k up_margin) ; lleftmg = at01 (GkY0k—left-margin) ; 1 53 : #endif Gdpi = 300 ; 57 : #ifdef MSDOS shiftjis—on() : 60 : #endif 61 : #ifdef UNIX job-start("31", " 300 ” , 63 : #endif initlaza() ; size mode(); zahyöt-unit " ? 6 " ) ; job-start("31 ” , " 300 " , " 4 " ) : にするための指定て、ある。 こて、も定数が 使用されているが , XView て、は非常にたく さんの定数が使用されている。 XView て、は 関数の種類は非常に少ないが , それぞれの 関数の引数の数が可変て、あり , その位置も 固定されていない。その引数が何を意味し ているかは , その直前の定数によって識別 する方法をとっている。したがって , この 定数自体がひとつの関数のような機能を持 っている感じて、ある。 フレームとは , べースとなるウインドウ のことて、あり , これは xv create 関数によっ て作成する。本プログラムて、は base frame というフレームをまず作成している。そし てこのフレームの中にサプウインドウを作 成するわけて、ある。この作成にも xv creat e 関数を使用する。 サプウインドウにはパネルサプウインド ウ , tty サプウインドウ , テキストサプウィ ンドウなどいろいろな種類のウインドウが 用意されている。どのサプウインドウを作 成するかも定数て、指定する。本プログラム て、は , panel という名前のパネルサプウイン ドウのほか多くのサプウインドウカ q)ase 丘 ame の中に作成されている。 XView て、は , プログラムの最後にイベン ト管理ルーチンをコールする。これは xv m ain 100P 関数によって行う。これによりプロ グラムの中て、は処理のループが繰り返され る状態になる。分岐が生ずるためには , イ べント ( たとえばマウスのボタンを押したな ど ) が発生することが必要て、ある。 実際の分岐は , PANEL NOTIFY PRO C などを指定した後に関数名を指定すること 136 C MAGAZINE 1992 11

9. 月刊 C MAGAZINE 1992年11月号

加クラミンク道場 Dr. 望洋の 空指令の例 文字例のコピーを行う関数 LiSt LiSt さて , たとえば char str [IO] : と宣言・定義された文字列 ( 文字の配列 ) て、 ある str があるとする。 str を空文字列とする ためには , 次のふたつの方法がある。 (a) strcpy (str, (b) str [0] 筆者の知るかぎり , 平均的には (a) のほうが 空文字てはなく , ヌル文字を使うことをお 頻繁に使われているようだ。しかし , 筆者 薦めしたい ならば , 迷わず ( b ) を選択する。 ( b ) が ( a ) に さて , 次のような規則は知っているだろ 比べて優れている点は , うカ 単純な代入であり , 関数呼び出しのオ 【重要】文字定数 ' x ' は , char 型てはな ーバーヘッドがない く int 型て、ある の一言に尽きる。具体的に (a) が行うことを 考えてみよう。まず , ふたつもの引数をス , にェ文字列 (null string) タックにブッシュしなければならない ( 80X 86 系のラージデータモデルならば , それぞ れ 32 ビットずつもある ! ! ) 。そして , List 1 の ようなややこしいループ処理が行われるの 空文字列について考える前に , そもそも これまて、一度も利用したことはな いたカま , 基本に戻って考えれば , ( b ) のほうが素直 文字列とは何だろうか。定義をはっきりさ い。おそらく , List 3 のプログラムは , 筆者 て、ある ( すなわち , プログラマの意図を簡潔 の人生において , 最初て、最後の空指令の利 せよう。 ( a ) 文字列とは , 連続した文字の並びであ に表現している ) ことがわかるてあろう。空 用となるてあろう。空指令を記述するくら 文字列とは「先頭の文字がいきなりヌル文字 いならば , 迷わずに空の行を書く。 る ( b ) 文字列は , 最初に出現するヌル文字ま て、ある文字列」なのだから。 ル文字 (null character) でとする 字列と文字列リテラ 以上のふたつの条件を満たすのが文字列 ANSI 規格の制定にともない , C 言語関係 さて , 空文および空指令は , 参考まてと てある。 の書籍や雑誌記事などては , 文字列リテラ たとえば , Fig. 3 ( a ) は , " ABC " を表す文 いったところて , いよいよ本題に突入して ルとの用語が頻繁に聞かれるようになった。 いく。まずヌル文字を説明しよう。 字列だ。さて , 空文字列とは , Fig. 3 ( b ) の この言葉の意味を理解していない読者も少 ように , 先頭の文字がいきなりヌル文字て、 ヌル文字とは , 値 0 を持つ文字のことてあ なくないのてはないだろうか。 る。このヌル文字の内部表現において , す ある文字列てあるといえよう。ヌル文字と 文字列リテラルは , ふたつの二重引用符 は異なり , この場合は「無効な文字列』て、 べてのビットは 0 てある。 " て囲まれた ( 0 個以上の ) 文字の並びて、あ はなく「空の文字列』てあると , 筆者は感 なお , ヌル文字をエスケープシーケンス り , その終わりには , 自動的に ' \ 0 ' が付加 じるのて , 空文字列という用語を利用して を用いると , ' \ 0 ' と表記する。ヌル文字の される。さて , そもそも文字列リテラルの もっとも一般的な用途は , 文字列の終端を いる。 表すためのものだ。 さて , ヌル文字は , ' a' や ' Z' などの通常 Fig. 3 文字列の例 の文字とは , 明かに区別される , かなり特 (a) 殊な文字てある。筆者としては , $nullcha racter" とは , 「空 ( から ) の文字』てはな く , 「無効な文字』だとの見解を持ってい る。したがって , 日本語て表記するときは , 1 : char *Strcopy(char *d' const char *S) char *P = d; 3 : 4 : 5 : 6 : return (p) ; 7 : 2 : #define MAX 4 : #define MIN 100 0 ラベルっき文における空文 LiSt 1 : #include く stdio. h> 2 : 3 : void func(int n) i nt 5 : 6 : while (n--) ( 7 : 8 : int c; 9 : = 999 ) goto xyz; 10 : 11 : 12 : printf( ” Xd*n", sum) ; 13 : 14 : XYZ : 15 : sum = 0 : 文字列” ABC ” C \ 0 A B 空文字列 (b) \ 0 Dr. 望洋のプログラミング道場 119

10. 月刊 C MAGAZINE 1992年11月号

ファイルの行数を求める関数 ( かなり弱い版 ) List ましよう。ファイル名が与えられて , その ファイルの行数を数える関数 count line を作 ります。行数を数えるのはファイル中の改 行 ( ' Yn' ) の個数を数えればいいとします。 ま i,List 3 のように作った人がいるとし ましよう。これはかなり弱い関数になって います。まず問題になるのは f 叩 en の返り値 が NULL かどうか調べていないことて、す。 これて、は与えられたファイルがなかった場 合 , 何が起こるかわかりません。それから , 行数を数える変数が int 型というのもよくあ りません。 MS-DOS て、は int は 0~32, 767 に なるのがふつうて、すから , 32 , 768 行以上の 大きなファイルて、は誤った行数が求められ こは long 型にすべきて、し てしまいます。 改良して List 4 のようになりました。ファ イルオープンの失敗をチェックして , 行数 を数える変数と返り値を long にしたものて、 す。これて、一応関数としては体裁が整いま した。しかし , 問題点がないわけて、はあり ません。与えられたファイルがないからと いって , この関数内て、終了 ( exit ) してしまっ てよいのか , というのがもっとも大きな疑 問て、す。この count line を小さなツールとし 工ラコードの選び方 ( 2 ) 境界値をはっきりさせる て使う分にはいいかもしれませんが , 大規 「バグは境界て、発生する」というのは鉄則 模なアプリケーションの中て、この関数を使 こて、 , 関数のエラーコードを設計する て、す。ェラーコードの設計て、も , 境目の値 う場合には , いきなり終了しては困るに違 いありません。それて、は , どう考えたらよ 上て、の留意点を整理してみましよう。 には細心の注意を払う必要があります。と くに「 0 に注意せよ」というのが私の意見て、 ( 1 ) 正常値をはっきりさせる いのて、しよう。大域変数て、ファイルオープ 工ラーをエラーだと判断するためには「何 す。先ほどの例題 2 て、も , 行数が ( 正常値と ンがエラーになったことを示せばよい ? が正しいのか」がはっきりとわかっていなけ して ) 0 になる場合があることに注意してく えいえ , もっと簡単な方法があります。 ればなりません。それは前回も「平熱を知ら ださい。この場合 , うつかり 0 をエラーコー 関数 count line は行数を数えるものて、すか ドに割り当てたりしないように注意する必 なければ熱が出たとはいえない」という例を ら , 返り値は必ず 0 以上の値となります。行 あげて考えました。 要があります。 数は負 ( マイナス ) になることはありません。 関数の仕様を書く場合にも「以上」なのか 工ラーコードを設計する場合にも , 正常 そこて、 , マイナスの値を「オープン失敗」の 「より大きい」のかはっきりと書くようにし な値の範囲というものがはっきりとわかっ 意味のエラーコードに使うという案が考え ていなければなりません。例題 2 の行数カウ なくてはなりません。「 0 以上」の場合には 0 られるて、しよう。 List 5 にそれをまとめてみ ントて、も , 行数を int て、取るべきか , long て、 は含まれますが , 「 0 より大きい」て、は 0 は含 ました。これはいわば , long の値の範囲て、 未使用の部分にエラーコードを割り振って 取るべきかが問題となりました。正常値の まれません。間違えやすい場合には「 0 ミ返 り値」などと数式を使って表現するのもよい 範囲をはっきりさせ , それ以外をエラーコ やったことになります。いいて、すか。 1 : int count_line(char *filename) 3 : FILE 4 : 5 : int counter 6 : fp = fopen()i lename, "r") ; 7 : while ()c = fgetc(fp)) ! = EOF) { 8 : if (c ' ) counter 十十 : 9 : 10 : fclose(fp) ; 11 : return(counter) : 12 : 13 : } *fp; ファイルの行数を求める関数 ( 少し強い版 ) List count_l ine(char *fi lename) 1 よりれ 0 4- 一 -0 ^ 0 ー 8 00 0 , 1 つれ 0 4- 戸 0 ^ 0 1 人 1 人 1 よ 1 よ・ー 4 1 よ 1 よ FILE *fp; int c; long counter if ((fp fopen()i lename, ” r ” ) ) "Xs がオープンできません。 *n", filename); fprintf(stderr, exit(-l); while ()c = fgetc(fp)) ! = EOF) { ' ) counter 十十 : fclose(fp) ; return(counter) ; = OL; = NULL) { 112 C MAGAZINE 1992 11