返す - みる会図書館


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

1. 月刊 C MAGAZINE 1992年7月号

djgcc 詳解講座・Ⅷ 0 刪 List コンべンショナルメモリの利用例 ( conven. c ) TabIe 3 eek で使う sys / f ⅱ e. h で定義されてい るマクロ 1 : #include く stdio. h> 2 : #include く string. h 〉 3 : 4 : / * si ze バイトのコンペンショナルメモリを取得し 5 : それへのセレクタ番号を *selector_ptr 6 : それへのポインタを返り値に入れる * / 7 : void *conven_malloc(short size, short *selector_ptr) 9 : VOid *address ; asm ( ” int $ 0X21 ; addl $ 0xe 圓圓 000 , XXebx ” 10 : =a ” (*selector_ptr), 11 : ” =b"(address) "a"((short)0xff48), "b"((size + 15 ) / 16 ) ) : 12 : 13 : return address ; 14 : } 15 : 16 : / * セレクタ番号 se lector が指すコンべンショナルメモリを解放する 17 : 返り値は成功したら 0 、失敗したら一 1 * / 18 : int conven free(short selector) 19 : { 20 : short result; asm volatile( ” movw % 2 , XXes; int $ 0X21 ” 22 : "=a" (result) "a"( (short) 0xff49) , return (int)result; 23 : 24 : ) 25 : 26 : / * セレクタ番号 selector が指すコンべンショナルメモリに 27 : キー番号 key のキーを読み込む * / 28 : VOid get_function_key(int key, short selector) 29 : { asm("pushw XXds ; movw % 2 , XXds ; int $0xdc; popw XXds" 30 : "c" ((char) 0x0c), "a" (key), "r" (selector) , "d"( の 31 : 32 : } 33 : 34 : / * セレクタ番号 selector が指すコンべンショナルメモリの内容を 35 : キー番号 key のキーに設定する * / 36 : void set function_key(int key, short selector) 37 : { asm("pushw XXds ; movw % 2 , XXds ; int $0xdc; popw XXds" 38 : 39 : "c" ((char) 0x0d), "a" (key), ” r" (selector) , 40 : ) 41 : 42 : #define KEY_BUFFER_SIZE 16 43 : #define SHIFT_FI 0x0b 44 : 45 : main() 46 : { short key_buffer selector; 48 : char *key_buffer address ; ツ int i; 49 : 50 : key—buffer address = conven_mal 10C (KEY BUFFER SIZE, &key_buffer_selector) ; if (key_buffer—address = NULL) 51 : abort() ; 52 : get—function_key(SHIFT_F1, key_buffer selector) ; 53 : for (i = 0 ; i く KEY BUFFER_SIZE; i + + ) 54 : printf("X02x ” 55 : (unsigned int) key—buffer_address[i]) ; strcpy(key_buffer_address, gcc ー 0 " ) ; set-function_key(SHIFT FI, key_buffer_selector) ; 58 : conven free(key buffer selector) ; 59 : } 内容 マクロ L SET L CURR L XTN D ファイルの先頭から 現在の読み書き位置から ファイルの末尾から int ptrname) ハンドル handle の読み書き位置を offset て、 指定する位置に移動します。 ptrname には , sys/file. h て、定義されている TabIe 3 のマク 口によって , offset をどこからの相対位置て、 指定するかを指定します。成功したら 0 , 失 敗したら一 1 を返します。 tell.s long tell(handle) ; ハンドル handle の現在の読み書き位置を 返します。工ラーの際には一 1 を返します。 ノヾージョ、フップ情報 東京都の市川さんから送っていただいた , ・ポインタ渡しを使った OS などの呼び 出しを行う方法はないか ・皿キーによる中断を無効にする機能 はないか という質問に対し , 98 パッチの H バーション て、追加された機能を利用したプログラムを 紹介します。 コンべンショナルメモリの利用 g032 て、は , コンべンショナルメモリ ( 物理 アドレスが 0X1000000 以内のメモリ ) と拡張 メモリ ( 0X1000000 以降 ) とを区別せず , 連続 した大きなメモリ空間として使っています。 ような場合は , バッフアをコンべンショナ 通常の応用て、はこのほうが便利なのて、すが , の利用例を List 1 (conven. c) に示します。 ルメモリに取る必要があります。 コンべンショナルメモリを区別して利用し この例て、は , int dch の MS-DOS の拡張機 98 パッチて、は , H バージョンから MS-DO こともあります。 能呼び出しを使って , ファンクションキー S のメモリ割り当てシステムコールを使っ たとえば , BIOS コールて、は , 操作対象の の設定を操作しています。具体的には , 十圃の設定内容を 16 進て、表示した バッフアのアドレスを , セグメントとオフ て , コンべンショナルメモリ領域からメモ あと , 十に "gcc -Ou" という文 セットを使って渡す場合があります。この リを確保・解放する機能がっきました。 ” r ” (selector)); djgcc 詳解講座・ HeIIo GCC WorId 131

2. 月刊 C MAGAZINE 1992年7月号

必要なクライアント / サーバの対話の概略を 示します。このプロセスから分かるように SQL 文が実行されるその都度 , 文はクライ アントがスキャンし , サーバがレキシング とパーシングおよび最適化を行ないます。 こういった特定の処理ステップは , ダイナ ミックな SQL 文の実行には必要て、すが , ス タティックな SQL 文の実行にとっては不要 なオーバヘッドとなります。 SQL 文は , 関数コールを介してプリプロ セスし , データベースにストアすることも て、きます。プリプロセスされた SQL 文の場 合の , クライアント / サーバの対話を Fig. 3 に示します。 プリプロセスと データベースへのストア ストアする文には , 何らかの認識標が必 要て、す。この認識標 ( タグ ) は , 関数コール を通じてプリプロセスを実行するとき , ク ライアントが指定します。 Fig. 4 に , プリプ ロセスされた文の実行の例を示します。レ キシング , パーシング , そして最適化のオ ーノヾヘッドがない ことに , 注目してください 関数コールによる文のプリプロセスとデ ータベースへのストアは , スタティックな SQL 文のランタイムオーバヘッドを縮減し ますが , しかしそれはデベロッパにとって はたいへん複雑な開発課題となります。プ リプロセスされた文を実行するためには , それに渡す変数のタイプや長さなどが分か らなければなりません。そういう変数はポ インタて、渡されるのて、 , 文の実行時に変わ ることもありえます。コールの部分の書き 方を間違えると , データ上書きという悲惨 なエラーが起きたりもします。端的に言う と , ユーザは各文をランタイムに実行する ことに比べると大幅な高速性を享受します が , デベロッパは , ダイナミックな SQL 関 数コールを書くことに比べるとはるかに難 List 1 printf("Error declaring variable. }n") ; exit( の ; C-D ロー 8 0 ) 01 よりん 00 4 ・【 0 ^ 0 叮ー 8 01 ↓つな 4 ・【 -0 れ 0 ー 8 01 ↓っ 0 00 4 【 0 6 7 8 9 0 ↓り ^ 0 4 -- 0 00 っ 0 っ 0 っ 0 4 -4 《 4 ・ -4 -4 ・ 414 -414 ・ 4 :. 0 【 0 【【 0 【 0 【 0 【【 0 戸 0 6 ^ 0 6 6 6 6 6 6 6 6 7 7 7 7-7 7 name [ 0 ] scanf("Enter minimum amount to check for: Xd", &min amt) ; / * テ・一タへ・一スへの照会を実行する . * / i f (SQL_Execute—Statement( "OPEN prod_curs", &SQLCODE) ! = の printf("Error opening cursor}n") ; exit( の ; printf("*nThe following products need to be reordered:*n") ; / * 照会結果の情報の各行を取得する . * / while ( 1 ) if (SQL_Execute Statement( "FETCH prod_curs "INTO :name, :code, :price" &SQLCODE) ! = の break : printf("Product: Xs}n", name) ; printf( ” Code: Xd*n ” code) ; printf("Price: $ % 6.2f}n*n", price) ; / * ェラーが Not Found ( 10 のか確認する * / i f (SQLCODE ! = 10 の printf("Error retrieving row}n") exit( の ; / * 情報が 1 行も返されなかったら ' name ' は無設定 . * / if (!strlen(name)) printf("No products need to be reordered. }n") ; / * フ。ロク・ラム・コート・の続き ... * / List 2 組み込み SQL のコード片 1 : main() 3 : long SQLCODE; / * SQL 文の中で使う変数の宣言 . * / 4 : 5 : EXEC SQL BEGIN DECLARE SECTION; 6 : int min_amt; char name[20] ; 7 : float price; 8 : 9 : int code : EXEC SQL END DECLARE SECTION : 13 : / * カーソルと照会を宣言 . * / 14 : EXEC SQL DECLARE prod_curs CURSOR FOR SELECT prod. name, prod. code, prod. price FROM pr od, onhand WHERE prod. code ニ onhand. code AND onhand. num く :min_amt; / * プログラムのコード . . * / 22 : name [ 0 ] 23 : SQL のパワーを活かすために 31

3. 月刊 C MAGAZINE 1992年7月号

ealizin the P0tentia10f SQL しい仕事を引き受けることになるのて、す。 組み込み SQL プリプロセッサは , プリコ ンパイラとも呼ばれ , SQL 文をプリプロセ スして高速性を実現したい , というアプリ ケーションの , コーディングとデノヾッグに 要する労力を , 大幅に縮減します。プリプ ロセッサを使うと , デベロッパはランタイ ムのインタフェイスについて知る必要がな くなり , SQL 文をストアして実行するため のポインタを管理することも , 不要になり ます。 組み込み SQL のアプリケーションを書く ためには , SQL 言語のシンタクスを知って いさえすればよいのて、す。プリプロセッサ が , コール時のプリプロセスと同じステッ プを実行して , SQL 文をプリプロセスし , データベースにストアします。文の実行は , 関数コールによってプリプロセスされスト アされた文の場合と同じステップて、 , 行な われます。 しかし , このプリプロセッサ方式て、は , SQL の文がホストの言語の中に混在するこ とになりますから , 文は一定の決まったト ークンにより , その始まりと終わりがはっ きりと示されなければなりません。 SQL 文 の中て参照される変数も , やはりそういう トークンを付けて宣言されなければなりま せん。プリプロセッサが各文をプリプロセ スするために必要な関数コールを実行し , アクセスプランをサーバ上にストアします。 アクセスプランをストアした後 , プリプ ロセッサは組み込み SQL のテキストを , 実 行時に渡されるべきパラメータ類も含めて , ストアされた文を実行する実際の関数コー ルへと置き換えます。ホスト言語のコード は , プリプロセッサを素通りするだけてす から , プリプロセス後のコードは , ストア された SQL 文の実行をコールする文があち こちに混在しているホスト言語のコード , という姿になります。このプリプロセス出 力が , コンパイルされリンクされます。 List 2 scanf("Enter minimum amount tO check for: Xd", &min_amt) : / * 例外処理をセットアップ . * / EXEC SQL WHENEVER SQLERROR goto report_error; EXEC SQL WHENEVER NOT FOUND goto end_loop ; ″データベースへの照会を実行 . * / EXEC SQL OPEN prod_curs : printf("*nThe f01 lowing products need tO be reordered: }n") ; / * 照会結果の情報の各行を取得 . * / while ( 1 ) EXEC SQL FETCH prod_curs INTO :name, :code, :price; printf( ” product : Xs*n", name) : printf ” COde: Xd*n ” , code) ; printf ” price: $ % 6. 2f%n*n ” , price) : end—loop: 1 行も情報が返されなかったら ' name ' は空 . * / if (!strlen(name) printf( ” NO products need tO be reordered. *n ” ) ; プログラムのコードの続き ... * / 4 5 6 7 8 9 01 2 3 4 5 6 7 8 9 012 3 4 -0 6 7 8 9 2 り 2 りりっ 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 Fig. 4 プリプロセス済みの SQL を実行する際のクライアント / サーバ間の対話 1 . SQL 文のタグがリクエストメッセージへとバッケージされ , その文の中で参照されている入力用の 工ンティティの値が , そのメッセージの中へコピーされます。 2. リクエストメッセージがテータベースサーバに送られ , そこでアンバックされます。 3. テータベースサーバは送られてきたタグと結びついているアクセスプランをテータベースから取り 出しそれを実行します。 4. そのアクセスプランの実行ステータスと , 出力用のエンティティおよび変数の値が , リプライメッ セージの中へバッケージされます。 5. リプライメッセージが , クライアントに送られます。 6. クライアントはリプライメッセージをアンバックし , 出力用工ンティティと変数を表す返されたテ ータをコピーします。 プリプロセス後の組み込み SQL List 3 1 : main() 3 : 1 ong SQLCODE ; / * SQL 文の中で使う変数の宣言 . * / 4 : EXEC SQL BEGIN DECLARE SECTION ; 6 : 8 : int min_amt : char name[20] ; 9 : 10 : float price; 11 : int code ; 12 : 32 C MAGAZINE 1 2 7

4. 月刊 C MAGAZINE 1992年7月号

プログラミング C クイズ研究会 ーーイ直を返す関数 , gets ( ) ~ 先月の C お茶会の後 , 出席者のひとり榛沢 参加ください。 朝倉文夫 もしれん。 美保さんから NIFTY ー Se Ⅳ e を通じてメール 遺言じみて申し訳ないが , 志半ばにてむ このメールは先日プリントしてロバート をいただいた。小さなプログラムがそえて 佐々木氏に伝えておいた。そして , 先ほど , くわれぬ一生を終えるとも , 以後は丹羽さ あったのて、紹介する。く子供 . c > て、ある。 返事をいただいたばかりて、ある。 んがひとりで連載を続け , 小生が全生命を リスト最後のコメントは , 榛沢さんからの なんだか , 最近疲れていかん。 かけて C を学んできたことを後世に伝えてほ メッセージだが , 私もこのプログラムの最 毎月 , C 学習のためにどこかへ出かけている しい。最後に , 最近お気に入りのメールに 後て、 printf された文字列には , 複雑な思いを ことも体力を消耗する一因と思うが , パソ 関するプログラムくメール . C > を贈る。 いだいてしまった。共感する読者の方も多 コン通信でのメールのやりとりに凝ってし ロバート・佐々木 いと思う。さて , 今月はこんなメールが舞 まい , 夜ふかししているのも一因であろう。 おやおや , これは一大事て、ある。手紙か い込んて、きた。 今回も , 招待の声がかかっているようだ らすると , ロバート氏はかなり弱気になっ 有な略 が , 非常にありがたいことである。しかし , ているようだ。しかも , 今回のプログラム C でクイズしちゃおうというノリで発足し 以上のような事情であるから , 出席するつ を起動させてみると , どうにも意味不明て、 た , C クイズ研究会の発起人の朝倉といいま もりだが , 当日の健康状態によっては参加 ある。いったい , 毎晩どんなメールのやり す。最近 , ネタがなくて困っているのです できないかもしれん。その点は了承願いた とりをしているのだろうか。 が , ロバート氏と丹羽さんならば何かネタ い。当日 , 電車の待ち合わせの時刻に遅れ ところて、今回は , 関数が値を返している。 をいただけるのではないかと思い , ご招待 るようなことがあれば , 病気か , 体調不調 とにかく , 細かい事情を別とすれば , だい します。場所は都内の寿司屋です。ぜひ , か , あるいは , 最悪の場合は死んでいるか ぶ上達したようて、もある。しかし , 残念な 子供 . c 円羽信 ー夫の、、 ( その 7 ) イラスト / 山形彰吾 List 2 List puts " 貴君から女性へのメールポックスだ . " ) : 13 : 14 : puts puts " 1 相手の女性にメールを送る。 15 : puts " 2 貴君あてに届いたメールを読む。 " ) ; 16 : puts ” 0 終了する。” ) ; 17 : 18 : scanf("%d", &temp_menu_num) : fflush(stdin); 19 : 20 : 21 : return temp_menu_num,• 22 : 23 : } 24 : 25 : void wait_crkey() 26 : { puts ( " リターンキーを押せ . " ) ; getch(); 28 : 29 : } 30 : 31 : void get il ( ) 32 : { 33 : char *mai 1 buff ; 34 : 35 : puts "#n ” ) ; 36 : puts " メールを入力せよ . " ) ; gets mail_buff) ; 38 : puts 39 : puts ”気持ちが通じるとよいのだが . 40 : 41 : mail sent=l; 42 : / * こちらがメールを出すと相手も返事をよこす * / 43 : 45 : 46 : void disp-mail() 47 : / * 届いているメールを表示する * / 48 : { 49 : puts " 貴君に届いているメールだ . ” ) : 50 : put S puts ' " 陽子 , 昨夜はわるかった。あやまりたいので 6 時にルノアールで . 52 : puts ”明子さん . どうして私の方を向いてくれないんですか . ” ) : 53 : puts 54 : puts " メールは以上だ . 2 通も来てうらやましいだろう . " ) ; 55 : puts 1 : #include く stdio. h> 2 : / * 子供 . c * / 3 : 4 : main() 6 : int oya; 7 : int ko; 8 : puts ( " お子さんは何歳ですか . " ) ; 9 : 10 : scanfC'Xd", &ko) ; puts(' 何歳の時のお子さんですか . 11 : 12 : scanf( ” Xd ” , &oya) ; printf " あなたは今 % d 歳ですね . #n",oya + ko); 13 : printf " あれからもう % d 年になるのですね . #n",ko); 14 : 15 : } 16 : 「あたりまえじゃん . しよーもない ! 」と叫ぶか、 17 : / * 18 : / * 実感 ! するかは、人それぞれ . 19 : / * でも、私なんかは、今、しみじみ・後者です . では、また . List メール . c 1 : #include く stdio. h> 2 : #include く coniO. h 〉 3 : #include く process. h> 4 : 5 : int mail sent=O; 6 : / * メールを出したら 1 出さないとゼロのフラグ * / 7 : 8 : int menu(void) int temp_menu_num; 12 : 164 C MAGAZINE 1992 7

5. 月刊 C MAGAZINE 1992年7月号

リ The + れていた template や exception handling は , みましよう。 バイプルて、は正式に言語の一部となってい 参考文献 ます。 [ 1 ] M. A. Ellis and B. Stroustrup, TThe 次回には , クラス機構のさわりを予定し 参考文献 [ 1 ] は , ARM という名前て、知 Annotated C 十十 Reference Manual 』 , Addison-Wesley, 1989 (ARM) ています。て、は , また来月。 られている , 注釈っき C 十十リファレンスマ [ 2 ] B. Stroustrup, fThe C 十十 Program こまて、タイプして凝った肩を ニュアルて、す。 C 十十のインプリメンタや工 ート向けに書かれた本て、 , C 十十言語 ming Language Second Edition 』 , Ad キスノヾ 「すいませーん , コーヒーのおかわりおね の細部に渡って細かい考証がなされていま dison-Wesley, 1991 がいしま ~ す」 [ 3 ] B. Stroustrup, fData Abstraction in す。 ANSIC 十十標準化のべースドキュメン ふと回りを見渡すと , おかしな 3 人組が目 トにもなっています。 C, AT&T UNIX Readings and Appl に入りました。ラップトップを前に 参考文献 [ 2 ] は , C 十十のバイプルと呼 ications Volume II 』 , AT&T, 1986 やらきゃーきゃーいっていますが ( いるかそ ばれることもあり , C 十十開発者の Dr. Str んなやっ ( 笑 ) ) ・・・・・・。何をやっているのか , oustrup 自らが著わした C 十十言語について 気になる人はコラム SubStory 十十を覗いて 最新のマニュアルて、す。 ARM て、実験的とさ 使われているのね。 C 子 : inline BYTE HiByte(WORD c) { return c > > 8 : } ってやっ ? てもこれ , 私なら # define て、やっちゃうな。 プラ子 : この程度なら #define< もいいんだけどね , #define HiByte(c) ((BYTE)(((WORD) (c) > > 8 ) & 0x 幵 ) ) こんな感じて、ちょっとややこしくなっちゃうね。 C 子 : そういわれてみるとそうね。 プラ子 : マクロには型がないからキャストをきちんとしてやら ないといけないし。インライン関数なら , 関数が型を持つ から大丈夫。 C 子 : なるほどね ~ 。いいかもしんない。ても , マクロ定義だ は悪しからず・・・ 次回は 叩き , も減るんじゃないかな。効率はマクロと変わらないし。 C 子にそうね。 C 十十って意外とおもしろそうじゃない。 プラ子 : というわけて、 , 付録ディスクにはもっとしつかりした ものがついてます。 DOS/V 版もありますよ。常駐するし各 種画面モードにも対応してますから、そっちも見てくださ C 子 : 誰に向かっていってるのよ プラ子 : じゃまた来月。 ぶらなりあ : ぶらぶら。 textsave. cpp 1 : 〃一 9801 ( ノーマルモード ) 用テキスト画面のセプ 2 : れ仙 de く & t は iO 〉 3 : #include く dos 、 h> 4 : れ龜面 e く jctype. 矗〉 6 : typedef unsigned 朝 a に BYTE; 7 : typedef unsigned short WORD; 8 : 9 : typedef BYTE 卿 RA 25 ] [ 80 ] 「 2 ] ; 10 : TVRAM& 軒 a 第ネ ( TVR のー ( 0Xa000 , の : 11 : 12 : li れ 0 WORD Word(BYTE 10 : BYTE (i) ( で e い 11 ( ( 和 R の域くく 8 ) ; ) 13 : inline BYTE LoByte(WORD 0 ) ( 「 0 加新 c; ) 14 : inline BYTE HiByte(WORD c) ( return 0 》 8 : 。 ) 16 : void xtSa マ 001 阯 ) fo 「 (int y 第 0 : く 25 : y + + ) ( fo 「 (int ま 0 ; にく 80 : ) ( 20 ・ putc(vran[y] [ 灯 [ の , 朝 ) : 21 else ( 22 WORD 郎三 jistoj 用 S(W。「d(眈明[ⅵ[X]は]を”衵 [ y ] [ x ] [ の + 0 メ 2 の ) ; 23 も 0 ( HiByte ( ). fp)'v 24 putc(LOByte(ms). fp): 25 : 26 : 27 : 32 : 33 : nain(int char** argv) 34 : ( れ事 fp ま fo れ ( a 「 [ 1 懿、 t つ : 35 : TextSave(fp); 36 : fclose( (p) : 38 : 「 0 い 0 : 39 : ) List A #define HiByte(c) こんな風にしてあげれば HiByte(ch) なんて代入がてきちゃうよ。 プラ子 : 確かに , さっきのインライン関数ては無理ね。て、もま っかっせつなっさつい ( 誉 ) / 。参照をもらって参照を返せ ばいいのよ。ほら , こんな具合。 inline BYTE& HiByte(WORD& c) {return (*((BYTE*)(c) + 1)) ; } C 子 : ヘー。ヘー。おもしろいのね。 ぶらなりあ : ぶらぶら。 ( こいつはこれしか喋れないのか : ) プラ子 : ( 無視して ) もっとも , 全部が全部のマクロをインライ ン関数に置き換えることがてきるとまて、はいわないけどね。 なるべくインライン関数を使うように心掛けていればミス と C 十十入門講座 93

6. 月刊 C MAGAZINE 1992年7月号

テパッガ lnstant-D DOS/4G にはスクリーンデノヾッガ lnstant -D ( d32. exe) が付属している。コンパイラが WATCOM C / 386 の場合 , Instant-D て、デバ ッグするには , Fig. 6 のような手順て、コンパ イル・リンクを行う。また , あらかじめ環 境変数 INSTANTD を , 使用するアダブタ (VGA, CGA, EGA, MDA, MONO) に合 わせて設定しておく。 Instant-D は , ・プログラム情報の全表示 ( ソースコード , アセンプリコード , 全シンポル , スタッ ク , レジスタの状態 , Fig. 7 ) ・パフォーマンスアナライザ (PC/AT 互換 機のみ ) ・ビジュアルな呼び出し追跡 ・プログラムの中からのデノヾッガコマンド の起動 などの特徴を持つ。 ースを WATCOM C / 386 に移植するときの fmsbintoieee ( ) , fieeetomsbin ( ) など ANSI* 拠度 これらについてはソース互換性がないが , 問題点という面から見てみると , MS-C V er. 6.0 が独自に拡張したり 16 ビットコンパ 両者ともに ANSI にかなり準拠したコンパイ ラなのて、 , この範疇に入らぬ通常のソース イラ依存部分 , すなわち Plum HaLI Validation Sampler による A ・ sizeof ( int ) = 2 に依存したコーディング て、あれば問題のない互換性があると思われ NSI 準拠度チェックて、は , デフォルトの状態 ・新キーワード fastcall, asm, _seg, る。グラフィックは互換性がないだろうと て、 79 点満点中 78 点をマークした。これは , WATCOM C / 386 独自の拡張によるオプテ 、、〃〃による行内コメント 高をくくっていたのだが , graph. h が WAT イマイズて、値を返さない関数があるためて、 , COM C にも用意されていた。内容はまるき basecl'tk インタ 『 No. 58 数学ライプラリのセットする errno り MS-C の graph. h と同じて、 getcurrentpos bmalloc( ) などの b???( ) 系関数 ・ long double ( 80 ビット浮動小数点数 ) のサ setlinestyle ( ) などの MS-C 互換 の値』に関するテストは , コンパイル・リ ition( ) , グラフィック関数はほとんどプロトタイプ ンクは行えたが結果が正しくなかった。そ 数学関数て long double 型の引数と返り値 宣言されている。しかし , それだけて、 , マ れて、も , MS-C Vre. 6.0 が 76 点 , High C3 をもつもの (atanl ( ) などの ? ? ? 1 ( ) 系関数 ) ニュアルにもライプラリ内にもグラフィッ 86 Ver. 1.7 が 72 点 , Towns gcc 2.1 が 66 ・ pg チャート関数 点 ,djgcc 1 .39 が 59 点て、あるのと比べて , 極 ク関数は入っていない めて好成績て、ある。なお , / za オプションて、 _pg analyzechart ( ) などの pg チャート関 そのほかの特徴 独自拡張を禁止すると全テストにて、正しい 数 ( ヘッダファイル pgchart. h) 値を返した。 ・日本語関数 ヘッダファイル jstring. h に含まれるもの 付属ツールについて MS ー C とのソースライフラリ互換性 ・ OS / 2 関係 WATCOM C には wmake, touch, wdis 0S2. h , pm* . h 無論 100 % の互換性はない。 MS-C 用のソ ・浮動小数点のフォーマット変換 asm, womp などのツールが付属している。 Fig. 7 テパッガ旧 stant ー D の画面 Program Star t cstart + 0 0308 : 0017F4F4 EB69 0017F55F J IIIP 0308 : 圓 17F4F6 57 push edi 0308 : 圓 17F4F7 41 1 nc eCX 0308 : 0017F4F8 54 push esp 0308 : 0017F4F9 43 ebx 1 nc 0308 : 0017F4FA 4F dec ed i 0308 : 0017F4FB 4D dec eb 20?ebx] al 0308 : 0017F4FC 204320 and edi, [eax) 0308 : 0017F4FF 3338 xor ss:75Cedx],dI 0308 : 0017F501 36205275 and ds:[esi] 0308 : 0017F505 6E outsb 0308 : 0017F506 2D54696D65 sub eax, 656D6954 Instant-D vers ion 4. 04 Copyright (C) 1987 ー 1990 , 1991 by RationaI Systems, lnc. compi ler ニ WC 640K main memory, 347K avai lable Largest free block 636P. Largest lockable block 636P. Linear address space 768P. Free 1 inear 636P. PageabIe 636P. Free phys ical 636P. T0tal physical 768P. Ⅷ file size OP. HELLO. EXE Instant-D 4.04 80386 sw=l es P 00000000 = 00000000 00000000 eax ebx = 00000000 00000000 ニ 00000000 001827E4 eCX edx ニ 00000000 001827E8 ニ 00000000 00000000 eS1 edi ニ 00000000 00000000 ebp = 00000000 00000000 = 001827D0 00000000 esp ds ニ 0310 00000000 es = 0028 00000000 fs ニ 0000 00000000 gs = 0020 00000000 ss = 0310 00000000 00000000 cs = 0308 00000000 = 0017F4F4 00000000 e1P 00000000 efl = 00000200 00000000 . 00000000 STI CLD 00000000 00000000 cstart 3 速報 WATCOM C / 386 ver 8.5 43

7. 月刊 C MAGAZINE 1992年7月号

Access Ca rd C MAGAZINE アンケートカードをこ・利用ください。 アイデ ) 式合 ストレートの副球、 しつかり受け止めて下さロ。 アイテルはいま、プロジェクト , マネージャー経験者、 ー及びビジネスゞアプリケーション、バッケージの経験者、 確かな技術とノウハウをもとに独創的な企画提案のできる SE を、 積極的に、真剣に求めています。 ここ幕張ワールド・・ビジネス・ガーテンから ~ 独自のアイテル . ・ワールドをますます広くさらに発展させると同時に 新規事業をスムーズに展開していくためのキーをスタッフとして リ :- ダーシップをとれるエリート、・エンシニア、 自分の力と技術で夢に挑戦するクリエイテイプな技術者を求めます。 優秀な仲間とがっちり組んで、新しいフィールドに挑みたいと考えますの 強くてまっすくなアイテルの気持ちは、まるでストレートの剛球。 . 真っ向からし、つかり受け止めて、さらに力強く投げ返すことのできる 技術と才能とパワーにあふれるスタッフを募集します。 プロジェクト・・、マネージャ—としての経験かあるん プロジェクトの推進に当たって顧客との折衝力に優れた人、また各プロジェクトの 進捗管理手法を熟知している人、工数管理のできる人を求めま ビジネス・アプリケション・叭ッケージの経験者 UN Ⅸの開発ツル、アプリケーション・バッケージに詳しい人、また U N Ⅸに限らビジネス・アプリケーション、・パッケージの開発に際して 提案、発案能力のある人、 . 及び特定の業種 : 業務に群しい人を求めます アイテルの欲しい技術力 / 求める人材 ・ UN Ⅸのシステム管理者としての経験がある人 ・ OPEN -90 MOT 『等の GU 用いた開発経験がある人 ・Ⅲ FOM ⅸ : 、 ORACLE 等のリレーショナルデータベースを年いた開発経験がある人 ・ UN Ⅸマシンと PC との連携 ( LAN ) の開発経験がある人 さらに・ CIM 開発の経験がある人… . ・ HP : 9000 の経験がある人 ・三鷹、蒲田、幕張に勤務できる人 ※上言己こ関して経験がなくても、意欲のある人は歓迎いたします ■会社概要、設立昭和 55 年 3 月 . 資本金 >6 网万円 ( 授権資本釜 / 2 億円 ) : 従業員数名年商引幻意円 ( 平成 4 年イ月実積 ) 主要取引先富士ミ槲ご富士通グルー ・、プ各社ぃ可電、他工ンド三一ザー各社 - 関連会社掬アイテル総合研究所事業内容トビジネスアプリケーショ・ンシステム、 ~ ー制餓・通信システムの、 / フト開発 ■募集要項 ( ' 9 」・年度実績 ) ・職種システムエンジニア仕事内容ビジネスアプリケーシン、制御系ジステム , 通信システム、 . ワークステーション、、ウープロなと・の 開発を中心とする最塹プロジ土クトに多数参加、幅広い領域にわたるジステム構築に取り組んでいたたきます 6 使用言語 >C 言語、、 COBOL 、 PL ないアセンプラ・表 骼高卒以 - 上 20 ~ 35 劇乞の方、 ( 糸驟 2. 年以と ) ・、 : 給与ト固定制 07 方田円以上 ) 〔給与例〕平成 4 年 4 月初任給実績専門卒 / け万 820 円大卒 / 頂万円 26 歳土任例 / 月額固定給 25 万円引歳課長価レ月額固定給引万円 ( 賞与 6 ・カ月 / を年度実績 ) ※すべて住宅・都市・財形手当含む待遇昇給年 I. 回、賞与年 2 回い交通費支給、 、各種社矣完備、退職金制度、社員寮完備、諸手当 / 球業、財形貯蓄、住宅、都市 : 家族、資格 : ー・時金 ( , 2 種 2 方一種 5 万円、 . 特種・、・シろテム監査万円、オン ? イ . ン 5 万円 ) : 毎月い種一万円い特種 2 万円、ジステム監査 3 万円、オンライント方 580 円 ) 、社員持株制度、冫ト研修制度、傷害イ気社員旅狩、月一回スーツデ、各 、、種クラブ活動 ( 里分求・テニスすスキ・ゴルフ・他 ) あり、・保養セ・ンター ( 熱海・箱根、伊豆・井沢・湯沢 ,. 草津・伊勢・琵琶湖・白浜・・別府与論島 ) -. ・動務地幕張、 由、三鷹、仙台い大阪、福岡動務時間フレッグスタイム制アタイム ( 標準労 1 間一日も時間 ) 徠日休暇完全休 2 日制 ( 土・日文祝日、年末 ・年始 , 夏季・有給慶弔一応の上、履歴書 ( 写真貼イ寸 ) と業務経歴書 ( 書式自由 ) を持参文は郵送ください、※ド AX での応募も受け付けま FAX(Q43). 四 7-27 ※入社日、面接日など相談に応じます。交通 R 京葉物海浜幕張駅下車徒歩 2. 分」 R 総式線幕張ー下車幕張メッセ行ぎバス 7 分 ・採用連紹先〒ト 7 トー午葉県千葉市美浜区判能ー 6 WBG マリプイースト 22 階アイテル株式会社〒 ( 0 ) 四 2 育も旦当 / 人材開発室 01 」側 - 便 49 行 ) C MAGAZINE 1 2 ・ 7

8. 月刊 C MAGAZINE 1992年7月号

実懿プロクラミング by Ste 奥村晴彦 。第 4 回 「 etu 「 n の働き・ポインタ ~ 、今回は , ますバッチファイルでキ—入力をするプログラムを作りま 、す。これに関連させて , コマンドライン引数に 1 文字入力 , 文字列 , ポインタなどについて説明します 6 後半は少し難しいかもしれませ んが , ひとつひとつサンプルプログラムを試していけば ; 意外と簡 単に動作か理解できるでしよう。 とするだけて、 , 誰がいっサポったか , すぐ わかってしまいます。 しかし , 別のプログラムやバッチファイ ルからプログラムを起動するときは , retur n の返す値を利用することがて、きます。 ついに情報処理技術者試験カ℃言語て、も受 以下て、は MS ー DOS について説明します。 験て、きるようになるそうて、すね。ずいぶん たとえば , f00 , bar というふたつのプロ 重い通産省の腰て、したが , これて、私も安心 この連載のプログラムて、は , main ( ) の最 グラムをこの順に実行したいとしましよう。 して C 言語を教えることがて、きます。 後は必ず キーポードから 私は某大学て℃言語などを教えているのて、 / * 成功 * / A > f00 return 0 すが , 使っている教科書はもちろん℃マガ あるいは ( 新しい C 言語のスタイルて、 ) A>baHU ジン』て、す。 return EXIT SUCCESS ; / * 成功 * / と順に入力してもいいのて、すが , 以下に説 学生たちはたいへん熱心に授業を聞いて または 明するようにバッチファイルを使うことも return E 刈 T FAILURE ; / * 失敗 * / くれるのて、すが , キーを探すのに精いつば て、きます。 いの者も多く , 行番号まて、打ち込んて、しま となっています。 バッチファイルとは , 拡張子が . bat のフ C 言語の本によっては , ったり , 全部大文字にしてしまったり , コ ァイルて、 , これに実行したいプログラムの ンマとヒ。リオド , コロンとセミコロンを間 return ( の ; 名前を書き込んて、おくと , その順に実行し のように余分なカッコがついてたり , 違えたり。 C 言語そのものより , とにかくキ てくれるというものて、す。具体的には , 工 ーポードに慣れてもらうことに苦労してい exit ( 0 ) ; デイタを起動して ます。これて、英語のエラーメッセージに怖 のように return の代わりに exit が使ってあっ f00 じない英語力があれば , C 言語は半分わかっ たりします ( exit の場合はカッコが必要て、 bar たようなもの ( ? ) 。 す ) 。また , return も exit も使っていないも と書き込み , これを baz. bat というファイル UNIX マシンを使った演習て、は , パソコン のもあります。 名て、保存しておけば , 今回はまず , この return の働きを詳しく説 A>baz(U に比べてあまりにもコンパイルが速いうえ に , 工ラーがなければメッセージが出ない 明します。 と打ち込むだけて、 , プログラム f00 , bar を のて、 , 「コンパイラが起動しない」と勘違い 結論からいいますと , MS-DOS て、も UNI 順に実行してくれます。 X て、も , 単独にプログラムを実行するかぎ した学生もけっこうおりました , こて , もしプログラム f00 の実行中に工 それにしても UNIX はいいて、すね。 り , main ( ) に return がなくてもまったく困 ラーが発生したならプログラム bar は実行し りません。 ないようにするには , 次のようにします。 余談 in ( ) の「 etu 「 n の意味 ac -d -p 116 C MAGAZINE 1992 7

9. 月刊 C MAGAZINE 1992年7月号

List 2 は , SQL 組み込みの C のアプリケー ションから引用したコード片て、す。このコ ード片は , List 1 て示したものと同じ機能を 実行します。このコード片をプリプロセス すると , List 3 のような形になります。プリ プロセッサは , 組み込み SQL の文をコメン トアウトし , それを , 最適化されストアさ れた文を実行する関数コールへと置換して います。この , プリプロセッサからの出力 が , コンパイル ~ リンクされて , 実行プロ グラムがて、きあがります。 一部のデータベースペンダが提供してい るプリプロセッサは , SQL 文をダイナミッ クな SQL 関数コールに変換するだけて、 , 実 際のプリプロセスや , SQL 文をサーバにス トアすることをやりません。こういうユー ティリティはデベロッパには便利ても , ユ ーザは真のプリプロセッサから得られる高 速性を入手て、きません。 どちらか良いか ? 上に述べたように , スタティックな SQL もダイナミックな SQL も , 関数コールを使 って実行て、きます。しかし , オーバヘッド が伴うために , 関数コールはダイナミック な文にしか適していません。 SQL プリプロ セッサは , 理論的にはダイナミックな SQL の処理にも使えますが , しかし 1 回きりの問 い合わせを処理するために組み込み SQL の アプリケーションを書くのは馬鹿げていま す。スタティックな SQL をプリプロセスす べきてあり , ダイナミックな SQL は関数コ ールのインタフェイスを通じて実行すべき て、す。 SQL 文を関数コールてプリプロセスする ことにより , デベロッパはストアされる文 に意味のあるタグを付けることがてきます。 この能力によって , たとえば Sybase の SQL Server の参照保全制約 (referential integri List 3 EXEC SQL END DECLARE SECTION ; / * カーソルと照会を宣言 . * / EXEC SQL DECLARE prod—curs CURSOR FOR SELECT prod. name, prod. code, prod. price FROM prod, onhand WHERE prod. code = onhand. code AND onhand. num く : min—amt; long prod—curs ; / * プログラムのコード . name[0] scanf("Enter minimum amount tO check for: &min amt) ; / * 例外処理をセットアップ . * / EXEC SQL WHENEVER SQLERROR goto report—error; EXEC SQL WHENEVER NOT FOUND goto end—loop; / * データベースへの照会を実行 . * / EXEC SQL OPEN prod—curs ; 34 【 0 6 7 8 9 0 1 り 0 3 4 【 0 6 7 89 01 りっ 0 4 【 0 6 7 8 9 01 りな 3 4 【 0 6 7 8 901 り 0 4 -06 7 8 9 01 りな 00 4 【 0 6 7 8 9 0 、↓り 0 00 4 【 0 6 叮ー 8 9 1111111 りっりつりなっ 0 0 っり 00 3 00 00 00 3 00 3 33 3 4 4 4 4 4 4 4 4 4 4 【 0 -0 【 0 5 5 【 0 -0 【 0 -0 【 0 6 6 6 6 6 6 6 6 6 6 ワー 7 一 7 叮ー叮ー叮ー叮ーー 7- ー SQL_Execute Stored—Statement(), &prod—curs, &SQLCODÉ, &min amt) ; if (SQLCODE = 1 圓 ) goto end—loop; else if (SQLCODE ! = の goto report—error; printf("#nThe f01 lowing products need t0 reordered:*n") : / * 照会結果の情報の各行を取得 . * / while ( 1 ) EXEC SQL FETCH prod_curs INTO :name, :code, :price; SQL—Execute Stored—Statement(), &prod—curs' &SQLCODÉ, name, &code, &pr ice) : if (SQLCODE = 10 の goto end—loop; else if (SQLCODE ! = の goto report—error; printf( ” Product: Xs*n ” , name) ; printf( ” C0de: Xd*n ” , code) ; printf("Price: $ % 6.2f*n*n", price) ; end—loop: / * 1 行も情報が返されなかったら ' name ' は空 . * / if (!strlen(name)) printf( ” NO products need tO reordered. ” ) : / * プログラムのコードの続き ... * / SQL のパワーを活かすために

10. 月刊 C MAGAZINE 1992年7月号

実践アルゴリズム戦路解法のテクニック 2 : #include く jstring. h> FILE *fp 17 : ) 照 ) て、す。 jstrstr( ) は基本的には strstr( ) と 同機能の関数て、すが , 日本語対応になって いる点のみが strstr ( ) とは異なります。日本 語対応の中身の詳細については後述します。 List 2 は非常に単純て、はありますが , fgr ep の持つべき基本的機能はすべて備えてい ます。これて、十分な性能 ( 実行速度 ) が得ら れれば , もうこの回の執筆は打ち切っても よいのて、すが ー ) , どうてしようか ? 例 によって , べンチマークによって性能を評 価することにします。 fgrep の現実的な運用 を想定して , サンプルはパソコン通信のロ グファイル , 検索パターンは「ソフトバンク」 としました。 なお , この検索パターンは , サンプル中 に 1 回だけ現れます。ほかの条件は , Table List 2 key 1 : #include く stdi0. h> 3 : 4 : 6 : 7 : 8 : 9 : 10 : 11 : 13 : 14 : 16 : fgrep ( 素朴版 ) main(int argc, char *argvC]) char *key, buffC512] ; = argvC1]; fp = fopen (argv [ 2 ] , while (fgets(buff, sizeof(buff), fclose(fp) ; fputs(buff, stdout) ; if (jstrstr(buff, key) ! = NULL) / * 検索対象の文字列 * / / * 検索テキスト (p) ! = NULL) { / * 1 行読み込み * / / * 文字列のサーチ * / / * 文型が見つかればその行を印刷 * / 1 のとおりて、す。 これから説明する内容は , fgrep のみなら るための戦略を考えていくことにします。 目して , 高速な文字列検索プログラムを作 機能と性能のうち今回は性能 ( 速度 ) に着 ざわざ作る意味がありませんね。 りません。機能が低く性能も低いて、は , わ て、ついてくる「おまけ」の半分の速度しかあ します。つまり , 「素朴版」は , DOS に無料 てみると , FIND. EXE のほうは 23 秒て、終了 ば同じ機能があります。同じ条件て、測定し ーティリティが添付されており , fgrep とほ とえば , MS-DOS には FIND. EXE というユ す。ほかのツールて、はどうて、しようか ? た の情報を検索するのに , 46 秒かかっていま TabIe 1 に示したように , 約 1. IM バイト Fig. 1 st 「 str( ) , jstrstr( ) の説明 st 「 st 「と同等であるが , st 「と pa ern には日本語文字が現れ Cha 「 * jstrstr(const char * str, const char * patter) , pa れ ern がない場合は N ULL を返す。 文字列 st 「内に , 部分文字列 pa ern の現われる位置を探す。 char *strstr(const char *str, const char * pattern) ず , テキスト処理の大部分に通用する話な のて、 , 文字列検索に当面興味のない方もぜ てもよい。 素朴版の分析 ひ読んて、ください fgrep には , 大きく分けて以下の三つの機能 が遅い理由を分析することから始めます。 高速版を作るにあたって , まず「素朴版」 があります。 1 ) 文字列を読み込む 2 ) パターンを検索する はプロファイラ (Turbo Profiler など ) があ 索の時間を分析すればよいて、しよう。上記 合は少ないと思われるのて、 , 読み込みと検 このうち , 明らかに 3 ) の時間が占める割 3 ) パターンの存在する行を印刷する れば簡単て、すが , まだプロファイラは一般 TabIe 1 項 サンプル バターン 機種 べンチマークの条件 目 内容 テキスト 1 , 101 , 270 バイト 「ソフトバンク」 PC ー 9801 NS/E LSI C ー 86 ( 試食版 ) 46 秒 Table 2 読み込み・検索の実行時間 項目 読み込み (fgets) 検索 (jstrstr) コンバイラ 実行時間 時間 23 秒 23 秒 46 秒 実践アルゴリズム戦略解法のテクニック 95