五ロ はしめて学ぶ 0 プログラー ニンク ・ extern の記憶クラス ン上の OS(MS-DOS や UNIX)< は , ポイン まいます。第 2 にレジスタの数には限りがあ タ ( アドレス ) が , その CPU のレジスタ幅て 内部変数て、 extern の記憶クラスを指定する ります。たとえば 8086 系の CPU ては , レジ 表せるからてす。 と , 外部変数の参照をするための宣言とな スタ自体の数も少ないうえにレジスタごと こて、気をつけてほしいのは , レジスタ ります。 extern 宣言を行うと , 実際に記憶領 に役割分担が決まっているのて , 実際には 変数て、はアドレスを求めることがてきない 域をその変数に割り当てることは行いませ ごくわずかのレジスタしかレジスタ変数に ということてす。たとえば , ん。つまり , 変数の名前と属性 ( 型など ) を 割り当てることがてきません ( 処理系によ 関連づけることだけを行うのて、す。別のい register int a : る ) 。 い方をすると , 狭い意味ての宣言のみが行 int *b また register 宣言をした変数が , すべてレ という記述は , 間違いてす。なぜかという われ , 定義は行われません ( 内部変数の場 ジスタに割り当てられるとはかぎりません。 とレジスタ変数 a は , 記憶領域がレジスタに 合 , 変数を宣言するというと , 変数に記憶 「 egiste 「宣言した変数が , 実際にレジスタに 割り当てられているのて , &a ( 変数 a のアド 領域を割り当てる ( 定義する ) ことも暗黙の 割り当てることがて、きなかった場合は , たん レス ) は存在しないからてす。 内に含まれていることが普通て、す ) 。この点 なる自動変数になります ( レジスタに割り当 については外部変数の項てさらに詳しく説 てることのてきない型の記憶クラスを「 egiste 「 外部変数の場合 明します。 宣言したとしても自動変数になります ) 。従 ・「 egiste 「の記憶クラス っていくら「 egiste 「宣言をしても , レジスタ 「 egiste 「の記憶クラスとは , その名のとお 外部変数ては , 2 種類の記憶クラス指定子 に割り当てられない変数は , 自動変数にな り CPU のレジスタに変数の記憶領域を割り (extern, static) が指定てきます。 るだけなのて、実害はありません。しかしレ 当てます。レジスタに割り当てられた変数 外部変数は処理系によって扱いが異なる ジスタ変数にする必要もない変数を registe 「 のことを , レジスタ変数と呼びます。メモ のて注意して下さい。 宣言すると , 本当にレジスタ変数にしたい リアクセスをしないのて , レジスタ変数は 変数が「 egiste 「宣言したにも関わらず自動変 ・定義と宣言 メモリ上に置かれる普通の変数に比べて高 数になってしまうのて注意してくださいね。 外部変数とは , 変数の定義と宣言を明確 速に動作します。高速に動作するという理 いろいろな制限はありますが , レジスタ に区別するものてしたね。 由から , 文字列操作の関数を作るときなど こて , 簡単に復習しておきましよう。 変数は効果的に使うとかなり強力な武器と に威力を発揮します。 変数を定義するということは , 変数に記憶 なります 0List 3 は文字列をコヒ。ーする関数 しかし , レジスタ変数には , 種々の制限 pstrcpy< す。このアルゴリズムについて 領域を実際に割り当てることてす ( コンパイ があります。まず第 1 に型の問題がありま ル時に固定アドレスが割り当てられます ) 。 は , もう説明する必要はありませんね。 List す。レジスタを使うのてすから , ちょうど 3 て、重要なのは , 仮引数の部分に bregister 1 回だけ確実に変数の定義を行う必要があり レジスタに納まる型てないといけませんね。 宣言てきるということと , ポインタ型も通 ます。 常レジスタ変数にてきるということてす。 従って , 型としては (signed, unsigned)int それに対して , 変数を宣言するというこ 型か (signed,unsigned)char 型 ( さらにポイ ポインタ型がレジスタ変数として扱える理 とは , 変数の名前と属性 ( 記憶クラスや型な ンタ型も含まれることも多い ) に限られてし 由は , 通常のパソコンやワークステーショ ど ) を関連づけるだけて , 記憶領域は確保さ れません。外部変数は複数ファイルにまた 文字列をコピーする関数 pstrcpy(list3. c) がって大域的に使われることが多いてすね。 複数ファイルにまたがって大域的に使う場 合 , 大域的に使われている外部変数が定義 されているファイルと , その大域変数を参 照する ( 宣言して用いる ) ファイルがありま す。 大域変数を参照するファイルては , その 大域変数を使うために , 大域変数の宣言を 行う必要があります。また , 外部変数を定 義するというと暗黙のうちに宣言も含まれ ています。 List 3 1 : char *pstrcpy( register char *sl, register char *s2 ) 3 : char *p 4 : while ( * sl + + ニ * s2 + + ) 5 : 6 : 7 : *sl 8 : 9 : return p; はじめて学ぶ C プログラミング 121
more List 1 て渡された値をもとに動的に決定されると いう機能て、ある。残念ながら C には整合配列 に相当する機能は備えられていない。 C ては 配列要素のアドレス計算に際して , 省略可 能なもっとも左側の添え字に対する要素数 の情報を除いて , そのほかのすべての次元 の要素数の情報がコンパイル時に静的決定 される。これを実行時に決定することはて、 きないのて、ある。このため , 可変サイズの 2 次元配列を取り扱いたい場合にはそれなり のくふうが必要になる。 多次元配列のマシック 余談だが List 1 のプログラムの実行結果は どうなるだろうか ? 出力形式や値そのも のは使用するコンパイラによって違うだろ うが , すべて同じアドレス値が出力される はずてある。ただし , 手元のコンパイラの うち , MS-CVer. 5.1 は配列に単項の & を 適応することがてきないためにコンパイル 時に警告が出てしまう ( これは ANSI 規格違 反て、あることは前回述べた ) 。また , LSIC ー 86 Ver. 3.20 はなぜか一部工ラーになりコ ンパイルてきない式 ( & a [ 0 ] および &a [ 0 ] [ 0 ] ) が存在するために , LSIC ー 86 がコンパ イル時に定義してくれるプリプロセッサシ ンポルを用いて条件コンパイルを行うこと て、エラーを避けている。しかしいずれにせ よ , うまく動作すればこれはすべて同じポ インタ値を出力するはずて、ある。一見全然 違う値を取りそうな表現が例外なく , みな 同じ値になるのはなかなかおもしろいのて はないだろうか ? 一般に 2 次元以上の配列 てあれば , 配列名を a とすると , &a, a, * a はすべて同じ値 ( ただし型は違う ) になる。 n 次元配列と n 重ホインタ パラメータのところて少し触れたが , よ 0 69 : こで q は int [ 5 * 6 ] の配列の先頭アドレスを保持して 70 : いる int* と解釈して取り扱ってよい。 ・通常の配列と異なり、先頭アドレスと先頭要素のアドレスは違う。 73 : 例 : p ー (int**)aryalc(sizeof(int), 2 , 5 , 6 ) ; 74 : こで、 (void*)p ! = (void*)&pC0]C0] である。 75 : 76 : 77 : * Bugs : ・次元数の指定と実際の要素数指定の個数を必ず一致させること。 78 : 処理上は要素数指定が多い場合には無視される。不足している場合 aryalc() および v-aryalc() の挙動は不定。 80 : ・ 1 次元配列の確保にも使用できるがほとんど意味はない。 ・添字の値が宣言した範囲を逸脱した場合に関しては、原則として 82 : 一切動作が保証されない。最も右側の添字に関してのみ、通常の 83 : 多次元配列と同様の振舞いとなるが、それ以外は異なる結果とな 84 : るだろう。 85 : 86 : 87 : #include く stdio. h 〉 88 : #include く stddef. h> 89 : #include く stdlib. h 〉 90 : #include く stdarg. h 〉 92 : / * ポインタ領域を初期化する。 * 【内部関数】 93 : 94 : 95 : static void Size t rank, Size t *sizes, Size eSize) 96 : initPtr(void **p, 98 : size_t 1 ; size_t 99 : J ; Cha r 1 圓 : size_t 101 : lncr ; 102 : size_t S size_t 103 : S 1 ; 104 : for (i 105 : 106 : 107 : 108 : 109 : 110 : 111 : 112 : 113 : 114 : 115 : 116. 117 : 118 : 119 : / * * 必要全メモリ ( 配列領域十ポインタ領域 ) の計算を行い、 120 : * それを ma 110C ( ) を用いて割り付ける。 121 : * その後、 initPtr() を呼び出してポインタ領域の初期化を行う。 122 : 123 : 124 : VOid * v_aryalc(size_t size—t *sizes) 125 : 126. 127 : size_t 1 : element Size counter * / 128 : size_t / * ptr size counter * / 129 : size_t PS / * tOtal amount Of memory al located * / 130 : size_t S : / * ptr tO al located array * / 131 : VOid 132 : 0 ; i く rank; + + i ) for (i 133 : 134 : 十 = * = (size-t)sizesCi]; 135 : 136 : (size_t)eSize + ps * sizeof(void*); 137 : if ()p = (void**)malloc(s)) ! = NULL) 138 : イ / * destination * / of ptr d * / / * increment value / * tOtal count Of elements / * sizesCi] * / = sizesC0]; 1 : i く rank; + + i ) { = sizesCi]; lncr for (j = (void*)d; * p 十十 d 十 = incr; ー 1 ) ? eSize ・ sizeof(void*)) S 1 ; rank 0 ANSI C : more 113
かて、再度行う必要はない。ディストラクタ ( オプジェクトが占めていたメモリを開放す るルーチン ) は , 必要ないのて、定義していな どのメソッドも短いのて、 , 説明はいらな いだろう ( オプジェクト指向プログラミング て、は個々のメソッドはて、きるだけ小さくす る ) 。ただし , 演算子のオーバロードにはち ょっと注目してほしい 演算子をオーバロードする ( 演算子の機能 の定義を変える ) 機能があるおかげて、 , C 十十 のプログラマは本格的に新しいデータ型を 作れる , といえる。機能を変更した演算子 を使うと , クラスをとても扱いやすくなる 場合がある。たとえば Line オプジェクトを移 動する場合がそうだ。 C て、は , たとえば次の end 十 = distance ; start 十 = distance : べたらどうだろう。 かも明白だ。て、も , 次のようなコードと比 これて、仕事は終わり , 何をやっているの add points( &end, &distance ) ; add points( &start, &distance ) ; ように書くだろう。 掛け離れた機能を定義しないほうがいいね。 演算子の元の ( C 言語て、の ) 機能から , あまり 演算子をオーバロードするときは , その の値を変えていることが , 一目瞭然だもの。 てることがよりわかりやすいね。 start と end タイヒ。ングの量が少ないだけて、なく , やっ 少なくともばくにとっては , このほうが , lassy Graphics:Enc 叩 sulating the BorIand Gr 叩 hics lnterface 40 : { 48 : } 52 : { 64 : { 72 : } 93 : { List 4 41 : / / 値域のチェック 0 42 : 43 : 44 : 49 : 51 : 54 : 55 : 56 : 59 : 63 : 66 : 68 : 69 : 71 : 73 : 75 : 80 : 82 : 83 : 84 : 85 : 87 : 88 : 90 : 92 : 95 : 96 : 98 : 99 : 100 : 101 : 102 : 104 : 105 : 106 : } 107 : if (new_x > theDisplay. get_virtual_size()) theDisplay. get_virtual-s ize() : V i rtua I X e 1 S e virtual_x new_x : 46 : / / 実座標の設定 theDispIay. x-to-real (virtual-x) : 50 : / * 実座標の Y を変える。範囲外なら強制的に max とする * / POint : : set_y (const int new_y) VO i d 53 : / / 値域のチェック if (new_y > theDisplay. get_max_y()) y = theDispIay. get_max_y() : e ー S e y = new-y; 58 : / / 仮想座標の設定 virtual_y = theDisplay. y_to_virtual (y) : 6 2 : / * 仮想座標の Y を変える。範囲外なら強制的に ma x とする * / POint: :set_y(const double new_y) VO i d 65 : / / 値域のチェック if (new-y 〉 theDisplay. get_virtual_size()) theDispIay. get_virtual-size() : virtual_y e ー se virtual_y new_y : 70 : / / 実座標の設定 theDispIay. y_to_real (virtual-y) : 74 : / * 実座標の XY を変える。範囲外なら強制的に max として仮想世界の座標を設定する * / POint: :set_xy(const int new_x, const int new_y) V 0 i d X 77 : / / 値域のチェック if (new-x 〉 theDisplay. get_max_x()) x = theDisplay. get_ e 1 se X ニ new_x; if (new-y > theDisplay. get_max_y()) y = theDispIay. get_max_y() : e I S e Y = new-y; 86 : / / 仮想座標を更新 virtual_x virtual_y ニ theDisplay. y_to_virtual(y) : max x() : = theDisplay. x_to_virtual(x) : たとえば , string3 stringl 十 string2 ; のような文は , stringl と st 「 ing2 を合わせて ( 結合して ) , その結果を st 「 ing3 にストアす る , という意味なら自然だ。一方 , ほとん どの C 十十処理系が提供している IOS TREAM というクラスは , シフト演算子 ヾ > > 〃 , < < 〃をオーバロードして , 入力 と出力を扱うようにしている。 91 : / * 仮想座標の XY を変える。範囲外なら強制的に max として実座標を設定する * / VOid POint: :set_xy(const double new_x, const double new_y) 0 X ー theDispIay. y_to_real (virtual_y) : theDispIay. x_to_real (virtual_x) : 103 : / / 実座標を更新 new_y : virtual_y e ー se theDispIay. get_virtual-s ize() : virtual_y if (new-y 〉 theDisplay. get_virtual_size()) new_x; V i rtu a ー X e 1 S e theDisplay. get_virtual_size() : V i rtu a ー X if (new_x > theDisplay. get_virtual_size()) 94 : / / 値域のチェック 26 CMAGAZINE 1991 2
LSI C コンバイラ LDB-80X プログラム開発からテパッのまで 咼速、コンパクトなコードを生成 レジスタの最適自動割り付け レジスタによるパラメタ渡し アセンプリ言語の埋め込み記述可 ANSI 準拠・プロトタイプ宣言を完全サポート ROM 化に最適 LDB-80X は、 LSI C -80 (MS-DOS) て、開発したソフトウェアのデ バッグ環境を、 MS - DOS 上て、実現するためのソースレベル・クロ スデバッガて、す。これにより、プログラム環境からデバッグエ程まて、、 アセンプラを意識することなく C 言語レベルて、、のプログラム開発が 行えますのて、、大幅にソフトウェアの生産性が向上します。 ■ LDB -80X には、動作モードとして以下の 3 種類のモードて、 動作します。 1 . 64180CPU ボ、一ドを使う 180 モード 2. V30CPU の 8080 工ミュレーションを使う V30 モード 3. ソフトウェア・エミュレーションモード BTurbo-V システム、または Turbo-18011 システムと併用すれば、 CP / M -80 のアプリケーションソフト (. COM ファイル ) のデバッグ が可能て、、す。 ■ LDB -80X は、操作性に優れたウインドウ指向デバッガて、す。 5 つのウインドウ ( コード、レジスタ、ウォッチ、コマンド、及びオプ ションウインドウ ) とホップアップ・メニューがあります。 実行中のユーザ・プログラムを任意の時点て、強制的にプレー クさせ、制御を LDB -80X に戻すことがて、きます。 複数のコマンドを組み合わせて、新しいコマンドを構築するマク ロコマンド機能があります。 ・ LDB -80X から MS - DOS のコマンドを起動する、サププロセス 機能を持っています。 ・その他、 LDB -80X には、コマンドウインドウの表示コントロール ( カーソル制御、画面消去等 ) 、 I / O の入出力工ミュレーション、 メモ、オプション設疋、ロギンク : ノヾッチ等 のコマンドが用意されています。 ・ MS - DOSVer. 2.11 以上、 384KByte 以上 必要 ・ NEC PC -9800 シリーズ (PC-98XA, XL, XL2, RL のハイレゾリューションモードも含む ) ・ EPSON PC -286 シリーズ / PC -386 シリーズ LSI C -80 (MS-DOS) + LDB-80X セット価格 128 , OOO 円 LSI C -80 ターゲット CPU: 8080 / Z80 / 64180 ・価格 98 , OOO 円 •MS-DOS 版クロス ・アセンプラ、リンカ付き ・ UNIX の cc と同様の使いやすいコンパイラ・ドライバ ・ UNIX コンパチ・プログラム保守ツール make ・ライプラリ、コンパイラドライバ、プリプロセッサのソース付き ・ MS-DOS Ver. 2.11 以上、 384KByte 以上必要 ・価格 398 , OOO 円より ・ UN Ⅸ版クロス ・ NEWS 、 Sun-3 、 vsx シリーズ、 Kurama 、 SX -9100 シリーズ、 LUNA 、 HP9000 モデル 300 シリーズ、 ) station200 、 Micro VAX 、 VAX-II ※その他の機種については、ご相談に応じます。 ■ CP / M 版セルフ ・価格 98 , OOO 円 ・ CP/M-80 Ver. 2.2 以上、メモリ 60K CP / M 以上必要 ・価格 48 , OOO 円 ・ ROM 化ツール標準装備 ・ far , near キーワードをサホート ・ UN Ⅸの cc と同様の使いやすいコンパイラ・ ドライバ ・ UNIX コンヾチ・プログラム保守ツール make ・ライプラリ、コンパイラ・ドライバ、フ。リプロセッサ のソース付き ・ MS-DOS Ver. 2.11 以上、 384KByte 以上 必要 LSI C -86 ターケット CPU: 8086 [ LDB -80X の走行環境 ] ー ( は材・いは、・一 0 ー代◆り ( ( 0 “資第 ーーは賞載 i ー・ 創創ま ー侊 ( ・ ite ー象は・り ( 田創 - オプシれ一覧 、一、ドもアプアームトレース もゞみーを一 ー / 0 者一 日 21 工ル・エス・アイジャパン株式会社 CP/M は DigitaI Research ⅲ c. 、 MS-DOS は Microsoft corporation 、 Z80 は z ⅱ og 」 nc. のそれぞれの登録商標です。 〒 151 東京都渋谷区千駄ヶ谷 1 丁目 8 番 14 号 UNIX は Bell Laborato 「 ies の米国内での登録商標です。 LDB-80X, Turb0 ・ V / 180 は京都マイクロコンビュータ 容 ( 03 ) 3404 ー 1319 ・ FAX ( 03 ) 3478 ー 0576 株式会社の商標です。その他、商品名は各社の商標です。 く資料請求番号 003 〉
List 1 8 God Hand さんの解答 (gh—tail. c) 11 : * / 22 : { 53 : } 128 インクルードしています。ほカ ~ 系の 方はこ分を肖畭してください標準 しカっていなしで , 情なく すると思います ( MS - C でも memo 「 y. h と m 訓 oc. h をインク丿ドする必要はありま せんね ) 。 このプログラムになるのは駄 10 行しカま示できないということです。少し 手直しす何行でも ( もちろんメモリの 内で ) 表示することカ河能なので , やっ てみましよう。まず , 2 斫ラ目の *tbl [MAX], buf [READBF] : という部分を * *tbl, buf [READBF] ; のように , tb をポインタのポインタに して宣言します。そして 2 ラ目の関数 memset を餘します。それから , 31 ~ 36 行目を List 19 のように修正します。そし て main 力鮗了する直前立置 ( 5 哘 目 ) に free( tb り ; と挿入すれば何行でも表示することカ河 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : 12 : 20 : 21 : 23 : 24 : 26 : 28 : 29 : 30 : 32 : 33 : 34 : 35 : 36 : 38 : 39 : 40 : 42 : 43 : 44 : 45 : 46 : 49 : 50 : 52 : System i I e name Author Date Description 参考文献 Compiler OS : C 言語入門講座 9 0 年 1 1 月号クイズ : GH_TAIL. C : God Hand ( 匿名希望 ) : 90 / 10 / 23 簡易版 T A I L コマンド : MS-DOS Ver. 3. 10 ( Toshiba J ー 3300 日本語 ) . MS-C Ver. 5. 10 : MSC V5. 1 開発ハント・フ・ツク技術開発室編秀和システム #include 13 : #include 14 : #include 15 : # i nc 1 ude 16 : #include 18 : #define MAX く stdio. h> く std 1 i b. h> く string. h> く memory. h> く malloc. h> 19 : #define READBP 512 / * 表示行数最大値 * / / * 読み込み用ハ・ツファーサイス・ * / void main(unsigned int argc, unsigned char **argv) 日し E *fp; unsigned char *tbl buf[READBF] : unsigned int cnt=MAX; memset(tbl, 0 , sizeof(tbl)) : fp=(FILE * ) 0 : while( * 十十 argv ) { if( **argv= / * オフ・ション取得 * / / * テ・フォルトの表示行数をセット * / / * ホ・インターテーフ・ルを強引にクリアー * / / * ファイルホ・インターを Nu Ⅱクリアー * / cnt=( (cnt=(unsigned int)atoi ( + 十 *argv) ) く =MAX & & cnt>=l ) ?cnt:MAX; whi le( fgets(buf, READBF, (p) !=NU し L ) { / * 一行読む * / fp=( fp==(FILE * ) 0 )?stdin:fp; else fp=fopen( *argv, "rt" ) : / * ファイルオーフ・ンエラーも標準入力にする * / 能です。 CMAGAZINE 1991 2 造を表示行分だけ出力させています。 ていくのです。そして , 最後に , リスト構 にそを寺しながらリスト構造を作っ アからなります。そして , 1 彳豫み込むたび リスト構造を構築する ) と , 1 行分のバッフ 構はそ型のポインタ型 ( 線形 体をリストにしています。読み用 この wæ(List 20 ) は読み用造 藤澤昌聡さんの解答 るでしよう。 どを用いさらによいプログラムにな せんれ前介したマクロ mem alloc な きなかったときのエラーを行っていま 正 m 訓 oc 賦カで てにすればよいのです。ただ , するため己列を ma Ⅱ oc を用い このようにバッフアの知頁ポインタを if( tbI[0] ) free( tbl[0] ) : for( i=0;i く cnt-lä + + ) tblCi]=tbl[i + 1]: tbl[cnt-l]=malloc( strlen(buf) + 1 ) ; / * 古いハ・ツファーを捨てる * / / * ハ・ツファーのホ・インターを地道に前へずらす * / / * 新しいハ・ツファーを盗み取る * / / * ハ・ツファーへコヒ・ strcpy( tbl [cnt-l], buf ) : fclose( fp ) : for( i=o;i く cnt;i + + ) { if( tbl[i] ) fputs( tbl[i],stdout ) : / * 標準入力であろうとクロース・してしまえ * / / * Nu Ⅱでなければ表示 * / List 18 の 31 ~ 36 行目の修正 List 1 9 Ⅱ **argv if( **argv= 1 : while( * + + argv ) { 5 : 4 : 3 : 2 : ー ( ( cnt = (unsigned int)atoi ( + + *argv ) ) 〉 = 1 ) ? cnt : MAX; 8 : memset( tbl, 0 , sizeof( unsigned char * ) * cnt ) : 7 : tbl = (unsigned char **)malloc( sizeof( unsigned char * ) * cnt ) : fopen ( *argv, else cnt ー
たつぶりとは使わなかった。私は zed を使い 慣れている。 zed は WordStar ふうのキース トロークを採用しているのに対し , zwb は emacs ふうのキーストロークを使っているの て、 , 私には馴染みが薄いのて、ある。しかし , プルダウンメニューからへルプを呼び出し て , なんとか使うことがて、きた。 ztc は今回テストした中てはもっとも便利 なコマンドラインコンパイラて、 , C 十十 , C, および MASM のソースファイル , オプ ジェクトファイル , そしてライプラリを受 け付ける。ファイルを書くとき , 拡張子を 省略てきる。 f と指定されたファイルが実は f. cpp て、あることを ztc が見つけると , それは C 十十のファイルとしてコンパイルされる。 f. c て、あれば , C のファイルとしてコンパイル される。 価格も対話型版 (interactive version) が $ 250 なので , まあまあである。なお , バージョ ンによって価格は異なる。 Oregon の C 十十は完全なコンバイラで , C + + の入力からバイナリファイルを生成す る。そのバッケージには , プリプロセッサ , コンバイラドライバ , コンバイラ , リンカ , およびデバッガが含まれている。 OregonC 十十 は 90 日試用の返金保証つきである。サポー トサービスは特注となり , サポートサービ スにはさまざまなレベルがある。テクニカ ルサポートは電話 , oregon 社の BBS, そして uucp 上で提供される。 OregonC 十十は C 十十と C の両方のソース を受け入れるが , その際の互換性の問題が マニュアルに書かれている。ネイテイプの cc コンバイラは使わない。 製品のテープにはデバッガやリンカのほ かに , Nationallnstitutes of Hea は h 社が開発 したバブリックドメインのオプジェクト指 向ライプラリが入っている。 Oregon C 十十 は 2M バイトのディスクスペースを必要とす 56 CMAGAZINE 1991 2 このコンノヾイラのライプラリには streams はあるが , iostreams がない。 Zortech はま た , 複素数 , 単方向リンクトリスト , Flash Graphics2€ッケージなども提供している。 Developer's Edition の C 十十 T001S は , 汎用データ構造体 , 拡張数値型 , およびテ キストべースのユーザインタフェイス用の べースクラス集て、ある。ソースも付いてい ZortechC 十十はまた , ANSI にほとんど 完全に準拠している C コンパイラて、もある が , その準拠ぶりは Turbo ほど徹底してはい ない。豊富な C 関数のライプラリを提供して おり , その中には TSR を書くときのための ノヾッケージもある。 このコンパイラは , 640K バイト以上を必 要とするプログラムて、あるために , ふたっ るが , そのライプラリを載せるためにはさ らにⅢバイトが必要である。私たちは SCO XENIX/U N Ⅸ用のバージョンをテストした。 この処理系は ( シェル用の ) スクリプトフ ァイルを使ってインストールし , そのとき , 収納するディレクトリを指定する。その insta Ⅱ という名のスクリプトファイルは , ユーザ に代わってディレクトリを作ってはくれな い。インストール時には tar を使って製品テ ープからソフトウェアをコヒ。ーする。マニ ュアルには , 最終的なインストールをする 前に一時的なディレクトリを作ったほうが よい , と書かれている。スクリプトはコン バイラ用と include ファイル用の 2 本を走らせ る。ューザは環境変数をセットアップしな ければならない。 Oregon C 十十は K&R C と円 88 年 5 月草案の ANSI C, および cfront 2.0 に準拠する C 十十 を受け入れる。ただし ver. 2.0 のコード生成 オプションを指定しても多重継承はサポー トされない。 ューザの各種ニーズに対応するためのオ の特別なメモリ管理テクニックをサポート している。、、 r 〃オプションて、コンパイルした プログラムは , RationaI Systems 社の DOS extender の下て、走る。、、 v 〃オプションは , Zortech のオーバレイマネジャて、ある VCM を使うコードを生成する。しかし今回は , これらのオプションのテストはしなかった。 Zortech は少なくとも Turbo と同じくらい リンカは驚くべき速 高速て、ある。とくに さて、ある。しかしオプティマイザは極端に 遅くて , byacc の場合には実行て、きないプロ グラムが作られた。ただし , オプティマイ ザ抜きて、も , Zortech は , そのほかのコンパ イラよりは 2 倍も高速な tawk のコードを生成 、 0 プションは , 相当多数ある。生成されるコ ードはよく最適化されており , 非常に効率 がよいようである。 Oregon の C 十十と C 用の ソースレベルデバッガは , オプジェクト指 向のコードを正しく扱う。デバッガとして の常識的な各種機能をサポートしており , 短いチュートリアルが付いている。 0regon のコンバイラはソースから , ムダ のない引き締まったバイナリプログラムを 生成した。デバッガもプログラマの日常道 具として上出来である。 90 日の試用返金保 証つきなので , プログラマは積極的に試用 してみる気になるであろう。 lntek C 十十は AT&T の cfront 2.0 をベースと する製品で , c のコードを生成し , それをネ イテイプのコンバイラが実行形式に変換す る。 lntek の製品は UNIX system V / 386 用のみ で , 最小 2M バイトの RAM を必要とする。テ クニカルサポートは uunet, CompuServe, お よび電話で提供される olntek の UNIX 版 c 十十 は , DOS 版と互換性がある。 旧 tek のバッケージは , ( 通常のテープでは
プルース・エッケル (Bruce Eckel, *Using 円 89 年と•The Tao of C 十十〃 , McGraw-HiII, Objects&, M&TPress, 円 90 年の著者 ) は , 2 年 , 小さな c 十 + プログラムの収集を始め 首に た。彼はそれらを , c + + の処理系を“殺す〃 ために使った。これらのプログラムの多く は , プログラム開発中に発見されたバグを 契機とするものであるが , 一部には , 人か ら聞いた話や , コンピュータに関する会議 や学会 , 電子メールなどから触発されたも のもある。 工ッケルはそれぞれのプログラムを , か んじんのコンバイラ殺しの部分だけが生き ている最小規模のプログラムに仕上げた。 コンバイラ作家はそのテストコードをバグ フィクスに利用できた。しかし工ッケルは , コンバイラの新バージョンが間題点を必ず いち しもすべて修復してはいないことに 早く気づいた。彼が問題の原因を追求して みると , 以前と同じバグを発見したのであ る。 工ッケルは , そういうバグをコンバイラ 殺しのテストプログラム集へとまとめて , 新しい処理系や新バージョンが出るとすぐ にテストできる体制を作った。このシステ ムは総括的なコンバイラ評価手順ではなく , むしろ , この言語の興味深く , で危険な部分 ( とくに , プログラマよりもコ ンバイラ作家のほうが知らない部分 ) を調べ るためのプログラム集である。円 90 年の春 には , このコレクションは田 2 本のプログラ のドキュメント ( リリースノート , プロダク トリファレンス , 参考資料 , ライプラリマ ニュアルの計 4 巻 ) て、ある。 lntek のフルスクリーンのインストールユ ーティリティは , 使いやすくて、きている。 使用する C コンパイラとメモリモデルの指定 または コラム I ユーティリティて、はて、きなかった。 C コンパイラを加えようとしてみたが , その ンストールする。インストール後に新たな する階層ディレクトリ構造へと自動的にイ ィレクトリを指定すると , それをルートと が画面上て、て、きる olntek のルートとなるデ EckeI-Saks test suite について ム集に成長していた。 私は , 円 89 年に月に開かれた最初の ANSI C 十十委員会の会議で工ッケルに出会い , そ の後の学会や会議でも会った。私は彼の許 しを得て , 彼のコンバイラ殺しプログラム 集を c 十十コンバイラを評価するための道具 へと整理することにし , 約 80 本のプログラ ムを選んで , それらのプログラムひとつひ とつが言語のただひとつの側面だけをテス トするように変更を加えた。私はまた , 結 果が自動的に表になって出力されるように Table 3 はテストを 3 群に分けている。「基 本機能」は , •AT&T Release 2 コ Product Reference Manual" の付録 B をベースにして いる。付録 B のひとつのステートメントに対 してひとつのテストを行うようにしている。 ー ~ 3 番は C 十十と C との違いをテストする。 4 ~ 9 番は円 85 年以前 ( ver. l.x ) の機能をテス トする。そのほかのプログラムは円 85 年以 降 (ver. 2. x ) に加わった機能をテストする。 テストはすべて陽性 , つまりコンバイルさ れてプログラムが正しく動けば合格である。 「コンバイラ殺し ( 陽性 ) 」のテストは , 工 ッケルのコレクションから 80 本を選んだも のの中にあるプログラムである。それぞれ のテストが , 処理系によって微妙な違いの ある言語機能をテストする。これら陽性の テストは , コンバイルされてプログラムが 正しく動作すれば合格である。 「コンバイラ殺し ( 陰性 ) 」は , コンバイル 00 0 十 そこて、インストールを最初からすべてやり 直さなければならなかった。 この製品を使っていくにつれて , インス トールを絶えず調整しなければならなかっ た。コンパイラドライバの cplus は雑て、不便 にて、きている。それはたったひとつの C 十十 できなければ合格 , というテストである。 できなければできないほど , 得点は高くな る。 Eckel-Saks C 十十 test suite にはふたつの 目的がある。第一は , それは教育的なツー ルであること。プログラムは C 十十の風変わ りなシンタクスの , 極端にシンプルな用例 を示している。第ニは , それは C 十十の処理 系を定量的に評価すること。テストを実行 することによって , その処理系が芽生えつ つある AN c + + 標準規格草案 ( = その実質 は ARM ) にどの程度適合しているかを , おお まかに知ることができる。 工ッケルと私は , 時間の許すかぎり , のテストプログラム集を改良していきたい と思っている。そして今年の終わりまでに は , 何らかの形式で配付したいと思ってい る。詳しいことは , 下記に問い合わせてほ しい。 Bruce Eckel RevoIution2, Box 760 , Kennett Square, PA. 円 348 Dan Saks Saks & Associates, 287 W. McCreight Ave. , Springfield, OhiO 45504 わせていただいたことに関して , Plum-Hall 私たちのテストに PIum-Hall sampler を使 旧 c. の Tom P m に感謝する。 特集 c + + レポート 53
技術者の夢を実現するための、新しい OS 環境 " MS OS/2"0 そのすべてを学んで みませんか。『 M ℃「 osoft lJnive 「 sity 』はアプリケーション開発に携わる技術者の ために初歩から高度な段階まで田コースを設置。いま知りたいことに的確にお応え します。新たに LAN コース、 Windows Ve 「 . 3 . 0 対応コースも設けました MS OS/2 でつぎの時代をデザインぼください ー・問い合せは 富士ソフトウェア株式会社 MU 教育センター 03-3452-7722 ( 直通 ) 03-3798-0599 : : MS OS / 2 P 「 og 「 amming Envi 「 onment MS OS / 2 Device D 「 ive 「 s MS OS / 2 Applications P 「 og 「 amming (AP) (PE) T E L . (DD) MS OS / 2 アプリケーションソフトを作成する場合に必 MS OS / 2 デノヾイス・ドライノヾの機能と構造を詳しく解 MS OS / 2 の A 曰を使用し、マルチタス久メモリ管理、 要となる基本的な事柄について学びます。特に、 OS / 2 プロセス問通信、ダイナミックリンクなどの機能を有効 説します。ノヾイモーダル、日 OM - 引 OS 互換サポート、デ の機能およびプログラム開発環境について解説します。 に活用するためのフロテクトモード・アプリケーション バイスへルバルーチンなども詳しく解説します。実際 本コースは、 OS / 2 に取り組む上での基本コースとなり にデ / ヾイス・ドライ / ヾのサンプルを作成し、インストール、 の解説を行います。実習中心のコースです。 ます。 デバックまで行います ・期間 : 4 日間■定員 : 20 名ー受講料コ 2 万円 ( 税別 ) ■期間 : 5 日間■定員 : 20 名・受講料コ 5 万円 ( 税別 ) 一期間 : 4 日間■定員 : 20 名■受講料コ 5 万円 ( 税別 ) MS OS / 2 P 「 esentation Manage 「 AppIications P 「 og 「 amming (PM/AP) : ~ す MS OS / 2 p 「 esentation Manage 「 P 「 og 「 amming Envi 「 onment (PM/PE) MiC 「 osoft Windows P 「 og 「 amming Envi 「 onment (Win/PE) MS OS / 2 プレゼンテーション・マネージャ ( PM ) のア MS OS / 2 プレゼンテーション・マネージャ ( PM ) のア MS-Wlndows のアフリケーションソフトを作成するため プリケーションを作成するための入門コースです。作 プリケーションを作成するための上級コースです。プロ の入門コースです。最新のⅣ e 「 .3.0 を使用し、 Wlndows 成に必要な基本事項を説明するとともに、実際に簡 ジェクトの中心となる方、経験者を対象に、より詳しく フログラミングのホイントを重点的に解説します。実際に 単なサンプルプログラムの作成を行います。 開発の方法、ノウハウを説明します。 サンフルフロクラムを作成しながら学んでいきます 一期間 : 5 日問一定員 : 20 名・受講料コ 5 万円 ( 税別 ) 一期間 : 5 日間・定員 : 20 名■受講料コ 5 万円 ( 税別 ) ■期間 : 5 日間・定員 . 20 名・受講料コ 5 万円 ( 税別 ) Mic 「 osoft C 入門 (MS-C) マイクロソフト LAN マネージャ ( LM ) 用アフリケーショ MS OS / 2 LAN マネージャ ( LM ) 上で作動するアフリ C 言語の基本を解説します。 C 言語の特徴である、関 ンを開発する設計者のための入門コースてす LM の ケーションの作成や移植するフログラムのためのコース 数、制御構造、ホインタについて詳しく説明します。セミ アーキテクチャと特徴について説明します。また、基本 です。 LM の AP 」 . を使い、ネットワークに対応したアプリ ナでは、講義だけでなくフログラムを作成し、実際にそ 的なフログラムを作成できるようになります。 ケションの設言十、作成、デノヾッグに重点をおきます の動作を確認していただくことにより、理解を深ま の処理系とは違う MS - C 独自の規約なをも説明します ■期間 ; 5 旧問■定員 . 20 名第受講料コ 8 万円 ( 税別 ) → ・期間 : 4 日・定員 : 20 名■受講料 . 虧万円 ( 税別レ ・期間 : 2 日間■定員 : 20 名■受講料 . 5 万 5 千円 ( 税別 ) Mic 「 osoft LAN Manage 「 P 「 og 「 amming Mic 「 OSOft LAN Manage 「 Applications Envi 「 onment (LM/PE) P 「 og 「 amming (LM/AP) どんな顔。 次世代標準 OS のすべてを学ふ MS OS / 2 セミナ 解ー MS OS / 2 の基礎知識、オペレーション、開発環境を理解する初心者のため のコースて、す。 日本電気株式会社殿の御協力 ( り PC -9800 シリーズ対応コースも好評開催中イ′東京都新宿区西新宿 7 ー 5-25 K ビルディング く資料請求番号 169 > 富士ソフトウェア株式会社 MIJ 教育センター 〒田 8 東京都港区三田 3 ー 4 ー 3 三田第一長岡ビル
ーボーランドジャパン lnformation from Compiler Makers Q c 十のほかに c 言語も使いた いのですが , Turbo C と Turbo C 十十の両方を購入しなければなら ないのですか ? Turbo C 十十は , C 言語として使う場合は Tur C 2.0 と同じなのですか ? A Turbo C 十十には , C 十十コン パイラとしての機能と C コンパイラ としての機能の両方が含まれてい ますのて、 , Turbo C を購入する必 要はありません。 TurboC は , フ ロッヒ。ーベースてプログラミング する場合に適しています。 TurboC 十十は , C コンパイラと しての機能も拡張されています。 # p 「 agma 指令て、は , コンパイルオ プションをソースコード中に記述 することがて、きるようになりまし た。このため , 関数ごとにスタッ クチェックの有無を指定したり , スタックフレームの生成を制御す ることがて、きます。また , 起動時 関数や終了時関数を指定すること がて、きるようにもなりました。 言語仕様としては , seg 修飾子 によるセグメントボインタをはじ め loadds, saveregs などの便利 な修飾子が追加されています。 の他 , -S オプションによるアセン プリコード出力は , C のソースコー ドがコメントとして含まれるよう になりました。 TurbO C 十十と TurbO C 十十 Professiona にはどこが違うのです A Turbo シリーズには , 統合環境 型のデバッガやプロファイラを含 150 CMAGAZINE 1991 2 Q む Turbo Debugger&T001s とい う製品があります。 Professional と呼ばれる製品は , Turbo C 十十と Turbo Debug ger & T001S をバンドリングしたも のて、す。 Turbo C 十十に含まれる 統合開発環境 ( IDE ) にもソースレ ベルデバッガが組み込まれていま すが , Turbo Debugger て、はアセン プラレベルのデバッグや強力なプ レークポイント機能のほか , リモ ートデバッグ , 仮想 86 デバッグ , 80286 のプロテクトモードを利用し た省メモリデバッグなどがサポー トされており , 高度なデバッグを 行うことがて、きます。 Turbo Debugger&Tools には コマンドライン版のアセンプラ (Turbo Assembler) も含まれてお り , 厳しい条件が求められるモジ ュールの開発や , コマンドライン コンパイラや IDE からインラインア センプラを使うために使用てきま す。 urbo C 十十は , C 十十トラン ドを確認てきます 0Turbo Debug パイラが生成するアセンプリコー ー S オプションを指定すれば , コン ん。コマンドラインコンパイラて、 グラムを生成することはありませ すから , 中間コードとして C のプロ 生成するネイテイプコンパイラて Turbo C 十十は直接コードを A ンパイルできますか ? Ver. 1 . 2 で書かれたプログラムをコ 多いようですが , Turb0 C 十十は のバージョン 1.2 に対応したものが 市販の C + + の解説書は , C 十十 スレータの機能をもっていますか ? ger & T001S を使えば , プログラム の動作を詳しく調べることがて、き ます。 TurboC 十十は , AT&T C 十十 の Ver. 2.0 に準拠しています。 Ver. 1.2 のストリームを使ったプログラ ムは , OLDSTRMx. LIB をリンク することて、コンパイルて、きますが , Ver. 2.0 て、追加された予約語や旧 式の構文を使っているものは正し くコンパイルて、きない場合があり ますか ? ログラムは , Turb0 C 十十でも使え Q ます。 Turbo C Ver. 2.0 で作ったプ mode は , つねにテキスト画面の初 換えなければなりません。 text 使っている場合は , textkanji に置き 示かを選択するために textmode を また , 漢字表示かグラフ文字表 る必要があります。 的にファンクションキーを消去す ムて、は , pc98fkeyoff を使って明示 ことを前提に作成されたプログラ ファンクションキーが消去される なければなりません otextmode< ている場合は , その部分を修正し このため , gettextinfo を使用し トは廃止されています。 ト , 簡易グラフィックスのサポー れました。 40 桁モード , 裏テキス 拡張アトリビュートがサポートさ ノ、イレゾリューションモード , ・テキスト関数 とおりて、す。 とがて、きます。おもな違いは次の の修正て、再コンパイルして使うこ ソースコードがあれば , 若干 A 期化を行います。 textatt 「や text colo 「の引数は , 従来のようにテキ スト VRAM 上の値そのものてはあ りません。このため , 引数として シンポルて、なく直接数値を指定し ているプログラムは修正の必要が あります。 textreverse や textblink など一部の関数は , 旧形式ライプ ラリ (OLDBIOSx. LIB) て、のみサポ ートされます。新たに作成するプ ログラムて、は , 将来のために texta 権 を使うようにしてください ・グラフィックス ハイレゾリューションモードが サポートされました。従来の PC98. BGI, PC98GRCG. BGI, PC98EGC. BGI はひとつのファイル Turbo C 十十 ともにリンクし直してください 生する場合は , OLDBIOSx. LIB と イプラリ関数の未定義工ラーが発 ラムをリンクしているときに , ラ Turbo C Ver. 2.0 用のプログ ています。 (OLDBIOSx. LIB) て、サポートされ 関数などが , 旧形式ライプラリ 一部の日本語処理関数 , テキスト び標準ライプラリから削除された xxx 関数やミュージック関数 , およ Turbo C 2.0 における bios98 ・ OS 関数 , ミュージック関数 ます。 ぎる場合に 0 を返すようになってい ます。 imagesize は , 範囲が大きす ードに関する定義は削除されてい IBM-PC 用の BGI ドライバや色コ はソースコードの修正が必要てす。 EGC ドライバを指定している場合 て明示的に PC98GRCG, PC98 め , initgraph や registerbgidriver ( PC98. BGI ) に統合されているた
C MAGA る 100M バイトのカード型ハードディスク「ス リムパック 100 」を発売する。 先日 , 「スリムパック 40 」とした 40M バイ トカード型ハードディスクを発売したが , 今回はそれと同サイズて、 2.5 倍の記憶容量の 100M バイトを実現。スリムパック 100 の特 ・ライトプロテクト機能 ードディスクて 100M バイト。 拡張スロット 1 段分に装着するカード型ハ ・スペースをとらないカード型 徴は以下のとおり。 9800 シリーズの内蔵ハードディスクが増設 ックジュニア 100 も同時発売 ( ただし , PC- また , 電源ュニットのいらないスリムパ ・オートリトラクト機能 込みを禁止てきる。 を ON にすれば , ハードディスクへの書き 電源ユニットのライトプロテクトボタン ・対応 OS MS-DOS Ver. 3.1 / 3.3 (PC-98LT を除く ) ・対応機種 PC ー 9800 / PC286 シリ く動作環境 > 可能な機種専用 ) 。 / 。「 98 を物、第、当 1 こ く価格 > スリムノヾック 100 ーズ 178 , 000 円 スリムノヾックジュニア 100 162 , 000 円 イン機能 , 3D マッピング機能 , タイル自 20 数種類の基本コマンドのほか , スプラ ・グラフィックエデイタ を作成てきる。おもな機能は以下のとおり。 を作成し , そのデータからアニメーション Actor98 は , グラフィックエデイタて CG わせたツール「 Actor98 」を販売する。 ィックエデイタとアニメーション機能を合 スタジオパンサーは , 多機能なグラフ 有スタジオバンサー グラフィックアニメーションツール TEL 06 ー 304 ー 8424 新大阪上野東洋ビル 〒 532 大阪府大阪市淀川区西中島 7 ー 4 ー 17 問い合わせ先株ランドコンピュータ ト朝ツ三、 動作成機能 , フリー楕円描画などの高効 率描画機能 グ 16 色モードをサポート ( デジタル 8 色も 4069 色中任意の 16 色を使用て、きるアナロ ・カラー表示 コマンドが用意されている ていくことてアニメーションを再現する ルとして扱い , 複数のセルを連続再生し 最大 320 x 200 ドットのグラフィックをセ ・アニメーション機能 Zs'STAFF Kid98, 工スキース , 花子な ・データの互換 スキャナーやデジタイズボードにも対応 ・周辺器 可能 ) TEL 03 ー 3798 ー 2760 〒 108 東京都港区芝浦 2 ー 17 ー 2 問い合わせ先スタジオパンサー く価格 > 36 , 000 円 640K バイト以上 ・メモリー ・対応 OS MS-DOS Ver. 2.11 以上 ( ハイレゾモードは不可 ) ズ。ノートタイプ対応 ・対応機種 PC ー 9800 / PC286 / 386 シリー く動作環境 > る テーションやゲームの作成も容易にて、き ションを実行することが可能。プレゼン ティ -tBASIC や C, アセンプラてアニメー 作成されたデータは , 付属のユーティリ ・ BASIC や C によるグラフィック再現 トとデータ互換 どのグラフィックツールやワープロソフ スーパー機能のし一 TERM 誕 1 ノヾソコンが UN Ⅸ WS の端末に UN Ⅸ用端末工ミュレータ グラフィ咳ス 漢字 語機能 文字コードは、 JIS か MS 漢字コードの 2 種 類から選択。 JIS のモードて、は、全ての文字 コード拡張手順をサポート。 JIS 初期値と JIS 現在値を任意に変史て、きるため、 EUC コードや DEC コードにも完全に対応 房フィックス機能 テクトロニクス 4014 端末に準拠したグラフ ィックモード。カラーて、の出力も可。 最制財幾能 JIS と重複する画面消去コードを除き、 PC9801 と上位互換を持つように拡張され ている。ビジプルベル、カーソルの形状変 更、プリンタの有無などの制御コードを含 む。これらはローカルに変更可。 NEC ー PC9800 シリーズ EPSON ー PC286 シリーズ (MS-DOS バージョン 3.1 以降 ) 機能 RS ー 232C 拡張インターフェースボ、一ド 3 チャンネルのうち 1 チャンネルを選択使用。 75baud から 19200baud ( クロック 10MHz 以 上 ) まて、使用可、しかも、その高速処理は 群を抜く。フロー制御は XON/XOFF によ る制御法と信号法から選択。 爿イル転送機能 UNIX ホストと DOS ファイルの間て、のテ キストファイル送受信が自在。コマンドは、 UNIX の cu と同様の操作。 その他多彩な機能満載、しかも低価格実現 価格 48 , 000 円 ( 消費税は別途 ) 開発及び販売 第情報数理研究所 lnformation 部ⅵ Ma せ旧 nat Laboratory. ー 8. 〒川東京都豊島区池袋 2 ー 437 池袋青柳ビル TEL. 03ー 3590 ー 52 日 ( 代表 ) FAX. 03 ー 3590 ー 5353 く資料請求番号 147 〉 News Square 147