-3 - みる会図書館


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

1. 月刊 C MAGAZINE 1991年12月号

い動作が期待て、きないことはいうまて、もない 正しく行われなくなるようだ。また , せっ ものもあった。 SOURCER が出力する逆ア かく表示される 2 バイト文字が泣き別れとな センプルリストはこれらと比べて抜群のて、 定義ファイル る状態も見られ , どうも付け足しの感があ きて、あると思う。 SOURCER にもいくつか欠点はある。ま SOURCER て、はあらかじめ定義ファイル どうしても -j オプションを使いたければ , ず , 速度が非常に遅いことて、ある。拙作 LH を用意しておくことにより , より正確な解 まずー j オプションなして、逆アセンカレを繰り 析がて、きる。もちろん逆アセンプルを始め A. EXE を SOURCER にかけてみたが , 終了 返し , ある程度正確な逆アセンプルリスト するまて、に数時間を要した ( 80386SX 12MH る前には , ほとんど何の情報もないのて , 一度逆アセンプルした後て、定義することに z, sdefault. def 使用て、 5 PASS を指定 ) 。デ が得られるようになってから -j オプションを つけて SOURCER を起動するのがいいよう ータ領域中もコードと誤認してスキャンし なる。 SOURCER は逆アセンプル時に拡張子 に思われる。このとき , 定義ファイルの中 てしまったこともひとつの原因てはあるが , の解析オプション。を O に書き換えるのを忘 それにしても遅い。レジスタのエミュレー が . SDF というファイルを出力してくれる。 この拡張子を . DEF に換えてやると , 新しい れてはいけない ションのため , やむを得ないのてあろうが , 大規模なアプリケーションを逆アセンプル 定義ファイルとして使えるようになってい SOURCER の使用感 る。したがって , 正しく逆アセンプルされ するのには向かない 0 なかった箇所を見つけて , この定義ファイ また前述したように , せつかく苦労して ルを修正していくとよい これまて、に述べてきた問題点は SOURCE アドレスが変わらないように努力している R に限ったものて、はなく , 逆アセンプラ全般 のだから , 冗長なコードにも完全に対応し 日本語対応 に関することてある。 てほしかった。 筆者はこれまて、 , 自作のものも含めてい SOURCER 起動時に -j オプションを指定す こまて、この紹介記事を書き進んだが , ろいろな逆アセンプラを使ってきたが , 自 ると , DB のところにカナや 2 バイト文字が SOURCER には実にたくさんのオプション 動生成したアセンプラソースがアセンプル 文字列として出力されるようになる。ただ があり , また定義ファイルにもいろいろな し , 解析オプションが連動して起動するよ 時に多数のエラーを出してしまい , 通らな 設定が可能なのて、 , 記事を書いているうち うなのて、 , コードとデータの分離があまり に新しい方法に気づき , 書き直したところ ことが多かった。また , 可読性に乏しい もかなりある。使い込みが足りないために 自動修正されなかった冗長なコード (BP. EXE) SOURCER の能力を過少評価している部分 もあるかもしれないが , ご容赦いただきた い。それだけ奥が深いソフトて、ある。 完全に使い込むにはかなりの努力を要す るが , これから逆アセンプラを入手しよう と考えている方には , 買って損のない商品 といえるだろう。 0 0 0 List ーく逆アセンブルリスト > ーー 50EF : 10B8 10C ー 154 : 50EF : 10B8 8B CI mov ax,CX 50EF:10BA BA 0003 mov dx,3 50EF:10BD F7 E2 則 1 dx 50EF:10BF 8B FO mov 50EF : 10C1 03 F3 add Si,bX 50EF : 10C3 DI E6 shl 50EF : 10C5 8B 84 0058 ax, Cs i + 58h ] mov こが 1 バイト冗長 50EF : 10C9 A3 0056 mov ds:data—20e, ax 50EF:10CC 10C ー 155 : ーくによる再アセンブルリスト > ー 10B8 10C ー 154 : 10B8 8B CI mov ax, CX IOBA BA 0003 mov , 3 IOBD F7 E2 mul dx IOBF 8B FO 田 OV 10C1 03 F3 add Si,bX 10C3 DI E6 shl si,l 10C5 8B 44 58 ax, [s i + 58h ] : 以降 1 パイトずれてしまった 10C8 A3 0056 ds:data_20e, ax mov IOCB TSOURCER 』 対応機種 PC ー 9801 シリーズ , FMR シリ ーズ , J ー 3100 シリーズ , pana comM シリーズ , PS / 55 シリ ーズ , AX マシン 動作環境日本語 MS-DOS Ver. 2 / 3 / 4 , DOS/V J4.0 メモリ : 512K バイト 価格 38 , 000 円 問い合わせ先 #LIFEBOAT 〒 101 東京都千代田区神田錦町 3 ー 6 TEL 03 ー 3293 ー 4711 10C ー 155 : 140 C MAGAZINE 1991 12

2. 月刊 C MAGAZINE 1991年12月号

1991 年 12 月 1 日発行 ( 毎月 1 回 1 日発行 ) 第 3 巻第 12 号通巻 27 号 1990 年 2 月 2 日第 3 種郵便物認可 提携・ LANG 誌 / 監修・石田晴久 C 言語技術情報誌・ C マカシン 1991 DEC. Vol. 3 No. 12 980yen 0 特集 最新コンハイラオハビュー —・コンバイラトレンド Ⅱ・主要コンバイラガイダンス Ⅲ・性能評価 速報日本語版 Mic 「 osoft FORTRAN Ve 「 .5.1 / djgcc 詳解講座 He 0 GCC wo d ・ライプラリ関数 提携記事 >Making a Hash of Your Data >Managing Software Projects with PIMs アルゴリズムとテータ構造入門・ヒープソート / AN CI Mo 「 e ・キャスト / 明解 ANSI C 言語入門講座・構造体と共用体 寺月リイ寸録・ 5 " ティスク . ⑧・叭 N c 言語入門講座。活用集・ 1991 年 c MAGA 刀 NE 総目次・本誌掲載ソースプログラム

3. 月刊 C MAGAZINE 1991年12月号

[ ] ( 」 0 Ⅷ N 離 12 月号 11 月 8 日発売 特集 ・連載・ アセンプラ & ティスアセンプラ *STANDARD C *BART EXPRESS 第 16 回 ☆Ⅵ N Ⅸ通信第 11 回 *D 「 . C's Pointe 「 s 作者が語る Sou 「 cer と ZZ386 ☆たのむせ / DOS/V/ その 5 *Questions & Answe 「 S •FCO DE サンプル版 *P 「 og 「 amming StYle 第 5 回 *Pascal 言語系の制作第 3 回 スクリーンエデイタ Tu 「 b0486 のすすめ / 兵藤嘉彦 N Ⅸ 386 on 旧 M ー PC / 木村孝道 •CLJG PDS # 335 スクリーンエテイタ FCOOE 制作記 / 関谷真 Frankenstein Cross Assemblers ・ CLJG PDS # 348 移植記、旧 M - PC から 98 へ 8048 Disassembler/z80 Assembler ・掲載記事の全コード収録 株式会社ビレッジセンタ - 出齷 〒 101 東京都千代田区三崎町 3 ー 1 ー 16 神田アメレックスビル 2F ・営業部 : 03 ー 3221 ー 1825 ・編集部 : 03-3239 ー 1950 OTC 80486 MINI TOWER \ 556 , OOO ( 税別、 送料込み ) 納期 . 3 週間以内 OP 引 ON 保証 : 1 年 ( 国内保証 ) \ 0 : 486 3 z ー〉 1 \ 120. 网 C : 25 8 - 〉 3 \ 320 , : ( 1 県 70ns) FUJITU 35 5 “ー \ 146. 网 TO 32 FUJITU ー 5 ”ー \ 316. 0 引 : A F ー刊 1.2B 5 “ー \ 456. 0 T ヨ圧 5 ” 1. \ 15 , 网 I/F ・「 ia は 2 / Pa 「 a 日引 * 1 / は 1 ATI VG.A mR SPER VG.A C*RD Ⅵ匠 0 : 512KB SPER VGA ⅵ th ー \ 55 , ( 1024 1 6 ) HITAOII 1 矚 14 “ CRT \ 85. 側 0 O:FUJITU 18 一 ( 1024 * 7 0 * 0 日 ) : 3.5 “ 1.4 引 ー 5.0 \ 32 , 0 KEmARD: 101 科圧 \ 18 , 400 お 5.0 \ 17. 0 定価 980 円 ( 本体 951 円 ) 特別 付録 DISK 1 月号 12 月 8 日発亮 特集 C JOURNAL は毎月 8 日全国の書店でお求めになれます。 お申し込みは、住所、氏名、話番号等を明記の上、 FAX または封書にて承ります。 折り返し、振り込み先口座、納期等を御連絡いたします。官費、校費、カードによる 支払い、分畆い等はお受けつけしておりません。悪しからずご了承ください。 広告有効期限 ' 91 / 1 1 月末日 スタッフ募集中 . を明るくヤル気のある方大歓迎です。詳しくは電話 3239 ー 2187 / 担当 : 中村までお問い合わせください。 米国 The-C Use 「 5 G 「 0 叩日本支部 VILLAGE CEhlTER Ⅲ (. 一本部 : 〒ー田東京都千代田区三崎町 3- ト神田アメレックスビル 2F TEL. 03-3239- 幻 87 FAX. 03-322 トロ 68 Shop . 〒ー田東京都千代田区神田神保町ト 35- 丐だるまビル庫 TE し 03-32 円 -6 日 3 く資料請求番号 1 / 8 〉

4. 月刊 C MAGAZINE 1991年12月号

新 MS ー DOS プロクラミンク入門 C プログラマのための のようにして , 本ユーティリティに引数を 渡すことがて、きます。このとき , 本ユーティ リティて、はオプションスイッチを指定する ことがて、きません。 7 コマンド起動 ユーティリティの概要 exec. c のソースリストを List 1 に示しま す 0List 1 は前回紹介したリスト ( ' 91 年 11 月 号 89 ~ 91 頁掲載 List 3 , execovl. c) よりは理 解しやすいリストだと思います。 ①引数が指定されていないときは標準入力 から取得する。 ②コンフィギュレーションファイル EXEC. CFG を以下の順に検索する (getcfg) 。 1 . カレントディレクトリ 2. EXEC. EXE と同じディレクトリ 3 . 環境変数 DATPATH ③引数を調べ最初に見つけた拡張子を検索 する拡張子とする (getext) 。 ④コンフィギュレーションファイルをみ 取って拡張子に対するコマンドラインを 取得する (getline) 。 ⑤取得したコマンドラインを解析して -p, ー v などのオプションや % の処理などを行 って , 起動コマンドのフルバス名と起動 コマンドのオプションを作成する ( getcmd ) ⑥ MS-C Ver. 6.0 , Turbo C Ver. 2.0 / C 十十 Ver. 1 . 0 の場合は exec ovlay 関 数 , それ以外て、は execl 関数て、子プロセス を起動する。 なお , 環境変数のリストに従ってファイ ルを検索する searchenv 関数は MS-C の sea rchenv 関数を参考にして作成しました 0Tu rbo C Ver. 2.0 / C 十十 Ver. 1.0 , LSI C- 86 Ver. 3.2 試食版には相当する関数がな く , MS-C Ver. 5.1 / 6.0 の searchenv 関数 には一部ノヾグがあるため , 共通に searchen 使い勝手が上がるて、しよう。 ①複数のコマンドの指定 現バージョンて、はひとつのコマンドしか 指定て、きませんが , 起動コマンドとして複 数のコマンドを指定て、きるようにすれば簡 単なバッチファイルを置き換えることが可 能て、しよう。 ②ワイルドカードの展開 コマンドラインのバイト数に制限がある ため , ワイルドカードを展開せずに起動コ マンドに渡していますが , 本ューティリテ ィのオプションて、ワイルドカードの展開を サポートすれば , ワイルドカードをサポー トしていないコマンドの起動が少し楽にな るて、しよう。 本ューティリティ作成時にはワイルドカ ードの展開は前処理のメニューコマンドが 行うべきだと思ってサポートしませんて、し た。 ③同じ拡張子に対する指定 同じ拡張子の指定が複数あるときにはメ ーを表示して選択て、きるようにすれば 便利かもしれません。 コマンド起動ユーティリティ のコンバイル Fig. 1 に示す設定て、コンパイルしてくださ い。 MS-C Ver. 5.1 と LSI C ー 86 Ver. 3.2 試食版て、は exec ー 0 ⅵ ay 関数をサポートして いないため , ADDDRV コマンドは起動て、き exec 関数は spawn 関数に比べて馴染みが 少ないのて、すが , 子プロセスにて、きるだけ 多くのメモリを渡すという観点から考えれ ば , 結構役にたっ関数て、す。みなさんも ex ec 関数を使用したユーティリティの作成に ぜひ挑戦してください [ 参考文献 ] 幸田敏記 , TM S ー D O S データブッ S-DOS 』 , BNN [ 5 ] 幸田敏記 , 「マシン語クックプック M SIC 』 1991 年 4 月号 ョンを自動起動する LAP 」 , fThe BA [ 4 ] 川野亮 , 「拡張子によりアプリケーシ 『インターフェース』 1991 年 4 月号 DELDRV 多重起動ューティリティ」 , [ 3 ] 中島信行 , 「 PCー9801 対応 ADDDRV/ 「別冊インターフェース』 , CQ 出版社 [ 2 ] 中島信行 , 「 C によるメモリ管理技法」 , CQ 出版社 ト技法」 , 『別冊インターフェース』 , [ 1 ] 中島信行 , 「 MS-DOS メモリ管理ソフ [ 6 ] [ 7 ] [ 8 ] [ 9 ] ク』 , ラジオ技術社 「 J ー 3100 シリーズテクニカルマニュア ル ( ソフトウェア編 ) Ver. 3.1 』 , 「 J ー 3100 シリーズテクニカルマニュア ル ( ソフトウェア編 ) Ver. 2.11 』 , 東芝 東芝 アスキー 帳 ? 」 , 『年刊 AhSKI ! 』 1987 年 4 月 , 「エッ ! M U S ー D O S うらわざ手 ません。 Fig. ① ② ③ ④ [ 10 ] 『 MS-DOS Ver. 3.1 プログラマーズ v 関数を使用しています。 バージョンアップ項目 以下のような機能を追加すれば , 7 さらに 1 コンノヾイル Microsoft C Compiler Ver. 6.00A cl /c ん /W3 /Gs /ZpI execovl. c 新 MS-DOS プログラミング入門 87 lcc exec. c -k/st : 0X2800 / cp : 0X500 LSI C ー 86 Ver. 3.20 試食版 tCC —w ・ exec. C execovl. Obj tCC —C ー、Ⅳ—B execovl. C Turbo C Ve 「 . 2 .0 / C 十十 Ve 「 . 1 .0 cl /J /W3 /Zp exec. c /link /st : 0X2800 / cp : 0X500 Microsoft C CompiIe 「 Ver. 5.10 cl /J /W3 /Zp exec. c execovl. obj /link /st : 0X2800 / cp : 0X500

5. 月刊 C MAGAZINE 1991年12月号

凡整数型とは列挙 , char, short int, int, と i-XList 1 は構造体の変数を別な構造体の いう型表記と区別不能になってしまう。 の問題が生じた原因はいうまて、もなく元の longint からなる。このようすを示すのが F 型へとキャストしようとしているため , コ ig. 3 てある。なお , Fig. 3 て、は省略している 宣言子を構成する場合に冗長なカッコを付 ンパイルエラーになるはずて、ある ( もし工ラ 加してしまった点にある。宣言子から識別 が , 凡整数型のうち列挙を除いた各型はさ ーにならない処理系があれば , それは ANS 子を取り去って抽象宣言子を構成する場合 らにそれぞれ signed/unsigned に分かれてい I から拡張されている ) 。 には , 元の宣言子の冗長なカッコをあらかじ る。 char< は plain char は別扱いて、 plain/s もっとも , 単にこのように異なる型の構 め排除しておく必要がある。そうて、ないと igned/unsigned の 3 種類の char があるが , そ 造体の変数へ ( どうしても ) 代入したければ , 思わぬ型を表すことになってしまうのて、要 れ以外の int 族て、は signed はデフォルトてあ ポインタを通じたキャストといういささか 注意て、ある。 り , たとえば singed int と int はまったく同じ 危ない手段があるにはある。たとえば List 1 て、あると解釈される。 の zot 関数を List 2 のように修正すればよ キャストの適用限界 一般に , スカラー型以外の型にキャスト を適用することはて、きない。またスカラー このように , いったん & 演算子て、アドレス , こて、キャストの限界に関して確認して 型をキャストしてスカラー型以外の型へと を取り , それを目的とする型へのポインタ おこう。本稿の冒頭て℃のキャストは非常に 変換することもて、きない。すなわち , にキャストし , さらに間接参照演算子 * を 強力て、あると述べた。しかしながら万能て、 キャストできるのはスカラー型の内部 適用して望む変数へと代入するというのは にかぎられる はない というよりも , 明らかに無意味な 構造体の場合にかぎらず使うことがてきる。 キャストや結果が極めてマシン依存になる のて、ある。スカラー型以外の型の代表例は これは知る人ぞ知る , 裏技に近いコーディ 集成型 (aggrigate type) と関数型 (function だろうキャストなどは許されていない ングテクニックて、ある。しかし , この技は 一般に相互にキャスト可能な型のクラス type) て、ある。たとえば構造体 (struct) の値 無闇に使うと移植性が確実に低下する。ワ が存在する。それは俗にスカラー型と呼ば をキャストして配列 ( という値 ) にするとか , ードアライメントや , 構造体内部のパッド れるものて、あり , ポインタ型と算術型から あるいはポインタ ( て、ある値 ) に変換すると の問題などが微妙に絡むからて、ある。だが 構成される。算術型はまた凡整数型と浮動 か , その逆とかは許されない。構造体同士 それは移植上の問題なのて、 , ここて、はこれ 小数型から構成されている。 てすら , 規格上キャストは許されない 以上深入りはしない 構造体から構造体への誤ったキャスト Fig. 3 スカラー型の構成 List 列挙型 Char 0 8 +> れⅡ 0 ・ 1 ・ 1 1 0 一 1 り 3 4 - -0 6 7 8 9 0 1 0 な 00 4 - -0 6 凡整数型 short int int long int float double long double オプジェクトへのポインタ 算術型 浮動小数型 スカラー型 構造体のポインタへのキャストを使う List 1 : void zot(void) b = *(struct bar *)&f; 3 : ポインタ型 関数へのポインタ 114 C MAGAZINE 1991 12

6. 月刊 C MAGAZINE 1991年12月号

に一彡売 ムコールは使えません。そこて、 , キー入力 は , PC ー 9801 のキーボード BIOS (INT 18H ) を使うことにしました。ただし , この場合 は入力されたキーの ASCII コードて、はなく , PC ー 9801 固有のキーコードが得られることに 注意してください。タック印字プログラム て、使用しているキーと , そのキーコードの 関係は , Table 1 を参照してください プリンタ出力の方法 ( 1 ) プリンタ OS を使う INT 28H のなかて、 MS ー DOS のシステムコ ールを使ってプリンタにデータを出力する ことは可能て、す。しかし , プリンタステー タスのチェックなどて、 , より細かくプリン タをコントロールする必要があるため , シ ステムコールを使用せす , キー入力と同様 に PC ー 9801 のプリンタ BIOS(INT IAH) を Table. 1 キーボード引 OS で得られるキーとキ ーコードの関係 使うことにしました。 TabIe 2 を参照してください プリンタに実際に出力するデータの形式は , には用意されていないのて、自作しました。 1 / 2 角漢字へのコード変換関数は , TurboC ま , 最小の字間て、印字て、きます。 ANK から って , ANK と漢字の幅の比を 1 : 2 にしたま ンタに出力することにしました。これによ 字コードに変換し , すべて漢字としてプリ そこて、 ANK は , それに対応する 1 / 2 角漢 なりません。 また , その比を 1 : 2 にすると字間が小さく と , ANK と漢字の幅の比が 1 : 2 にならず , R201 系プリンタて、は , 字間を最小にする ANK と漢字て、構成されていますが , PC-P 印字したいものて、す。タック印字データは , タックには , て、きるだけ多くのデータを ( 2 ) 印字間隔を小さくする ド = 48H ) て、挟まなければなりません。 ド ( 漢字インコード = 4BH, 漢字アウトコー とを知らせるため漢字コードを KI, KO コー ードを使います。また , 漢字出力て、あるこ タにテキスト VRAM 書き込みと同様 , JIS コ プリンタ BIOS を使う場合には , 漢字デー TabIe 2 41 H 42H 43H 4BH 34H 41H 3BH 7AH IBH 48H 61 H 62H 63H ODH OAH プリンタ引 OS によるプリンタ出力例 「 ABC 漢字 abc 」を出力する場合 A の ASCII コード B の ASCII コード C の ASCII コード ESC コード KI( 漢字イン ) コード 漢の』 S コード ( 上位 ) 漢の J 旧コード ( 下位 ) 字の J 旧コード ( 上位 ) 字の J 旧コード ( 下位 ) ESC コード KO ( 漢字アウト ) コード a の ASCII コード b の ASCII コード c の ASCII コード 改行 ( 印字実行 ) コード 行送りコード キーの名称 ESC R ET ↑ ↓ キーコード 001 B H ICODH 3A00H 3D00H 3B00H 3C00H TabIe 3 ソースファイル一覧 MAKING. DOC JYUSH02. DOC JYUSH02. LNK MAKEFILE WINDOW ℃ PUT VRAM ℃ PPOS ℃ PRINTER. C MENU ℃ KEYBOARD ℃ JYUSH02 ℃ JLIST. C GAMEN. C DATA. C GLOBAL. EXT GLOBAL.DEF JYUSH02. H 共通ヘッダファイル 外部変数実体定義へッダファイル 外部変数参照定義へッダファイル VRAM のテータ読み書き関数 ピープ音 , カーソル表示 , 画面の退避と復帰関数 住所テータの一覧を表示するメイン関数 タック印字メイン関数 , 割り込み処理関数 キー入力処理関数 ウインドウ内編集 , ラインカーソル選択関数 プリンタ制御関数 タック印字位置を決定するメイン関数 VRAM へテータを書き込む関数 ウインドウ処理関数 メイクファイル リンクファイル ユーザ向け説明書 プログラマ向け説明書 ( コンバイル方法など ) さらに改造する方法 Table 3 にソースファイルおよび , ドキュ メントファイルの構成を示します。 Turbo C があれば , ソースを書き換えてさらに改造 することがて、きます。 特殊なライプラリなどはいっさい使用し ていません。また , Turbo C て、なくても , interrupt 型の関数が記述て、きる C コンパイラ なら簡単に移植て、きるて、しよう。 おわりに タック印字プログラムによって , 住所録 がますます便利になりました。さらに便利 にするアイディアとしては , パソコンとモ デムをつないて、 , 住所データの電話番号に 自動ダイヤルて、きるようにすることを考え ています。もっとも , 住所録のタイトルや 表示項目をまったく変えてしまって , たと えば C の関数リファレンスとして利用するこ とさえてきるのてす。さらに , INT 28H の なかて、は , C の標準関数を使ってファイル操 作もてきるのてヘルプファイルを表示させ るような処理も可能てす。皆さんが , いろ いろなアイディアを出して , パソコンをも っともっと活用されることを望みます。 Conference Room 151

7. 月刊 C MAGAZINE 1991年12月号

明解 IC 言ロロ 入門講座 とになります。しかし , 構造体自体には名 前がついていないのて、 , プログラムの別の 箇所て同じ型の構造体の宣言を手短に行う ことはてきなくなります。 配列は「同じ型」のデータの集合を効率 よく表すデータ構造です。一方構造体は , 一般に「違う型』のものの集合を効率よく 表すデータ構造であるといえます ( もちろ ん , たまたま同じ型ということもあります ) 。 構造体と配列の類似点 ・要素のアクセス Fig. 3 を見てください。配列と構造体の例 を示しています。配列て、あれば , たとえば [ ] 演算子と添え字を指定 a[4] のように , することによって任意の要素を表します。 構造体ては , この例ては x. y のように . 演算子 ( 通称「ドット演算子」 ) とメンバ名を指定す ることによって , 任意の要素を表します。 たとえば Fig. 3 配列と構造体 配列 構造体 0 1 」っ 4 び 3 一 4 一 5 int aC6]; struct xyz { int X; long y; double z; 名前空間 同一のスコープ中であっても , 名前空間 (name space) が異なれば , 同じ綴りの識別子 ( 名 前 ) を使うことができます。名前空間は次のように分類されます。 ( 1 ) ラベル名 ②タグ名 ( 3 ) メンバ名 ④そのほかの識別子 ( 関数名 , オプジェクト名など ) たとえば次のプログラムは , x をタグ名 , メンバ名 , オプジェクト ( 変数 ) 名 , ラベル名と して使用しています。 #include く stdiO. h> c=3 十 x. y ; のように使うことがてきます。 a [ 2 ] のよう に配列中のひとつの要素に着目すると「た だの int 型のオプジェクト』てあるのと同様 に , x. y も「ただの int 型のオプジェクト』と なります。 int main (void) 重要 struct x { int X , 構造体オプジェクト stc のメンバ mem は . 演算子 ( ドット演算子 ) を用いて StC. mem の形式でアクセスできる こて , オプジェクト名とメンバ名の両 方に x という同じ名前をつけていることに注 意しましよう。どちらの x てあるかは文脈に よって判断てきますね ( コラム名前空間参 X. X printf ("%d*n", x. x) : return( の : このように , 異なる名前空間に属するものに対しては , 同じ名前をつけても衝突は起こり ません。 ・初期化 配列の初期化は int a[6] = { 1 , 12 , 0 , 53 , 125 , のように { } て囲んだ初期化子を指定する ことによって行います。構造体の初期化も 同様てす。たとえば Fig. 3 の xyz 構造体に 対しては struct xyz c = { 15 , 35 , 17.5 } ; のように初期化てきます。 明解 ANSI C 言語入門講座 119

8. 月刊 C MAGAZINE 1991年12月号

耳むずかしな力ドジりました 第の回 推定と想像によるドジ Presumed and lmaginary DO 』 岩谷宏 のてすが , C 十十ては , これもタイピングミ 本連載 10 月号の , C 十十のデフォルト引数 が許されるとすると , スとみなすようにしてエラーてす。 に関する記述をめぐって , ネット上て交わ f00 ( 4 ) ; などと書いたとき , これは f00 ( 3 , 4 ) と解釈 された会話の記録が , 編集部から送られて [pnori 氏 ] すればいいのか , 単なる書き間違いなのか きました。最初に , それをご紹介します。 を判断するときに困ってしまうのて、す ( 実際 > void f000 ( int, int なお , 10 月号の記事の , この会話に関連す 2 , int ) ; > void f000 ( int には何とかなるけど ) 。また , る部分は再掲しません。中心的な話題は , > のとき , f000 ( 3 ) は f000 ( 3 , 1 ) か 「 C 十十のデフォルト引数に関する現在の言 void bar ( int 3 , int, int 語仕様における制約」てす。 > f000 ( 2 , 3 ) か ? これは許されてて , f000 ( 3 , 1 ) と解釈され bar ② ; ログからの たと思います。つまり別々の宣言てデフォ これは bar ( 3 , 2 , 4 ) と解釈す としたときも , ルト値を設定てきるけど , それは右からじ 引用 べきてしようか。 ゃなきゃいけなくて , しかも後の宣言ては void f000 ( int, int すて、に設定したデフォルト値を再設定して [ockeghem ( オケゲム ) 氏 ] 2 , int ) ・ void f000 ( int はいけない , ってことだったはず。 C 十十 P のとき , デフォルト引数の構文が , 引数をスタッ fooo ( ) ; rimer が出たとき一度読んだっきりだから , クに積む順序に依存しているとは考えにく は , f000 ( 3 , 1 ) か f000 ( 2 , 3 ) か ? 記憶違いだったらごめん。 いと思います。 C 十十てはプロトタイプが義 > xxBASIC て、の console, , 1 とかのように これらの曖昧さを解決する規則を決める 務づけられているのてすから , 呼び出し側 のがめんどうだから , 「末尾から」なのてす > bar ( , 2 ) などと書ければいいのてすが , て , 省略された引数を補うという実装をし > C 十十ては , これもタイピングミスとみ ているのだと思います。 要するに , 関数呼び出しのときに記述さ > なすようにしてエラーてす。 [mishikawa 氏 ] れた引数並びが , その関数定義の引数並び タイピングミスというより , 単に引数を の左から順にあてはめられるという ( 単純て 省略する構文がないだけて、しよう。だから オケゲムさんのおっしやるとおり , スタ 率直な ) 仕様にしたから , デフォルト引数は ックに積む順序に依存しているなんてこと 引数は必ず左から与えなければならない , 「末尾に位置する」のてす。 は考えられません。 本当の理由はとても簡単なことてあると マイクロソフトの公用語てある xxBASIC ての , 思います。 たとえば , console , 1 void f00 ( int とかのように , bar ( , 2 ) などと書ければいい て , 冗 れ [mishikawa 氏 ] > f000 ( 3 ) は f000 ( 3 , 1 ) か f000 ( 2 , 3 ) か ? > これは許されてて , f000 ( 3 , 1 ) と解釈 3 , int ) ; C 言語フォーラム 91

9. 月刊 C MAGAZINE 1991年12月号

List 2 前と身長を扱う場合を考えましよう。たと えば小学校て、の身体検査の集計はどうする て、しようか。名前だけの表 , 身長だけの表 といった具合に , 別々に表 ( 配列 ) を作成す るてしようか ? 違いますよね。通常は , 各生徒に 1 枚のくカード > を用意して , そ こに名前や身長などを記入します。たとえ ば 50 人のクラスて、あれば , そのくカード > が 50 枚集まります。 C 言語て、は , 構造体 (structure) を用いるこ とによって , このようなくカード > のデー タ構造を表すことがて、きます。名前は文字 列 , 身長は int 型 , さらに追加する体重は f10 at 型 , 奨学金は long 型て、す。これを「ひとま とめ」にしてひとつのデータ構造とします。 構造体の宣言は List 3 のように行います。 39 : / * 九州大学工学部化学機械工学科松山研究室 * / 40 : / 事修士課程 1 年生の身長を昇順に並びかえる * / 42 : int main(void) 43 : { 44 : int i; int height[] = { 178 , 175 , 173 , 165 , 179 } ; 、 45 : char name ロ [ 8 ] = {"Sato", ” Sa 皿” , " Ta 0 ” , ” Mike", i ” } : sort(height, name, MAX) : ー 48 : for (i = 0 ; i く MAX; i + + ) 49 : printf("X-8s X4d*n", naneCi], heightCi]) ; return( の ; 52 : } 学生の構造体の宣言 List 1 : struct gstudent { char Ⅱ明 e [ 20 ] : 2 : height; 3 : int float weight; 4 : 10 schols; 5 : 名長重学 氏身体奨 構造体は , 複数のデータを「ひとまとめ」 にしたデータ構造である ここて、 gstudent を構造体タグ , name, h eight などをメン /<(member) と呼びます。 この List 3 の宣言は , オプジェクト ( 変数 ) を 宣言しているのて、はありません。 fstructg student というのは , これこれこういう型な のだよ』という宣言て、す。つまり Fig. 2 のよ うなカードの『形式 ( 枠組みの形 ) 』を作っ ているだけて、す。 fintJ の部分が fstruct gstuden を持っオプジェクトの宣言をも同時に行う とします。 この宣言により , gstudent 構造体は , na ことがてきます。そのときは t 』に変わっただけて、す。 List 3 のような宣 struct gstudent { me, height, weight, sch01s の 4 個のメンノヾ 言を行うことにより , この宣言以降の箇所 / * 中略 * / から構成されることになります。ここ <na て、は , プログラム中どこからて、も rstruct g me が配列て、あることに注意しましよう。配 studentJ という名前の型が自由に使えるよ 列も , 構造体のメンバになれます。 のように宣言します。これて、 x と z のふたっ うになります。同じ型のオプジェクトを宣 さてカードの「形式』だけあっても , そ のオプジェクトを宣言することになります。 言したいときに , わざわざ構造体の型を再 またタグ名を省略することもてきます。 こに名前などのデータを格納することはて、 宀言する必要はなくなります。 きません。通常の int 型のオプジェクトの宣 たとえば 言・定義を struct { / * 中略 * / int X , 構造体タグ名は , その構造体の名前を struct gstudent 型のオプジ と行うように 表す は , ここて宣言している構造体の型を持っ ェクトの宣言・定義を行うには a と b のふたつのオプジェクトを宣言するこ 構造体の型だけてなく , その構造体の型 struct gstudent z , 118 C MAGAZINE 1 1 12 Fig. 2 List 3 の構造体 struct gstudent 名長重金 学 氏身体奨

10. 月刊 C MAGAZINE 1991年12月号

数などを設定て、きます。 プロラムのしくみ TS 日ではない TurboC< は , 割り込み処理ルーチンを C の グラム」を起動するようにしているのて、す。 てすが , それを横取りして「タック印字プロ 込みの本来の処理は , 画面のハードコピー H) をトラップしています。キー割り するのに , キーの割り込み ( INT 05 住所録からタック印字プログラムを起動 ることをトラップといいます。 べクトルを自分の処理ルーチンに横取りす 本来ほかの目的て、使われている割り込み ②割り込みのトラップ この system 関数を使っています。 印字プログラムから住所録を起動するのに は , 起動て、きない場合があります。タック サイズの大きな子プロセス ( ワープロなど ) るぶんだけ多くのメモリを必要とするのて、 , ます。ただし , COMMAND ℃ OM が間に入 起動する場合とまったく同様のことがて、き MS-DOS のコマンドラインて、プログラムを 呼び出して子プロセスを起動させるため , ますが , system 関数は COMMAND.COM を 起動する標準関数はほかにも何種類かあり ロセスを起動する関数て、す。子プロセスを system 関数は , C の標準関数て、あり , 子プ (l)system ( ) 関数 親子プロセス間の切り替え 作る方法よりも簡単て、す。 せています。またこの方法は , TSR として ス ( 住所録 ) として同時にメモリにロードさ ロセス ( タック印字プログラム ) と子プロセ れば意味がないのて、 TSR にはせずに , 親プ 字プログラムは , 住所録と同時に使わなけ として作られます。しかし , このタック印 に , 多くの場合は TSR ( 常駐型プログラム ) 複数のプログラムを同時に存在させるため こういったプログラムて、は , メモリ上に 関数として記述するため interrupt 型が用意 されています。住所録とタック印字プログ ラムの関係は , Fig. 1 を参照してください INT 05H と 28H (I)INT 05H PC ー 9801 のキーを押すと INT 05H のハードウェア割り込みが発生し , 画面の ードコピーがプリンタに出力されます。 これを横取りして , 画面のハードコヒ。ー処 理ルーチンてはなく , タックイメージの表 示と編集 , およびタックイメージの印字を 行う処理ルーチンが呼び出されるようにし ます。 なお , [@Ü] キーを押し続けると多重割り 込み ( キー割り込み処理中にキ 一割り込みが再度発生してしまうこと ) が起 きてしまうのて、 , この処理ルーチンて、は キーが押されたことを示すフラグをセット するだけて、 , すぐ処理を終了するようにし ています。 多重割り込みは , インタラブトフラグの 設定て、防止することがて、きるのて、すが , そ うした場合にタック印字プログラム中て、必 要なキー入力が受け付けられなくなってし まうのて、 , このようにしました。 キーの多重割り込みが発生しても , セットされたフラグを再度セットするだけ なのて、問題ありません。また , 処理が短い のて、 , めったに多重割り込みにはならない て、しよう。 (2)lNT 28H MS-DOS のシステムコールのなかて、 , キ ー入力待ちなどのアイドリング時 ( 何もしな いて、キー入力チェックのループを実行して いる状態 ) には , 定期的に INT 28H が呼び出 されます。 MS-DOS 起動時における INT 2 8H は , 何もせず IRET するだけになってい Fig. 2 PC ー 9801 シリーズのテキスト VRAM 文字コード格納領域 ① ANK の格納形式 ( 上位バイト ) ( 下位バイト ) b7 b6 b 5 b4 b3 b2 b 1 bO b7 b6 b 5 b4 b3 b2 b 1 bO ASCII コード ②漢字の格納形式 漢字左側 ( 上位バイト ) 全て 0 ( 下位バイト ) b7 b6 b5 b4 b3 b2 bl bO b7 b6 b5 b4 b3 b2 bl bO J 旧上位バイトー 20H 漢字右側 ( 上位バイト ) 』 S 下位バイト ( 下位バイト ) b7 b6 b5 b4 b3 b2 bl bO b7 b6 b5 b4 b3 b2 bl bO J 旧上位バイトー 20H J 旧下位バイト十 80H 画面左上角がアドレス A000 : 0000 となり , 半角 1 文字につき 2 バイトを使用する。 Conference Room 149