more 要になるもうひとつのケースを考えてみよ う。それは , ANSI 3.7.2 における外部オプ ジェクトの定義てある。実際には条件演算 子のケースは希にしか ( わざと起こさないか ぎり ? ) 起こらない条件てあり , 合成型が必 要な場合はほとんどこちらだと思われる。 取りあえず , 該当の節を意訳すると Fig. 5 の ようにな。 どちらにせよ , 規格書の文章はひどく長 いのて , 意味をつかむのに苦労するだろう が , もっとわかりやすくいい直せば Fig. 6 の ようになる。 なお , こて、「外部定義」て、あるかどうか の判断に「 extern 」キーワードの存在は無関 係て、あることに注意。 extern int i このような宣言も「外部定義」て、ある。そ して , 後半の文章の意味は Fig. 7 のとおりて、 ある ( わかりやすいようにいい直している - ーノレ Fig. 5 外部オプジェクトの定義 ( AN 引 3.7.2 より ) あるオプジェクトに対する識別子の宣言であって , それがファイルスコープと初 期化子を持つ場合には , それはその識別子に対する外部定義 ( externa 届 efinition ) で ある。 あるオプジェクトに対する識別子の宣言であって , それがファイルスコープを持 っていて , かっ初期化子がなく , そして記憶クラス指定子がないか , あるいは記憶 クラス指定子として static が指定されている場合には , それはその識別子に対する仮 定義 (tentative definition) である。 もし , ひとつのコンノヾイル単位の中でひとつの識別子に対して複数の仮定義が行 われていて , かっ , そのコンノヾイル単位の中ではその識別子に対する外部定義が行 われていない場合には , そのコンバイル単位で , その識別子に対して , ファイルス コープで , 型としてはそのコンバイル単位の終端におけるその識別子に対する合成 型で , そして初期化子の値は 0 に等しいというような , あたかもそのような宣言が行 われているかのように振る舞う。 Fig. 6 外部オプジェクトの定義 ( 1 ) 外部定義 ( e e 「 n 引 definition) とは , ①ファイルスコープを持つ識別子の宣言で , ②初期化子を有するもの 仮定義 (tentative definition) とは , ①ファイルスコープを持つ識別子の宣言で , ②初期化子がなく , ③記億クラス指定子は省路されているか , あるいは static であるもの Fig. 7 外部オプジェクトの定義 ( 2 ) あるファイルの中で , ①同じ識別子に対する複数の仮定義がある場合で , ②同じファイルの中で , その識別子には外部定義が行われていない場合には , 以下の宣言があたかもそのファイルにおいて行われているかのように見なされる。 ③ファイルスコープで , ④型は , そのファイルの終端におけるその識別子に関する合成型で , 分 , 少し不正確になっている ) 。 トップレベル ( 関数の外側 ) て次のような宣 例をあげて説明しよう。あるファイルの 言が行われていたとする。 ば , 変数 a は b セクションに割り付けられ ードを吐かないのが普通て、ある。なぜ・ら コンパイラは積極的に初期値を指定するコ スレベルて、明示的に初期化していないため , どこが異なるかというと , 前者て、はソー 能性は高い。 ラソースを生成させると違う結果になる可 とくにアセンプ は少し違うかもしれない を与えた結果 , 生成されるコードは厳密に ただし , コンパイラにこの両方のソース て、ある。 れているかのように見なされるということ そのファイルの中て、次のような宣言が行わ ていない。この場合には , 解釈としては , 複数 ( 3 度 ) 行われていて , 外部定義は行われ なわち , 同じ識別子 (a) に対して , 仮定義が この場合 , 上記の条件に当てはまる。す るため , プログラム起動時に自動的にゼロ クリアされることが期待て、きるからて、ある。 一方 , 後者て、はソースレベルて、明示的に初 期化したため , 多くのコンパイラは素直に ⑤かっ , 初期化子として 0 が指定されている。 C にかぎらず , 手続き型のプログラム言 代入に関する型の適合 にはとくに間題はなさそうてある。 ということて , 幸いにもこちらのル を吐くだろう。 0 という初期値を設定するかのようなコード てきるかてきるのかどうかを決定する規則 して , 指定された式の値を代入することが てはない ) 。すなわち , ある型の lvalue に対 ibility) 」などと呼ばれる ( これは ANSI の用語 一般に「代入適合性 (assignment compat かどうか」というものがある。 とも実用的な問題に「代入に関して適合する 全般において , 型の適合性に関連するもっ てある。 単純代入の場合 ANSI C ー more 147 規則①は算術型間ては ( 整数格上げなどを 規則は大幅に緩和されることになる。 般の型の適合性の規則よりも代入適合性の る代入の大原則が存在する。このため , されている値を置換する」という , C におけ の後に左辺て示されるオプジェクトに格納 の値が , 代入式自身の型に型変換され , そ これらの規則が生まれる背景には , 「右辺 い 約条件のどれかが満たされなければならな れていて , 代入するためには Fig. 8 に示す制 する適合性については , 3.3.16.1 て、定めら もっとも単純な代入演算子てある「 = 」に関 して大前提となる条件てある。その次に られている。これはすべての代入操作に関 lue て、なければならないことは 3.3.16 て、述べ まず , 代入演算子の左辺が変更可能な lva
特集・ Free 新 a 「 e に子ぶ の数も多く , ネストも驚異的に深く , 初期 たわけて、す。「 FW 」という名前をやめたの 変数 PATH て、再確認するしかありませんて、 は , 自社製品に「 FW 」 ( フレームワーク 2 ) と ノヾーションのノートンユーティリティて、は した。この状態に不便を感じていたのて、 , ハングするほどて、した。メイクのためのバ この「 QW 」の初期バージョンの「 FW 」を作る いう製品があったのて、「 QW 」 (Quick Whic ッチファイルが複雑にからみあっていて , ことになりました。 h) にしました。 Quick Whereis て、はありま コマンドがバッチか COM か EXE か , それが せん。今思えば「 QW 」の最初のバージョンは 「」乍成 どのディレクトリから実行されたものなの 検索の落ちこばしがあったり , 表示バケし かよくわかりませんて、した。 たりて、ひどいものて、した。ほとんど個人使 当初は , ノートンユーティリティの FF. E 「 F Ⅵロは File Which の略て、 , Turbo C の 用していましたが , 社内て、使い始めていろ XE を使用して確認していましたが ,FF. EX searchpath( ) 関数ひとって、作成されまし いろわがままな意見を反映してきました。 E だと複数のファイルが存在した場合にどれ た。その後 , 「 FW 」に PATH 検索以外の通常 が実行されたかわかりません。結局 , 環境 のファイル検索機能をつけた「 QW 」が誕生し 日本語と英の自動認識 日本語 / 英語モード切り換えチェック 基本的にメッセージは日本語て、作成して いたのて、すが , IBM PC て、も使用するのて、 , なんとか日本語と英語 DOS を自動認識て、き ないものかと考えて DOS ファンクションの マニュアルを眺めていました。そこて、考え たのが , DOS の国別認識情報を利用して , 通貨記号が \ なら日本語 DOS, それ以外なら 英語 DOS という判別法て、す。この方法は最 近まて、通用していましたが , IBMDOSJ5.0 が発表されると問題が起きました。この DO S はひとって日本語 DOS, DOS/V と英語 DO S の三つに切り替えられます。 DOS J5.0 の 英語 DOS て、は , 通貨記号が \ のままて、自動認 識てきませんて、した。 これはまぬけな CHEV コマンドの仕様と 田いますが , OS の仕様には逆らえないのて、 なんとか対応することにしました。 DOS 汎 用ツールの場合に BIOS コールを使えないと いうハンデがあるうえ , この場合に日本語 DOS か英語 DOS かを判断するには , まず , この DOS が IBM DOS J5.0 てあるという認 識が必要て、した ( List 3 ) 。 私が考えたのは以下の方法て、す。 1. DOS の国別認識情報の通貨記号が \ で 2 . DOS バージョンが 5 で TabIe 1 QW で使っている ESC シーケンスの一覧 機能 ESC [2J 画面のクリア カーソル置から行末まで消 ESC [OK ESC [ 33m 黄色表示 黄色リバース表示 ESC [ 5 : 33m IS 1 : usamode ( ) / * 英語モードチェック戻り 1 : 英語 0 : 日本語 * / 3 : struct COUNTRY dos; 4 : char drv : 5 : struct ffb s s ffb ; fnameY2ö] ; 6 : char 7 : 8 : country(), &dos) : if ( OS. co_curr = ' ' ) 9 : 10 : if (_osmajor 〉に 5 ) 11 : 12 : 13 : mov ax, 3305h asm 14 : int 21h asm 15 : drv = _DL; sprintf(fname, "Xc:*%IBMBIO.COM*0",drv + ' @' ) ; 16 : if (findfirst(fname, &sys ffb 17 : , FA_RDONLYIFA_HIDDENIFA_SVSTEM) ! = ー 1 ) 19 : / * IBM DOS * / 20 : 21 : push ds asm 22 : push asm 23 : mov ax, 6300h 24 : int 21h asm mov ax, ds: [si] 25 : asm 26 : asm POP SI 27 : POP ds asm 28 : 29 : return 1 : / * 英語モード * / 30 : 31 : 32 : return 0 : / * 日本語モード * / 33 : 34 : / * 英語モード * / return 1 ; 実装プロテクトメモリ容量取得 4 / * 実装プロテクトメモリ容量取得戻り AX にキロハ・イト * / et_extmem() 1 : 3 : asm MOV AH, 3 囲 4 : asm INT 21 日 / * DOS5 以下は取得できず * / 5 : asm CMP AL, 5 6 : asm JB LOC_I 7 : asm push / * DOS ワークエリア・アドレス取得 * / 8 : asm mov ax, 5200h 9 : asm int 21h 10 : asm mov ax,word ptr es:[bx + 45h] / * キロバイト単位で格納されているり 11 : asm P()P 12 : asm CIC 13 : L 」 : re turn AX : 15 : コード 特集 Free s 。臨 are に学ぶ快適開発環境構築法 41
TabIe 7 DPB の構造 MS-DOS Ve 「 . 5 MS-DOS Ver. 3. x 先頭からのサイズ 先頭からのサイズ ( ノヾイト ) オフセット ( バイト ) オフセット 00h 01 h 02h 04h 05h 06h CRC 計算 最後に , CRC 計算て、す。 CRC を算出する には , ビット演算を多用しなければなりま せん。したがって , この部分だけは C 言語て、 記述するよりもアセンプラを使用したほう が速度的にも有利て、す。ただし , 100 % アセ ンプラて、記述するよりは , インラインアセ ンプラを利用したほうが , 以下のような点 て、メリットがあります。 1. インタフェイスを考慮しなくていい ( 普通 は , BP レジスタを操作して引数を取得し なければならない ) 2. 疑似命令を使用して細かい設定をしなく てもいい (C の環境が継承される ) もちろんデメリットもありますが , サイ ズの小さい簡単なものなら , インラインア センプラのほうが使いやすいと思っていま す。マニュアルさえ真面目に見ていればわ かることて、すがインラインアセンプラ使用 時に , asm{} を使用する場合は注意が必要 て、す。 asm { } 内て、はラベルが使用て、きませ Table 8 CRC 計算のモード ん 0BorIandC 十十 3.0 の仕様だから仕方な 動作 いのて、すが・・ インラインアセンプラて、 0 FCB 情報のみのチェック 使用て、きるラベルは , C て、記述したラベルの 1 最初の 1 セクタのみ CRC チェック みなのて、す。 asm { } 内て、宣言したラベルは 2 全ノヾイトを CRC チェック 1 / 2 ノヾイトを CRC チェック 3 諢識してくれないのて、すね。これにはしば ロ・い 4 1 / 4 ノヾイトを CRC チェック らく , はまっていました。結局私は , 全行 以上 , 「 TRUTH 」の開発の実際について に asm を追加してしまいました。 て , EXE 形式以外のファイルて、は無意味か 述べさせていただきました。これは , フリ さて CRC の計算はアセンプラを使用して もしれません。 ーウェアを使用する方々へのお願いて、もあ も大きなファイルになると遅くなりますね。 りますが , 不具合や感想などはて、きるだけ 100 % 正確に計算するならこれは仕方のない 作者へメールて、知らせてあげてください ことて、す。 80X86 系の命令は , 1 バイト命令 それによって , さらによりよいフリーウェ のみて、はありません。そのほとんどが 2 バイ さて , 残るは高速化の手法て、す。 FAT を アが完成されていくのて、す。 ト以上の命令て、す。て、すから CRC 計算時に 毎回解析していたのて、は , FAT 解析の分だ [ 参考文献 ] 適度に間引いてやれば , それだけ計算にか け速度が低下します。やはり , 毎起動時に かる時間が短縮されるわけて、す。そこて、計 FAT を参照しないようにすれば , かなりの ( 1 ) 『 MS ー DOS 実践 C プログラミング』 , ソ 算モードを 5 個用意しました (Table 8 ) 。 高速化が期待て、きます。そこて、 , 「 TRUTH 」 フトノヾンク モード 1 は何なんだろう ? と思われる方 て、は TURBO リストモードを用意していま ②『ざべ』 , 1992 年 5 月号 , 技術評論社 もいるて、しよう。 EXE ファイルは , ファイ す。このモードは , リストモードを拡張し ( 3 ) 『トラ技コンヒ。ュータ』 , 1992 年 5 月号 , ルの先頭にさまざまな情報を含んて、います。 たものて、 , リストファイルをプリコンパイ CQ 出版 モード 1 は , その情報が改変されていないか ルすることて、 , 必要な情報をすべて抜き出 ( 4 ) 『 BorlandC 十十マニュアル』 , ボ、一ラン どうかを知るためのモードて、す。したがっ して検査時の高速化を図ります。しかし , 62 C MAGAZINE 1992 10 内容 同左 ドライプ番号 同左 ユニット番号 同左 セクタ長 同左 1 クラスタ当たりのセクタ数ー 1 同左 クラスターセクタのシフトカウント 同左 予約セクタ数 ( FAT の開始論理セクタ番号 ) 同左 FAT の数 同左 ルートティレクトリのエントリ数 同左 データ領域の開始論理セクタ番号 同左 最大クラスタ番号 IFAT 当たりのセクタ数 ルートティレクトリ領域開始論理セクタ番号 テノヾイスドライノヾへのポインタ メディアティスクリプタ ティスク交換を示すフラグ 次の DPB を示すポインタ 最後に変更したクラスタ番号 未使用クラスタ番号 ファイルがソートされてしまうと , 再度プ リコンパイルしなければならないため , 、、諸 刃の剣クのモードて、はありますけど。 左左左左左左左左左左物 0 7 8 0) u- 同同同同同同一同同同同 0 1 1 1 1 1 1 1 1 ー 1 ーっん 1 ー 1 ・つム 1- っ 4 っムっ 4 1- っム 4 ・ 1 1 4 っ 4 っ 08h 09h OBh ODh OFh 1 Oh 12h 1 6h 17h 18h 1 Ch 1 Eh 2 2 4 1 1 4 2 2 最後に 高速化 ~ ド
パッチプログラムて、も立派なフリーソフト を取得します。この方法は , NETWARE, 3. Boot ドライプの root ディレクトリに旧 MB MS-NETWORKS および LAN マネージャど だと思います。わたしもよくプロテクト解 IO.COM が存在する場合に 4. DBS ドライバが存在して れて、も利用て、きます (List 6 ) 。 除などのパッチプログラムをアップロード いれば , 日本語モード また , 「 QW 」は ESC シーケンスを使用して しています。 なければ , 英語モード いますが , ESC シーケンスには機種間て、方 今は , 某 Mac 関連の出版社のソフトウェ ア事業部て、 Mac と Windows のお勉強中て、 言があるのて、苦労しました。 Ver. 3.0 のと きなど , カーソル位置からの消去コードに す。「 QW 」の Wind 。 ws 版の予定はないのて、 ドライフ認識 PC ー 9801 の拡張コードを使用していたため , 期待しないて、くださいね。 次に , LAN のリモートドライプを含むす 多機種て、不具合がて、ました 0TabIe 1 が QW 圧縮ファイル内 べてのドライプ認識について説明します。 て、使っている ESC シーケンスの一覧て、す。 文字列検索ツール「 WG R EP 」 まず , DOS の接続ドライプ数の取得方法て、 石田暢彦 「必要は発明」 すが , あまり公開されていないようなのて、 , PC-VAN : PVG86930 知ってる人は知ってるけど知らない人は知 「必要は発明の母」だっけ , やつばりきっ らないようて、す。 AH ← 0Eh INT 21h て、取 得て、きるドライプ数とよく勘違いする場合 かけ ( 必要性 ) が大事て、しよう。それとやる はじめに 気。必要と思う気持ちが強ければ , やる気 があります。この場合は , LASTDRIVE の 値に影響されるのて、正しい値て、はありませ は自然についてきます。「 QW 」も今て、は約 本誌編集部から執筆依頼があったときは , 4000 行のコードて、すが , これを当初から考 ん。じゃあどこから取得するのかというと , C 言語には詳しくないんだけどなあと苦笑し DOS のワークエリアて、す。ただし , これが えていたわけて、はありません。最初からあ てしまいました。付録ディスクに入ってい る「 WGREP 」は約 8 , 000 ステップのアセンプ DOS バージョンによって取得アドレスが違 れもこれもの機能を考えていたら , 作って うために , ドライプ数取得の前に DOS バー いなかったて、しよう。 ラて、書かれています。そのうち 2 , 000 ステッ ジョンのチェックが必要となります。 不便に感じて , 必要に迫られ , なんとか プ弱は高圧縮書庫管理プログラム「 LHA 」の してみようと思ったらしめたものて、す。た 基本的に Ver. 2.11 とそれ以外 ( Ver. 3.1 , 解凍ルーチンに少し手を入れて流用してい 3.3 , 4.01 , 5.0 ) の違いを認識します。余談 だ , この場合は自分にわがままになってく ます。 ださい。作ろうと思ったけどフリーソフト になりますが , Ver. 5.0 になってさらにワ ほかにも「 LHA 」の C 言語て、書かれた部分 ークエリアが拡大され , 実装プロテクトメ にあったからいいやて、はなく , こが使い をほば忠実にアセンプラに置き換えて使用 づらいから , それを参考にオリジナルなも モリ容量も取得て、きるようになりましたに させていただいているところもあります。 れは MEM コマンドを解析したのて、す。 Lis のを作ってみようと考えてください この場を借りて優れたアーカイバをソース 若葉マークの C プログラマさん ! C のラ とともに公開されている吉崎栄泰氏に感謝 t 4 , 5 ) 。 そして LAN のリモートドライプの取得て、 イプラリを利用するとけっこう簡単にツー します。公開されている「 LHA 」のソースを すが , AX<-5f02h INT 21h てネットワー ルが作れますよ。どんなライプラリがある 一部利用させていただきながら申し訳ない クエントリの取得を使用してドライプ情報 のかよく機能を把握してください。また , のて、すが , 「 WGREP 」のソースは公開してお りません。いろいろと手を加えた結果 , も , 接続ドライプの取得 う私が読んて、もよくわからない部分があり ますし , なにより私の実力がバレることを 恐れてだったりします。 説明が遅れましたが「 WGREP 」は「 LHA 」 などのアーカイバて、圧縮されたファイル内 も検索て、きる文字列検索ツールて、す。 開発日ロ / * 接続ドライブの取得戻り AL にドライフ・番号 * / 1 : int get mxdrv() 3 : MOV 朋 , 30H asm D 0 S バージョン取得り asm INT 21H 4 : / * V2.11 ならオフセット 10h り MOV SI, 10H 5 : asm CMP AL, 3 6 : asm JB L -- 2 7 : asm / ネ V3 以上ならオフセット 20h * / MOV SI, 2 囲 8 : asm 9 : LOC_2: asm PUSH ES 10 : / * DOS ワークエリア・アドレス取得 * / MOV 朋 , 52H 11 : asm INT 21H 12 : asm MOV AL, ES: [BX + SI] 13 : asm asm POP ES 14 : return( —AL ) ; 15 : 16 : ) アセンプラて、作成した理由は単純て、す。 私がまともに書ける言語がほかになかった 42 C MAGAZINE 1 2 10
転職意識調査アントにこ協力くたさい ソフトバンク株では、出版事業部の総力のあげて、意識調査を実蠍しま す。今後、ソフトバンク ( 誌の求人情報を充実させるため、読者の皆様に 協力をお願い致します。 ※尚、アンケートにお答えいたたきました個人情報の秘密は厳守させて頂きます。 ロ P N 〒 ご協力いただきました方の中から抽選で 500 名の方に プレゼントをご用意しています。 ハガキに欲しい賞品の番号をご記入ください。 ※当選の発表は発送をもってかえさせていただきます。 を JTB 旅行券 ( 1 万円 ) 5 名 色図書券 ( 3000 円 ) 10 名 3. ティスケット ( インチ ) 2HD10 枚入り 10 名 10 名 4. 旅行用コンバクトウォッチ 85 名 5. テレフォンカード 6. ソフトバンクオリジナルボールペン 380 名 A 芦 一 6 2 6 0 十こ諟 一 399 ( 受 A ) ま雪図哥 00H 羇 2 ー 7 [ ヾ 雫 4 12 こ 31 工は 7 一」斗 質問項目は裏面です。 右にご記入ください。 当ッ
新 C 言語入門 C 言語実用マスターシリーズ 本 格的 0 こ始める 人 C を く全 3 巻 > 晴 [ ビギナー編」 定価 1 , 900 円 C 言語にはじめて接するという方を対象に、 C 言語の基本的な知識を確実に身につけても らうことを目的としました。利用頻度の高い知識だけを整理して提供し、誰でも簡単なプ ログラムをすぐ書けるように導いていきます。 [ シニア編」 定価 2 , 400 円 簡単なプログラムなら作成できるという方を対象に、 C 言語の仕様を体系的に解乱難し い念などはわかりやすく図表化して規覚的に理解できるように配慮しました。単に文法 の解説にとどまらず、、、 C の思想″そのものについて解き明かした本↑箚勺解説書です。 [ 応用圄 定価 2 , 400 円 C 言語実用マスターシリーズ元結編。実用的なプログラムを自分で作成してみたいという 方を対象に、 C 言語の様々な応用技術を紹介。開発対象に合わせた実例プログラムを用い て、詳しく解説しました。 SOFT BANK ソフトバンク出 ~ 部 定価はすべて税込みです
2 構造体とアライメント Fig. 分子式 ( 16 ) 構造体とアライメン もちろん , 経験豊富なプログラマてあれ ば , この症状の原因はすぐに理解てきるて あろう。彼は , ( 文字型を除く ) 構造体のメ ンバを偶数番地が先頭となるよう配置する コンパイル環境を使っていたからてある。 ちなみに , 16 文字と 65 文字の文字列が単 純に連続して配置されると ,Fig. 2 ( a ) のよ うに 81 バイトを占める。ところが , これら をドッキングさせた構造体てある FrmNam e 型は , Fig. 2 (b) のように , 余分な詰めもの が付加され , 82 バイトとなるのて、ある。 れは , printf ("%u", sizeof (FrmName) ) ・ て、確認することがてきる。構造体の大きさ を sizeof 演算子て、調査するときは , このよう に ( 途中の詰めものだけてなく ) 末尾の詰め ものも含めた大きさを得るのだ。 sizeof 演算 子が , 末尾の詰めものも含めた大きさを返 c2 すことに疑問を持つ人もいるだろうが , き ちんとした理由がある。たとえば , FrmName x [ 2 ] , ( b ) ワード境界 ( a ) バイト境界 と , FrmName 型の大きさ 2 個の配列に対し て , sizeof(x) は 164 を返す。すなわち sizeo とくにパソコン用のコンパイラてあれば , が存在する場合 , その詰めものの部分 ( のビ f(FrmName) * 2 を返すのだ。もし sizeof(F ットパターン ) がコピーされるとはかぎらな ワード境界配置とバイト境界配置をコンパ ことに注意しよう。すなわち , y を x に代 rmName) が末尾の詰めものの大きさを含め イルオプションて選択て、きるものが多いよ 入しても , x, y の各 6 バイトのビット構成が ない値すなわち 81 を返すのてあれば , 計算 うだ。 Fig. 3 を見ていただきたい。 test 構造体 同じて、ある保証はないと ANSI は定義してい が合わなくなってしまう。 が , バイト境界配置てあれば , Fig. 3 ( a ) の 一般に , 配列 a に対して , TabIe 1 のよう る。 ように 4 バイトとなる。しかし , ワード境界 このような問題もあるため , C 言語ては構 な調査法があることを覚えておけばよいだ 配置が取られると , 何と 6 バイトものスペー 造体に対して , x==y や x!=y のような等 スを占有することになるのて、ある。 値演算子を定義していないのてある ( さらに さて , FrmName 型は 82 バイトの大きさを いえば , 同様の演算子てある < , < = は定義 持っため , Rec 型の CompB の位置が 1 バイト 少し話がそれてしまうが , 構造体への代 ずれ ,CompB より後ろのメンバは 2 バイトず 入について一 のしようがない ! ) 。 さて , 話を戻そう。ここて、 FrmName のコ れることになる。 struct test x, y , ンパイル時に , バイト境界を選択しても問 と定義されたふたつのオプジェクト x , y が Table 1 sizeof と配列 題が解決するとはかぎらない。 FrmName の あるとしよう。たとえば sizeof( ・ ") 調査対象 部分はうまくいっても , ワード境界時に存 sizeof(a) 配列全体の大きさ 在した詰めものがなくなってしまう可能性 と構造体の代入を行った場合 , y の各メンバ sizeof(a [ 0 ] ) 要素 1 個の大きさ もあるからだ。 が x の各メンバにコピーされる。ここて、 Fig. sizeof(a/sizeof(a [ 0 ] ) ) 配列の要素数 私個人としては , 最初の設計時に , バイ 3 (b) のようにワード境界てあって詰めもの 分子式 ( 16 ) 物質名 ( 65 ) 物質名 ( 65 ) 詰めもの ( 1 ) { (a) Fig. 3 構造体とアライメント st 「 u ct test { Char 2 X O O i nt c2 Char 134 C MAGAZINE 1 2 10
llellll Worid 0 今回は , 読者からよせられていた質問の一部にお 答えします。また , 翻訳では , 前回に続いて , G NLJ C 十十ライプラリ利用者ガイドからオプジェ クトスタッククラス , AllocRing クラス , 多精 度整数クラス , 有理数クラスをお届けします。 TabIe 1 「 GNU C 十十ライプラリ利用者ガイド」の目次および掲載号 目次 1 . GNU C 十十ライプラリのインストール この連載にも読者の方々から質問がいく 2. インストールの問題など こて、 , それらの つかよせられています。 3. GNU C 十十ライプラリのねらい , 目的と限界 一部にお答えしたいと思います。 4. GNU C 十十ライプラリのスタイルに関する慣習 gomi. cc のコンバイルは ? 5. 表現の不変性に関するサポート 6. コンテナクラスプロトタイプの初歩 【質問 1 】 7. 可変サイズのオプジェクトを表現する方法 1992 年 1 月号て収録された C 十十のサンプ 8. 式に向いているクラスを使うためのガイドライン ルプログラム gomi. cc をコンノヾイルしようと 9. 疑似インテックス すると「 Undefined 斗 mbol cos reference 10. ヘッダファイルと , C 十十から C へのインタフェイス d from text segment 」などのメッセージが 1 1 . 組み込み型の演算に関するユーティリティ関数 表示され , うまくて、きません。 crt0.0 に問題 があるのて、はと思いますがいかがて、しよう 12. 動的割り当てのためのライプラリ基本関数 13. ファイルのクラス ( F ⅱ e ) 【回答 1 】 14. ストリームクラス (istream, ostream) これはコンパイラドライバ gcc の問題て、 15. オプジェクトスタッククラス ( Obstack ) す。 gcc が libc. a のリンク指定を最後に回し 16. AllocRing クラス てしまうのて、 , 1992 年 1 月号の例のように g 17. St 「 ing クラス cc を使用するとリンク時のライプラリ検索 18. 多精度整数クラス が libm. a, libc. a の順序て、行われてしまいま 19. 有理数クラス す。それゆえ , libc. a の複素数ライプラリて 20. 複素数クラス 起動している C の数学ライプラリが見つから 21. 固定精度クラス ないという現象を引き起こします。この不 21. ピットテータを扱うクラス 具合は , 次のように明示的にライプラリの 指定を行うことて、取りあえず解決て、きます。 djgcc 詳解講座 第 11 回 Q&A 掲載号 1992 年 7 月号特集 72 ページ 1992 年 7 月号特集 73 ページ 1992 年 7 月号特集 73 ページ 1992 年 7 月号特集 74 ページ 1992 年 7 月号特集 75 ページ 1992 年 7 月号特集 76 ページ 1992 年 7 月号特集 77 ページ 1992 年 7 月号特集 78 ページ 1992 年 7 月号特集 79 ページ 1992 年 7 月号特集 80 ページ 1992 年 7 月号特集 83 ページ 1992 年 10 月号連載 83 ページ 1992 年 10 月号連載 86 ページ 1992 年 8 月号連載 78 ページ 1992 年 10 月号連載 87 ページ 1992 年 10 月号連載 88 ページ 82 C MAGAZIN E 1992 10
フリーソフトウェア開発の実際 R T フリーソフトウェアは作者の個人的興味や開発環境 向上への欲求から誕生することか多い。ふとした興 味や欲求がひとつのフリーソフトウェアへと成長し ていくプロセスはソフトウェア開発の生きた教本と いっても過言ではない。本章では代表的なフリーソ フトウェアの作者にその開発実態を語ってもらった。 思った直後に , あるフリーウェアのファイ ル復活プログラムを知ったのて、す。このと き , 「ワッ , すごい」と思う反面 , このプロ ある日 , 本に載っていたディレクトリソ グラムて、は , クラスタが不連続なファイル が復活て、きないこと , ( 現実問題としては十 ートのソースをいじくっているうちに , ア レッと思ったのが「 Fback 」を作るきっかけと 分だったのて、すが ) ディスク容量に制限があ なりました。ディレクトリエントリの先頭 るというところに引っかかりました。故に に , e5h を探して , そこに格納されている先 「 Fback 」の目標は , 最低このふたつをクリア 頭クラスタ番号から , FAT をたどって書き するということうなりました。 換えれば・・・ と簡単に考えてしまったの 余談て、すが , 「 Fback 」という名前がどこか て、す。しかし , ただそれだけて、はここまて、 ら来たかというとファイル名をいろいろ考 こられなかったかもしれません。アレッと えているうちに , 大昔の映画「シェーン」の FAT 領域を読み込む関数 getfat 便にマンドユーティリティ 消去ファイル復活「 Fback 」 マナベ ( 真鍋正志 ) NlFTY-Serve : MAH015 ある日・・・ はじめに 本来 , ここて、「 Fback 」に関するすべてのこ とを書ければいちばんよいのて、すが , そん なことをしていては日も暮れるし , 読者の 皆さんのあくびをする機会を増やすだけな のて、 , 重要だと思う関数ふたつを中心に 後はつれづれに書こうと思います。 ソースファイルの公開 「 Fback 」のソースファイルの公開の依頼が きたとき ( もちろん , 原稿執筆の依頼もきた のてすが ) , ちょうど公開しようかなと思っ ていた矢先て、したのて、 , すぐに OK しまし ただ , 公開されたソースファイルによ くあるように , 重要な部分を秘密にすると いう方法は , ソースファイルのあまりの汚 さのため必要なしと判断して ( 誉 ; ) , その まま公開することにしました。 干の書き換えはあります。もちろん性能上 の問題はありません。 38 C MAGAZINE 1992 10 1 1 : uns i gned char *getfat (cnum) 2 : unsigned int cnum ; 4 : uns igned i nt fatsiz. size, fatcnt 5 : unsigned char *fatp; 6 : int i; 7 : if(—16bitFat) { 8 : size ニ 0X8000 レ dpb->Sector_Length; 9 : for(i ニ 0 ; i く dpb->Sector_Per_FAT & & fatcnt ← cnum; i + + ) 10 : fatcnt + ニ dpb->Sector_Length/2 ; if(dir switch) 12 : 13 : dsectorperfat else if(dpb- 〉 Sector Per FAT ー i + 1 く size) 14 : 15 : sectorperfat : dpb- 〉 Sector Per FAT ー i + 1 ; else 17 : sectorlmfat SlZe; 18 : if(dir_switch) { 19 : dreservedsector ニ (uns igned 1 ong) (dpb- >Reserved Sector + i 20 : dfatnum ニ fatcnt ー dpb->Sector—Length/2; 21 : fats i z = dpb- >Sec tor-Length : 22 : else { 23 : 24 : reservedsector = (uns 1 ong) ( dpb- >Reserved Sec tor + i 25 : fatnum = fatcnt ー dpb->Sector_Length/2; 26 : 1 astcnum = fatnum + >Sector_Length/2 ー 1 : fatsiz ニ dpb->Sector Length*size; 28 : 29 : 30 : ト ①②③④⑤
IO 月 17 日創刊 第可鑿り。ー品。 工山 1 っ dVNOO 1VNOSU3d いま大型のまったく新しいパソコン誌が誕生します。 その名も「 PC 」。もちろん Pe 「 son 引 Computer の頭文 字です。 1 6 ビットパソコンが誕生して 1 0 年。パーソナ ルコンビュータ市場は複数のアーキテクチャが勢力を 競い合うなかで、量的拡大・多様化に加速がかかり、 いよいよ混沌としてきました。もはやユーサーには、 自分が使っていくパソコンの真の姿が見えにくくなっ てきています。いまどんなパソコンを選べば良いのか パソコン関連製品を購入していくユーサーにとって、 必要な製品情報を提供する“パーソナルコンピュータ 総合情報誌”として、「 P C 」がデビューします [ 創刊号の主な記事 ] 0 ユーサー投票により、パソコン、周辺機器、ソフト のそれぞれのベスト製品を選出 P C が選ぶ、 92 年パソコンベストプロダクト ! ÄWindows のための、ハイレゾ 486 パソコンのベスト 1 ! ー使いやすくて表現力豊かなワープロ王は ? 098 、 Mac 、 DOS/V 、 TOWNS 、 X68000 ケーム上手で選んだベストなパソコンは ? ■特別付録 オリジナルディスクラベル ※誌面内容は定ですので、変更になる場合があります 毎月 18 日発売 / A4 変型判 / 定価 580 円 ( 税込 )