ANSI - みる会図書館


検索対象: 月刊 C MAGAZINE 1991年9月号
24件見つかりました。

1. 月刊 C MAGAZINE 1991年9月号

faces というリファレンスには , feof( ) につ いて次のように書かれています : 「関数 feof は , 引数 stream からのリード 時に EOF が生ずると非ゼロを返し , さ もなくばゼロを返す。」 この AT & T の情報も , 私のような初心者 ューザから見ると , ては , リード時に EOF が生ずるのは , どの時点てすか ? ? ? クとい う , 肝心な疑問を放置しています。 ついてに , ANSIC の標準規格書を見てみ 「 4.9.10.2 feof 関数 ( 中略 ) 帰値 feof 関数は , 引数 stream に関してファ イル終了標識がセットされているなら ば , そのときにかぎり非ゼロを返す。」 そして ANSI の規格書て、は , 別のところ に , ファイル終了標識は , ストリームから もう入力がないときに , 幾つかの関数が返 す 1 , という意味のことが書かれています ( 4.9. もう入力がないとき , ( そう判断されると C 言語フォーラム 15 き ) とは , いつのことてしようか ? 非ゼロを返すタイミングに関しては , ヾ標準ク て , 現時点ての私の見解ては , feof( ) が が存在しないと思います。 ということて に存在してもおかしくない , った仕様の feof ( ) 関数が , どこかの処理系 言い換えると , 上記の日常常識感覚に沿 す。 という疑問がわいてくるわけてあります。 方 , すなわちく標準イディオム > は如何に ? ァイルリードを行うときの , 標準的な書き は EOF マーカーを返さない関数を使ってフ そこて , fgets() 関数のように , 直接的に ということになります。 いう意味ての while ( ) ループの条件には使え を読み取って処理したら処理を終えたい」と は , feof() は , 「ファイルから最後のデータ そして , TurboC/C 十十のような仕様て どこかて , プログラ . ミングの専門教育に 携わっておられる某先生たちの答えの内 , ーっは予想てきます。その標準的な答え〃 は , 「 while ( ) 文の中て fgets ( ) をコールし て , その帰値をチェックしろ」てす。 たとえば : while ( fgets ( buffer, 255 , recfile のように書くのてす。これを , 標準イディ オムとして教えておられる先生方は , どこ かに実際におられるような気がします。 ても , 私が fgets ( ) 関数に関して現在まて 得ている情報からすると , こういう書き方 は気持ち悪いのてす。 fgets(char * s, int n, FILE * stream) ・ の帰値に関する各種情報を , 以下に羅列し てみます : [ TurboC 十十のリファレンスマニュアル ] 「成功した場合は s が指す文字列を返し ます。ファイルエラーの場合は NULL を返します。」 [AT&T C Language lnterfaces] 「エンドオプファイルが生じたら gets も fgets も文字をそれ以上読まず , s に文字 を転送せず , NULL'* インタを返す。 リードエラーが生じたら NULL ポイン タを返す。それ以外の場合は , s を返す。」 [ANSI C] 「 fgets 関数は成功したら s を返す。工ン ドオプファイルに遭遇して配列に 1 文 字も読み込まなかったら , 配列の内容 はそのままて , ヌルポインタが返され る。操作時にリードエラーが生じたら , 配列の内容は不定となり , ヌルポイン タが返される。」 まず , Turbo C 十十のリファレンスは , 工ンドオプファイル ( ファイル終了 ) への言 及がないのて , 論外とします。というより この記述ては , fgets ( ) の帰値を EOF を知る ということになります。 目的には使えない AT & T と ANSI の両文献から明らかなこ とは , fgets ( ) はファイル終了時にもエラー 時にも , 共に NULL を返す , ということて す 0TurboC 十十の fgets() の仕様もこのと おりかどうか , 私は知りませんが ( と , わざ と意地悪くしらつばくれる ! ! ) 。 て、 , なぜ fgets ( ) の帰値をファイル終了チ ェックに使うのが気持ち悪いかというと , 上記の引用を見てお分かりと思いますが , 返された NULL に関して , 工ラーと EOF と の区別がっかないからてす。 feof ( ) が非ゼロを返す時期クについて 標準がある , すなわち , < 最後のデータを読 み取った後て , さらに読もうとしたときに てある > という仕様に全処理系てなってい るのならば , たぶん次のような while() ルー プてよいてしよう : while( fgets ( buffer, 255 , recfile ) ! = NULL & & !feof( recfile ) しかし , 上にも述べたように , 私は , feof ( ) の , 全処理系に共通の標準仕様なるもの を知らないのてす。 て , then,again, ファイル終了を正しくチ ェックしながら文字列読み込みを行うため の , 標準イディオム , ないし標準コンポネ ントの書き方は如何に ? という疑問に落 ちっくのてす。 混乱が自由の 代償である場合 標準イディオム , ないし標準コンポネン トの書き方を知っていたい , ないし , 標準 的なソースて入手しておきたい , という願 望を持つのは , こういうファイル I / O だけて はありません。もっといろいろあります。 読者各位の脳中には , 私のとは違った願望 が , さらに沢山あることてしよう。ソフト

2. 月刊 C MAGAZINE 1991年9月号

ング添削 プログラ うな switch 文て、あれば , と , if という関数を呼び出しているように見 また 7 月号の「明解 ANSI C 言語入門講座」 switch (a) { て、も解説したように , 呼び出される側の関 えるからて、す。 数を前に配置したほうがスマートに記述て case 1 : ■関数と引数の宣 case 2 : きます。 さて toroku 関数は , 単語の登録処理を行 う関数てあり , toroku (file) / * 処理 1 * / break ; / * 処理 2 * / break ; コンパイラは , a の値をもとに分岐するとあ らかじめわかります。したがって , うまく 最適化したコードを出力する可能性があり ます。また if 文のほうは , プログラムを読む 人に , else 以降の判断が •if と switch と = 2 ) else if (b のように a 以外と比較しているのかな , と思 の形式を持っています。田中さんは ANSI ス わせてしまいます。ひとつの変数の値て、単 タイルて、なく , K & R スタイルて、関数を記述 List 1 は文字列中から文字列を探索する 純に多重分岐したいのならば switch 文を使 関数て、す。この箇所に限らず , 田中さんの しています。引数の file には型が与えられて うべきてしよう。 いません。 K & R スタイルで型を指定しなか プログラムは if 文の羅列が数多くあります。 Fig. 2 を見てください ( ここて、は「処理 1 」て った場合は暗黙の内に int 型であるとみなさ a の値は変更しないこととします ) 。 Fig. 2 ー れます。 ①て、 a が 1 てある場合 , まず処理 1 を実行しま ところがこの引数は char へのポインタ型 す。その後もう一度 a が 2 と等しいかどうか を持っファイル名て、す。 8086 用の処理系の を判断します。この判断は明らかに冗長て 場合 , メモリモデルによってポインタは 2 バ す 0Fig. 2 ー②のように if—else—のようにし イト ( int と同じ大きさ ) または 4 バイト ( long たほうがコンパクトて高速になります。 と同じ大きさ ) となります。すなわち , 実はこれはプログラムの大きさや速度だ sizeof(cha 「 * ) sizeof(int) けの問題てはなく , 可読性の問題とも関わ てあれば , この関数は ( おそらく ) 正しく動 作するてしよう。そうてなければ予期せぬ ってきます。 プログラミングの心得がある人に Fig. 2 ー① 値が file に格納されることになってしまいま を説明なして見せると fif—else—て、なく , す。プログラムては toroku 関数の中て , file if をわざわざふたっ並べているのて , 「処理 を引数としてほかの関数を呼び出しますが , 1 」中て a が変更される可能性があるのだな』 このときに正しくない値が渡される可能性 があります。よって潜在的なバクが潜んて と思うてしよう。 不要な条件判断をさせてはいけません。 いるといえます。 現在 ANSI に完璧に準拠した処理系はひと つもありませんが , ほとんどのパソコン用 明らかに冗長な判断をしてはいけない C 処理系ては , ANSI スタイルの関数宣言や 定義が可能てす。 AN スタイルのプロトタ さて C 言語ては switch 文を使っても同様な イプ宣言は好き嫌いの問題ではなく , プロ グラムの信頼性を高めるためだと思ってド 分岐が実現てきます。 if 文を使うべきか , そ れとも switch 文を使うべきか ? シドシ使いましよう。 結論から先にいうと , 大部分の場合て switch 文を使ったほうがよいといえます。 Fig. 2 ー②をよく考えましよう。もし a が 1 て ないとします。 a が 1 てないことを確かめた 後 , 今度は a を 2 と比較します。もし次のよ 推奨 呼び出される側の関数を前に , 呼び出 す側の関数を後ろに配置しよう ! if でも switch でも記述できる箇所は , な るべく switch を使おう また 18 行目の * str 十十の最初の * は余分 てす ( 意味のない評価を行っています ) 。 文字列探索 ( 田中さんのプログラムより ) List instr(str, key) 2 : char *str,*key; 4 : Char *s,*k, int pt=O; 5 : 6 : while(*str) { k=key : s=str; S 十十 : k 十十 : 13 : if(*k== ・ \ 0 つ return (pt) 14 : i f(*k== ・ \ n ・ ) return (pt) : ・ ) return (pt) * st 「十十 : pt 十十 : return(-l) : 20 : Fig. 2 if と if— * 処理 1 * / else if (a ー / * 処理 2 * / ① 1 2 理 2 理 関数は ANSI( プロトタイプ ) スタイルで 記述する プログラミング添削 133

3. 月刊 C MAGAZINE 1991年9月号

SOFT 日 K 本 の 五ロ 1 三ロ ・ C 言語実用マスターシリーズ 齪新 C 言語入門ヒギナー編 複雑な C 言語の規則を整理、厳〕数多くのサンプ ルプログラムを駆使して、、、誰て、もわかる C " を実現し た一冊。 林晴比古著定価 1 , 900 円 ・ポインタ理解の秘伝を伝授 秘 秘伝 C 言語問答ポインタ編 C 言語を習得する上て最大の難関と言われるポイン ポインタ第 タについて、先生と生徒との間答形式て初心者にもわ 柴田望洋著定価 2 ′ 600 円 かりやすく解言 ・ C 言語の秘められた能力を解き放つ C プリプロセッサ・パワー C 言語の中て、も、とりわけ秘められたパワーをもっ プリプロセッサ機能の潜在能力を使いこなすにはどう すればよいかを解言張林晴比古著定価 2 ′ 270 円 ・最新 ANSI C 標準規格に完全対応 詳説 C 言語 H & S リファレンス C 言語プログラマから高い評価を受けている「 C : A Reference M 田 ural 」第 2 版の完訳。 S ・ハービソン & G ・スティール共著定価 4 , 500 円 ・ Turbo C の奧義を示す Tu 「 bO C Ve 「 .2.0 プロクラミング 基本操作はもちろんのこと、内部処理の角斤をはじ め、 BGI の活用方法など上級操作も詳細に解 井上哲理・酒井恵光・佐藤隆共著定価 2 , 900 円 ・初級 C 言語講座 PIay the C ( 上・下 ) C を身につけたい、これまて、の解説書て、はもの足り ない、そんな要求に応え C の世界を系統的にとらえ直 林晴比古著定価各 1 , 550 円 して解説。 ・最も簡潔で、最も完全な ANSI 標準 C の決定版 STANDARD C ANSI 標準 C の特徴をわかりやすく解説した 「 ANSI C の教科書」ともいえる一冊。 P. J. プラウガー・ J. プロディ共著定価 3 , 200 円 ・自然流プログラムのノウハウを公開 C によるプロクラミング・スタイルブック 「美しいプログラムはよいプログラムて、ある」という 持論とその成果を実証する、待望の一冊。全 C プログ 第第會 林晴比古著定価 2 , 300 円 ラマ ! 必、言 ・ MS ー C 活用の王道を示す MS-C Ve 「 .5.1 プロクラミンク の 基村巣作からコンパイラの内部処理まて詳細に解説。 童化のための手法、 ANSI 準拠のプログラミング作 第 石田秋也ほか著定価 3 , 300 円 法なども紹介。 ・ Quick C 活用書の決定版 Quick C Ve 「 .2.0 プログラミング 本書は、主要な機能からライプラリ関数、エラーメ ッセージまて、を網羅した全 C プログラマ必携の書。 本田正隆・三浦義武共著定価 2 , 900 円 C STEP UP シリーズ① 0 上級・ C 言語の応用 50 例 画面制彳扁、ディスクドライフ。制御騙ほか大きく 4 つに分け、それぞれくふうを凝らしてプログラムを作成。 上原・中山・石田・井上共著定価 2 , 480 円 ・ C STEP IJP シリース② + + プログラミン C 十十プログラミンク 今話題の言語、 C + + の本格的入門書。本書の各項目 をカード別にまとめ、サンカレリストや図版を豊富に 掲載。 門内淳・赤堀一郎共著定価 2 , 680 円 ・ C STEP UP シリーズ③ yacc による C コンバイラブログラミング 0 「 C マガジン」連載記事を大幅に加筆。字旬角斤・構 文角斤の基礎からコード生成・化まて、、 C コンパイ ラの内部を徹底詳解。近藤嘉雪著定価 3 , 300 円 ・ BAS ℃からのアプローチ C 言語の活用理解 具体例を数多く取り上げ、 BASIC の知識を有効に 利用しつつ、 BASIC から C へ順次移行て、きるように 保坂光・若林淳共著定価 2 , 060 円 解説。 ・基本からのアプローチ C 言語の基礎知識 短いけれど実用的なサンプルプログラムを紹介しな がら、 C 言語の楚知識を解説。 門内淳・乗呆智・上原哲郎共著定価 2 , 580 円 ・実践からのアプローチ C 言語の応用 50 例 C 言語を使い 98k て、どのようなプログラムが作れる のかを、豊富なサンプル例によって紹介。 上原・石田・乗松・中山・高木共著定価 2 , 370 円 ZO u 市 0 C 五ロ プログラミング スタイルブック

4. 月刊 C MAGAZINE 1991年9月号

ソフト開発用に最適′ 豊富に揃った C 言語用 ライプラリ。 1 . ニ次元クラフィック・ライプラリー 学 五ロ 一三ロ 〔定価 1 万円〕 BAS ℃等でお馴染みのウインドウ機能を 持ったニ次元グラフィックライブラリーで す。特長的機能として、上方向の指定・斜 め方向の楕円描画・曲線描画・多角形塗り つぶし・拡大文字描画およびマウスによる 座標入力機能を持ってし、ます。 〔定価 1 万 2 千円〕 平行投影・透視投影機能等、基本的な 3 次 元グラフィック機能を持ったライブラリー です。直線・円・楕円以外に、指定平面上 の多角形塗りつぶしも可能です。また、マ ウスによる座標入力機能も持っています。 レイアウト等のグラフィック画面表示プロ グラム作成に便利です。 す。キャストするにしても , 必要最少限に しておくべきてす。たとえば , f00 t * f00 ; f00 t * bar ( ) ; newp-> list NULL ; というように分割するべきてしよう。 if 文の式て , (HEAD*)NULL = ()p = malloc( ・ " っていう記述は三田氏の記事の影響かもし れませんが , 私はキライてす。なぜなら , ( f00 t * ) bar ( ) ; f00 というプログラムがあったとします。今は この場所ては hp がもっとも重要な意味を持 きちんと動いてますが , bar の仕様を変更し っているのてすから , 「 hp に ~ する」「 hp を ~ す る」というふうに hp を主体にしてプログラム て , を書きたいし , 読みたいからてす。 bar t * bar ( ) ; この場合 , 主体となる hp が左にあるほう となったとき , 上の foo への代入はコンパイ がいいと思いませんか ? 上の書き方ては ル時にはエラーになりません。そして実行 してみると正しく動かないのて「う ~ ん」と 「 NULL を hp と比較する」と読めますが , 私 は「 hp を NULL と比較する」と書きたいのて 考え込むことになります。 また NULL と各型のポインタとを比較す す。 HEAD 型構造体の中にあるメン '*freeco るときや代入するときに NULL をキャスト していますが , これもあまり好きてはあり unt は , 実際にはメモリプロック中の使用さ れているノードの数を表しているのてすか ません。 ら名前として不適当てすね。 usedcount とか もともと NULL はあらゆる型へのポイン ほかの名前にすべきてしよう タがどこも指していないことを示すために 使われる定数てあり , あらゆる型へのポイ 関数 mem free< は , デバッグ用の出力だ ンタへの代入や比較は許されています。 NU と思いますが , stdout に出力しています。 れはもちろん stderr のほうがいいわけてす。 LL は記号定数て、あり , 各処理系て具合がい 単なるミスてしようね。あ , それともデバ いように定義してあるはずてす。それをわ ッグ情報をリダイレクトてファイルに取る ざわざキャストする必要はないと考えるか ためにわざと stdout に出力しているのかな ? らてす。 うん , それなら納得てす。 もしかするとキャストすることてかえっ て不都合があるかもしれません。 おわりに キャストに関することてすが , 関数 appe nd head の中に 自分の記事に対してお便りをいただくと (NODE *)newp->list 本当にうれしいものてす ( ネタにも使えるし という記述がありますが , これは ANSIC て、 ね誉 ) 。とくに鹿内さんが勉強家ていらっ はエラーになります。 ANSI 規格は「キャストした式は r-value< しやるだろうことは文面からもよくわかり ある」 , つまり「代入てきない」と規定してい 」のセクションはほとんど ます。したがって , この記述はエラーにな るのてす。 趣味の世界になりますからいろいろ書かせ ていただきましたが , お気を悪くなさいま ANSI 以前というか , 現在てもそうてす せんように ( 笑 ) 。今後ともどうぞよろしく。 が , キャストした式がト value になる処理系 はいくつかあるようてすが , ポータビリテ 皆さんも , いろいろと質問をお寄せいた だけましたら幸いてす。とくにネタに使え ィを考えるならば「拡張機能 ( なのかなあ ) 」 は使ってはいけません。これはめんどうて そうなもの大歓迎てす ( 誉 ) お待ちしてお ります。 2. 三次元グラフィック・ライブラリー 3. キーボード入力ライブラリー 〔定価 7 千円〕 キーボード入力の煩わしさを解消するため のライブラリーです。パラメータの設定に より、カーソルを指定位置に配置し、指定 範囲から出ないようにしたりします。また、 ファンクションキーその他の特殊キーに対 するコード設定等も可能です。 4. マルチ画面ライプラリーキャラクタータイプ 〔定価 2 万円〕 マルチ画面入力を支援するためのライブラ リーです。マルチ画面を階層的に表示し、 メニュのマウスクイックが可能です。 ■その他、グラフィック・マウス・ RS -2 C のドラ イバー・印 OS 等を C 言語からコールするためのラ イブラリーも揃えています。 ・出荷品には取り扱い説明書及びサンプルソフト (C 言語ソース ) が付いています。具体的な使用方法の 確認、テスト等はサンプルソフトで簡単に行えます。 ■上記のライプラリーは NEC の PC -98XA 、 PC- 01 LV で開発、動作確認しています。ハイリゾモ ード、ノーマルモード両タイプを用意しています。 OS は MS-DOS(Ver3. 3A ) 、開発ツールは MS - DOS マクロアセンプラ ( Ver2.0 ) 及び MS-C (Ver5. 1 ) を使用しています。 PC シリーズの他の 機種での適合性は確認していません。 ☆詳しい資料をこ用意致しております。 お気軽にお申し込みください。 ☆購入後、使用不適合とわかった場合は一週間以内に こ返送ください。 ( おそれ入りますが送料はこ負担願います ) ※ MS-DOS および MS-C 、 MS-DOS マクロアセ ンブラはマイクロソフト社の登録商標です。 資料語求はに広告資料請求カード」をこ使用すが、 または直接下記住所まで封書にてこ連絡下さい。 ※電話は対応不可能な場合がありますので御遠慮くだ 〒 571 大阪府門真市下島町 9 の 16 石川昭 ( TEL0720 ー 81 ー 87 留守番電話 ) く資料請求番号 1 14 〉 「そのほカ 114 C .MAGAZI 、 E 円 9

5. 月刊 C MAGAZINE 1991年9月号

新種・発見 / LSI C ー 86 ノ←ジョンアップで進化中。 LSI C ー 86 は、 ROM 化に最適の C コンパイラ 速かっコンパクトなオフジェクト・コード生成のために 工ル・エス・アイジャパンか開発しました レジスタの自動割り付けなど豊富な機能力ま プロフェッショナルのソフトウェア開発を 効果的にサポートします 0 Y48 , 000 LSI C ー 86 Ver. 3. 3 ・言語仕様 ANSI 標準規格に準拠したフルセット・コンパイラ ( 多パイト文 字除く ) far/near/recursive/nonrec を追加 ・アセンプラ 8086 / 80186 / 80286 用のアセンフラて 8087 / 80287 用の命 令もサホート ・リンカ標準装備 リンカは . EXE ファイル以外、コアイメーシ ( パイナリ ) または intellec HEX ファイルを生成 ターケットシステムに合わせたメモリ配置の ROM モシュールを乍成 ■プロファイラ標準装備 プロクラムの実行をモニタするツール プログラムのどの文を何回実行したかをカウント ーライプラリ ANSI 標準規格で定義された関数のうち多パイト文字関係と く loca h 〉を除く、すべての関数を用意、さらに IJN Ⅸて用意され ている関数や、 MS-DOS とのインターフェース関数等、数多くの 関数を用意、ライプラリのソース付き ■ ROM 化をサホート ROM 化のための初期設定モジュールのソース付き ・走行環境 MS-DOS Ve 匚 2.11 以上、メモリ 384KB 以上必要 ・供給メラア 5"2HD, 3.5"2HD,etc. * 表示価格に消費税は含まれておりません。 * UN Ⅸは AT & T ベル研究所で開発されたオヘレーティングシステムの名称です。 * MS - DOS はマイクロソフト社の登録商標です。 * その他、商品名は各社の商標です ■開発・発売元 工ル・エス・アイシャパン株式会社 〒 151 東京者 5 渋谷区千駄ヶ谷 1 丁目 8 番 14 号 TEL 03 ー 3404 ー 1319 ( 直通 ) ・ FAX 03 ー 3478 ー 0576 ・登録ユーサーの方には、ご案内申し上げま く資料請求番号 F03 〉

6. 月刊 C MAGAZINE 1991年9月号

ne Oint dition OE P : 汎用 FEP 制御ライ方リ構 本年 3 月号の特集および汎用 FEP 制御ライプラ リ「 FEPCTR 凵は , 日頃 FEP の制御に苦労 されていた読者に高く評価された。今回は 3 月号 特集のフォローアップとして , プログラムの変 更点および新たな FEP の制御情報を紹介する。 はじめに ーコ 日本語入力 FEP を取り巻く状況は現在も 刻々と変化しています。市場に目を向ける と ,MS-KANJIAPI をサポートした日電版 MS-Windows Ver. 3.0 の発売以来 , MS- KANJI API の注目度は一段と増していま す。雑誌などて、も MS-KANJI API を必須と する論調の記事が確実に増えています。 新しく発売された FEP にも WX Ⅱ , Katana4 など MS-KANJI API をサポートす るものが増えてきました。また , 新しく発 売されるアプリケーションのかなりのもの が複数の FEP を制御するようになっていま す。これらの傾向はソフト業界の「たかが FEP 」 から「されど FEP 」への確かな姿勢変化を示 すものて、 , 筆者としてもこのような状況を 喜ば・しく思っています。 さて , FEP 制御ライプラリ「 FEPCTRL 」 はその後も改良を加えられ , 対応する FEP もいくつか追加されました (TabIe 1 ) 。プロ グラムにもかなりの変更が加えられており , 新たにいくっかのコンパイラに対応してい ます。そこて、 , 今回は本年 3 月号特集のフォ ローアップとして , プログラムの変更点お よび新たな FEP の制御情報について述べた 3 月号特集て、紹介し , また付録ディスクて、 配付した「 FEPCTRL Ver. 1.2 」と比べ , 今 回紹介する最新バージョン「 FEPCTRL Ver. 1.4 」は , プロトタイプ宣言を用いる ANSI C 規格に合致するようにソース全体を書き換 えています。対応コンパイラは , TurboC 十十 Ver. 1.0 , BorIand C 十十 Ver. 2.0 , MS -C Ver. 6.0 , QuickC Ver. 2.0 , Lattice C Ver. 4.1 , LSI C ー 86 Ver. 3.2 試食版が追加 されています。個々のコンパイラに依存す る部分はすべて # if / # ifdef て、条件コンパイル て、き , Turbo C 十十 , Borland C 十十て、は C 十十モードて、コンパイルすることも可能て、 す。また , MS-CVer. 5.1 て、コンパイルし た場合て、もアセンプラコードを追加するこ となく ATOK7, FIXER の関数呼び出しに よる直接制御が行えるようになりました。 「 FEPCTRL Ver. 1.2 」は QuickC Ver. 2.0 , MS-C Ver. 6.0 て、は , ANSI C 規格準 拠の度合いを強めていたため , MS-C Ver. 5.1 より厳密な型のチェックが行われ , 工ラ ーとなりコンパイルて、きませんて、した。ま た , 「 FEPCTRL Ver. 1 . 2 」て、は static int 型 の関数を暗黙に宣言された int 型の関数とし て関数定義より前て、呼び出していたために 「 FEPCTRL Ver. 1.2 」 からの変更点 型の不一致というエラーが発生していまし た。「 FEPCTRLVer. 1.4 」て、はこの不具合 は解決されています。 MS-C Ver. 5.1 て、の ATOK7 , FIXER の 関数呼び出しによる制御 , または , Lattice C Ver. 4.1 て、のソフトウェア割り込みの禁 止 / 許可などについては , 該当する機能がコ ンパイラに用意されていなかったため , か なりトリッキーな方法によって実現してい ます。その方法とは , これらの処理を行う 機械語コードを静的データ領域に置き , そ の先頭アドレスを関数アドレスとして呼び 出すというものて、す。通常の MS-DOS の規 約て、は問題になることはありませんが , コ ードセグメントとデータセグメントを独立 して管理するようなメモリ管理環境て、は問 題が起こるかもしれません。 また , AX マシンや IBM PS / 55 シリーズ の ATOK などに対応した結果 , 同じデバイ ス名を持ちながら異なるソフトウェア割り 込みによって制御を行う必要が生じました。 このため , メモリ上の識別文字列を優先す るように FEP の組み込み判定の順序を変更 すると同時に , 一部の FEP については制御 のためのソフトウェア割り込み番号を組み 込み判定の際に取得し , 制御のコードを共 有しました。 そのほかのおもな変更点には , MS-DOS いと思います。 C MAGAZINE 70 1991 9

7. 月刊 C MAGAZINE 1991年9月号

の宣言の値〔宣言された変数の値〕は , そ のどちらの場合て、もまったく同じゃり方て、 , bin に代入されます。 TOOL DEF *bin [ 3 ] ; 「 bin は」からスタートします。その次に どちらの記号を見ますか , * て、すか , それ とも [ 3 ] て、すか ? TabIe 1 によれば , [ ] の方が * より優先しているのて、 , そこて、ま ず [ 3 ] を先に扱って〔 = 、、配列てある〃を 優先して〕「 bin は TOOL DEF を指すポイン タの配列て、ある」となります。配列のサイズ まて、入れて文章化するなら , 「 bin は , TOO L DEF を指す三つのポインタの配列て、ある」 となります〔訳注 : 日本語て、は , 優先され た側の事項が , 文章の終わりにきて , いわ ゆる、、決めクになる , という点に注意して ください例 : bin is an array etc. etc. ・ のように , 英語ては、、配列てある〃が文章 の先頭に来る。そして日本語て、は「 bin はナン トカカントカ・・・・・・配列て、ある」というよう 、、配列て、ある〃が文章の最後の、、決めク ec 曲 0 Made Easy 19 : { / * ANSI C ニ bina(); * / / * ANSI C = binb(); * / printf( "d should = 123 : (Xd)%n, d ) ; 26 : ) 29 : ( 34 : ( 38 : ) C の宣言を解読するためのサンプルプログラム List 1 5 : TOOL—DEF *(*(*BINA_DEF)(void) (void) ; 4 : ) TOOL_DEF; fieldl_def fieldl; s truct{ 1 : tYEEdef int fieldl—def; 2 : 3 : 10 : 20 : 22 : 23 : 24 : 25 : 28 . 30 : 32 : 35 : 36 : 9 : TOOL—DEF *C—DEF; 8 : TOOL—DEF *B—DEF; 7 : TOOL—DEF *(*BINB DEF) (void) ; 6 : TOOL—DEF *(*A—DEF) (void) : 12 : BINA_DEF bina; 11 : fieldl_def d; 13 : A_DEF 14 : BINB DEF 15 : B DEF 16 : C_DEF 18 : main() a(void) ; binb; b(void) ; の部分に来る〕。 bina = a; binb = (*bina) ( ) : d = c- 〉 fieldl; return( & t81 ) : t001. fieldl = 123 : TOOL_DEF t001 : 33 : B-DEF b() return( b ) : ・ A-DEF a() return( 0 ) ; / * 訳注 : ローカル変数のアドレスを返すのはバグじゃないの ? * / typedefTOOL DEF * BIN DEF [ 3 ] ; BIN DEF bin ; この宣言は次のように読みます : 「 bin は B IN DEF 型て、ある。そして BIN DEF は成分 が三つある配列て、あり , その各成分は TOO L DEF を指すポインタて、ある」。 TOOL DEF ( * bin) [ 3 ] ; こての違いは , カッコがあることて、す。 カッコて、囲まれていると , * が [ ] よりも 優先し , したがって , 、、ポインタて、あるクが 優先します。そこて、上の宣言は「 bin は , TO OL DEF 型データ三つから成る配列を指す ポインタて、ある」と読みます。 TabIe 1 記号の順序 typedef TOOL DEF (*BIN DEF) BIN DEF bin ; 指すポインタを返す関数て、ある」と読みま が優先し , 宣言は「 bin は , TOOD DEF 型を ( ) は * に優先します。そこて、、、関数て、あるク ちらを先に考えますか。 Table 1 によれば , 「 bin は」からスタートします。 * と ( ) のど TOOL DEF *bin() ; て、ある」。 その配列の各成分は TOOL DEF 型のデータ 成分が三つある配列を指すポインタて、あり , BIN DEF 型て、ある。そして BIN DEF は , この宣言は , 次のように読みます : 「 bin は す。 typedef TOOL DEF *BIN DEF ; BIN DEF bin() ; DEF を指すポインタてある」となります。 の関数て、ある。そして BIN DEF は , TOOL この宣言の読み方は : 「 bin は BIN DEF 型 typedef を関数に用いる場合ーーーたとえば B IN DEF bin( ) の場合のように BIN DEF と bin ( ) を次のように定義したら間違 いて、あることに注意してください これは間違い typedef TOOL DEF * BIN DEF( ) ; BIN DEF bin ; のように typedef してから , 関数 bin を次のよ / * 関数 bin ( ) * / BIN DEF bin() うに宣言する 記号 く type> 文 ~ の配列 ~ を返す関数 ~ を指すポインタ く type> 順序 1 2 3 1 方向 後置 後置 前置 前置 BIN DEF bin ( ) と BIN DEF bin は , じものて、はありません。 TOOL DEF (*bin) ( ) ; これも「 bin は」からスタートします。 同 * b in がカッコて、囲まれているのて、 , 関数記号 ( ) 16 C MAGAZINE 1991 9

8. 月刊 C MAGAZINE 1991年9月号

を著作権者 ( 東出浩一氏 ) の了解を得て収録 ' 91 年 9 月号特別付録 ( 5 气 .2M 8 セクタ / ト タ ( 著作権者 : 立野繁之氏 ) およびサンプル しました。 の日本語 MS-WINDOWS Ver. 3.0 用アイ ラック MS-DOS フォーマット ) には , 次のプ 付録ディスクに収録した YBDIFYBDIF& コンて、す。 ログラムが収録されています。ご使用にあ BUP. R は自動解凍圧縮ファイルて、す。 たっては , 自動解凍圧縮ファイルの解凍方 付録ディスクに収録した YBOHYOHYB OHYOH. EXE は自動解凍圧縮ファイルてす。 法など , さらに詳しい説明が収録してある 汎用 FEP 制御ライプラリ 付録ディスクの README を必ずご一読くだ 「 FEPCTR 凵 弊社刊「 Hype 「 MS-DOS 』 最新バージョン 本誌 ' 91 年 3 月号て特集し , 反響の多かった 特集「フィルタ系言語」 日本語入力 FEP 操作ライプラリ「 FEPCTR 弊社刊「 Hyper MS-DOSJ に添付されて JPERL, RSWAP, EXEXE L 」が対応コンパイラおよび対応 FEP を増や いるフリーソフトウェアのうちバーション しバージョンも 1.4 となりました。バージョ 本誌特集「フィルタ系言語研究」をご覧い アップされたものを収録しました。詳しく ンアップにともなう変史点 ( 対応コンパイ は次ページ「弊社刊「 Hyper MS-DOS 』添 ただけたて、しようか ? フィルタ系言語と ラ , FEP など ) は本誌掲載記事「続・汎用 FE 付フリーソフトウェアバージョンアップ」を は「 MS-DOS や UNIX によく現れる均一なテ P ライプラリ構築」および解凍後生成される 読ください キストファイルの処理に関してはほとんど ドキュメントを参照ください。 FEPCTRLV 万能の言語」だそうてす。今回は特集て紹介 付録ディスクに収録した YHMSDOSYH er. 1.4 は付録ディスクに著作権者 ( 太田純 MSDOS. EXE はディレクトリ名を有効にし したソフトの中から , Larry WaII 氏による 氏 ) のご好意により収録しました。 perl の日本語対応版 (MS-DOS 版実行形 た自動解凍圧縮ファイルて、す。解凍方法に 付録ディスクに収録した *FEPCTRLYF ついては README をご参照ください。な 式 ) , 子プロセス起動時に自動的に親プロセス EPC14. EXE は自動解凍圧縮ファイルて、す。 を EMS またはディスクファイルへ SWAPO お , 今回収録したソフトはディスク容量の 関係て 3 本のみとさせていただきましたが , UT するための TSR, . COM, . EXE, . BAT X68000 に移植された ディスク容量に許しがあれば以後継続して 以外の拡張子を持っファイルを実行て、きる GNLJ C CompiIe 「⑤ ようにするプログラムを著作権者および移 収録する予定てす。 本誌「 GCC て、学ぶ 68 ゲームプログラミン 植者 ( 田中良知氏 , 三戸部謙次氏 , 小林佳則 本誌掲載プログラム グ」の筆者 , 吉野智興氏のご好意により収録 氏 ) の了解を得て収録しました。 した XGCC のソースファイルてす ( 実行ファ 付録ディスクに収録した YTOKUYJPER イルは本誌 ' 91 年 5 月号て収録。 gcc ccl. x L11. EXE, YTOKUYRSWAP115. EXE, : C の宣言がわかるコツ DECLA のバグフィックス版を本誌 ' 91 年 7 月号ぞ収 *TOKUYEXEXE230. EXE は自動解凍圧 : 堂々と goto 文を使おう GOTO 録 ) 。 XGCC 関連のソースファイルだけて、も 縮ファイルて、す。 BASIC7 : 速報日本語版 MS-BASIC7 膨大な量なのて、 , 一度て、収録するすること TOKUSYU : フィルタ系言語研究 ファイル更新ユーティリティ がて、きません。複数のファイルを本誌 ' 91 年 MSDOS : 新 MS-DOS 入門 「 BDIF@BLJP 」 5 月号に収録した LHA て圧縮したものを収 : GCC て学ぶ 68 ゲーム X68K 録します。次号以降てもこの形式て継続し : 応用 C 言語 C の道具箱 本誌 ' 91 年 5 月号 , 7 月号収録の「 X68000 に OUYOU て収録する予定てす。 移植された GCC 」は好評をいただきました : 恥かしながらドジりました DOJI が , 同時に不具合のご報告もいただいてい S PARC : パソコンから WS 「 ANSI C 言語入門講座」 ます。より完成された XGCC を提供するため ・ C 言語雑学講座 CZAT U 活用集⑥ に移植者て、ある吉野智興氏と協議した結果 , : 明解 ANSI C 言語入門講座 MEIKAI 今後 XGCC のバグフィクスをバイナリデータ ようこそ BohYoh ( [ ばうよう ] と読みま ; スタートアップ C 十十 CPP の差分情報て、提供いたします。そこて , バ す / 本名て、す ) ディレクトリへ ! 毎月 , 初 TEN SAKU : C MAGA セミナールーム イナリデータの差分情報を作り出すプログ 心者のためのガイド ( 文書 ) やユーティリテ : 開発環境レポート DEVELOP ラム「 BDIF 」と BDIFC' 作成された差分ファ イなどを提供するディレクトリてす。 : 丹羽信夫の発想快発 N IWA イル ( 拡張子が BFD て、あるファイル ) をもと 今月の BOHYOH ディレクトリは , 日本語 : C マガ電脳クラブ PUZZ LE に対象ファイルをアップデートする「 BUP 」 MS-Windows Ver. 3.0 用アイコンエディ INFO : インフォメーション 158 C MAGAZINE 1991 9

9. 月刊 C MAGAZINE 1991年9月号

明解 )IC 言語 入門講座 List カンマ演算子の使用例 、ンマ演算子 Table 2 の演算子の表の最下段に , ( カン マ ) という演算子があります。これはカンマ 演算子と呼ばれる演算子て、す。一般に 0P1 , 0P2 という式は , 式叩 1 を評価した後に叩 2 を評 価し , 0P2 の型と値を持ちます。 たとえば i が 3 て、 j が 5 の時 , 次の式 i 十十 , j は i をインクリメントし , 5 という値を持ちま す。次のほとんど意味のない式 は 2 の値を持ちます。 カンマ演算子と for 文 カンマ演算子の動作・機能だけを解説し てもまったくありがたみがありません。実 際にはどのようにカンマ演算子を使うのて、 しようか。先ほどの説明からもわかるよう 0P1 , 0P2 は「ひとつの」式て、す。「ひとつの」という言 葉にピンときましたか ? 4 月号て、「複文は 「ひとつの」文となるのて、 , 文法上ひとつの 文のみ書くことのて、きる箇所にふたつ以上 の文を書きたいならば複文を使えばよい」と ' とを解説しました。カンマ演算子 いった て、も同じようなことがいえます。カンマ演 カンマ演算子と区切り子 次の宣言 での , ( カンマ ) は i と j を区切るためのも のであり , 区切り子 (punctuator) と呼ば れるものであり , 演算子ではないことは 一目瞭然です。 このように C 言語では , ( カンマ ) や [ ] ( プラケット ) , ( ) ( カッコ ) などは演算子 にも区切り子にも使われています ( 分脈で 区別できます ) 。 1 : # i ncl ude く stdio. h> 2 : 3 : int main(void) 5 : 6 : 7 : 8 : 9 : int ニ 0 : i く 1 0 : i 十 + , j + 十 ) = %dYn ” for (i printf(" i return ( 0 ) : List 間違ったマクロの利用 1 : # i ncl ude く stdio. h> 2 : 3 : #define dput(x,y, s) { locate(). y) : printf(s) : } 4 : #define disp(x,y,c,s) { locate(x,y) : c 引 0 「 ( c ) : printf(s) 5 : 6 : / * - ーー表示色を設定する一一 * / 7 : void color(int c) 9 : static char printf ("YxlB[ つ : putchar()c く 10 ) ? ・ 3 ' putchar(cindx[c % 10 ] ) : putchar('m') : 1 7 : / * ーーカーソルを (), y) に位置づける 18 : void locate(int x, int y) printf("YxlB[Xd;XdH" 20 : 22 : 23 : int main(void) 24 : { 25 : 26 : 28 : 30 : 32 : 33 : 34 : } cindx[] ” 0415263777 ” : i nt X : dput(l, 1 , " x を入力して下さいつ : scanf("Xd" i f (x く 10 ) disp(), 3 , 2. " x は 1 0 未満です \ n つ : e ー se disp(), 3 , 3 , " x は 1 0 以上です Yn") : return ( の : List 正しいマクロ (locate(x, y), printf(s)) (locate(x,y). color(c). printf(s)) 1 : #define dput(x,y,s) 2 : #define disp(x,y,c,s) 明解 ANSI C 言語入門講座 121

10. 月刊 C MAGAZINE 1991年9月号

明解 C 言言ロ 入門講座 0 柴田望洋 初級 9 級 8 級 7 級 6 級ー 5 級 4 級 3 級 2 級 1 級初段 2 段 く第 6 回〉簡単な問題を解きながら学ぼう / 前回は C 言語の難関のひとつである「ポインタ」の基本的な事項を解説しました。今 回は少しばかりゆっくりと話を進めます。比較的簡単な問題を考えなから , これま での復習や補足などを行います。 LiSt 次の日を求める ( 第 1 版 ) ー配列 まず次の問題を考えましよう。 年月日 ( 西暦 ) を読み込み , その次の日 を表示するプログラムを作成せよ。た だし年月日は正しい日付 ( 13 月などて、は ない ) が与えられるとしてよい 1 : #incl ude 2 : ー year が関年であれば 1 をそうでなければ 0 を返す一 4 : int isleap(int year) if (year % 4 6 : = 0 & & year % 100 ! = 0 Ⅱ year % 400 = return(l) ; 7 : 8 : e ー se 9 : return(0) : 10 : } ー *y 年 *m 月 *d 日の次の日を求める 13 : void nextday(int *y, int *m, int *d) if ( * 田 = 12 & & *d ニ 十十 * y : ニ *d } e lse i f ( ( * d = 30 & & (*m==411*m==6 ll*m==911*m==II)) Ⅱ ( * d = = 31 & & ( * m = = 1 Ⅱ * m = = 3 Ⅱ * m = = 5 Ⅱ * m = = 7 Ⅱ * m = 8 Ⅱ * 舮 = 1 の ) ) { / * 月の繰り上げ * / 十十 * : 22 : *d } else if (*m 23 : 24 : 十十 * m : 25 : *d } else { 26 : / * 月も年も繰り上がらない * / 27 : 十十 * d : 28 : 30 : int main(void) 32 : 33 : 34 : 35 : 36 : 37 : 38 : 39 : 40 : く stdio. h> / * 年の繰り上げ * / 一見簡単な問題てすが , すぐにプログラ ムを作ることがてきますか ? この問題は , 大学の研究室のゼミて私が毎年飽きもせず 出題しているものてす ( 誉 ) 。ほとんどの 学生が List 1 のようなプログラムを作成しま す ()f 文がもっと複雑になってプリンタ用紙 1 枚に入らないような人もいます ) 。 論理演算子 さて 4 ~ 10 行目が関 ( うるう ) 年てあるかど うかを判断する関数てす。 6 行目て使ってい る & & 演算子とⅡ演算子は , 本講座て初めて 出てきたものてす。これらは論理演算子と 呼ばれる演算子て , & & を論理積演算子 (log ical AND 叩 erator) , Ⅱを論理和演算子 ( logical OR operator) と呼びます。日本語 風にいうと , 前者が「かっ」 , 後者が「または」 = 2 & & i 引 eap (*Y) + 28 = (d) { / * 月の繰り上げ * / int printf(" 年 : " ) : scanf("%d" printf(" 月 : " ) : scanf("%d" printf(" 日 : " ) : scanf("%d", &d); nextday(&y, &m, (d) : printf(" 次の日は : %d 年 Xd 月 Xd 日 Yn", y, m, d); return ( の : 明解 ANSI C 言語入門講座 115