五ロ 用 応 ー DOS が各機種専用になっているのは , この 部分が原因て、す。 一方 , MSDOS . SYS は COMMAND . COM やアプリケーションプログラムとのイ ンタフェイスをとります。このため , MS- DOS はバージョンが同じて、あれば , 外見上 はどの機種て、も同じインタフェイスになっ ています。 さて , 現在発売されているアプリケーシ ョンソフトウェアはマシン依存のものがほ とんどて、す。なぜて、しようか ? OS のファンクションだけを利用していた のて、は , ハードウェアの性能を十分に引き 出せないからて、す。とくに画面制御に関し て , OS のファンクションと BIOS て、は , 機能 とスビードに格段の違いがあります。 そのため , ほとんどのアプリケーション ソフトウェアて、は , BIOS も使用しているわ けて、す。 put_str 1 : 2 : / * put-str 3 : put-str(int x, int y, char *buf, int cnt) 4 : VO i d csr-posit (), y) : 6 : printf("X*s", cnt, buf) : 7 : 8 : return; List 2 put_chr 1 : 2 : / * put-chr 3 : put-chr(int x, int y,char chr) 4 : VOid csr-posit(x,y) : 6 : printf("%c",chr) : 7 : 8 : return; List 3 cls 1 : 2 : / * cls 3 : cls(void) 4 : VO i d param ロ ={ESC, ' [ ' 6 : static char 7 : printf("%. 4s", param) : 8 : 9 : return; 10 : } List 4 / / 0 ポート さて , すて、に述べたように BIOS はよく利 用される機能をまとめたものて、すが , もし 利用したい機能が BIOS にもない場合は , 「 I/ ()'* ート」を呼び出さなくてはなりません。 しかし , 一般にはよほどおかしなことを行 わないかぎり , I/O ポートを呼び出すなどと いうことはありません。 BIOS にしても , I/O* ートにしても , ハ ードウェアを直接呼び出します。 ェアを直接制御する場合には , ハードウェ ア情報はもとより , ハードウェアの知識を 豊富にもっている必要があります。その意 味て、 , 今回はソフトウェアレベルて、の機能 を利用するだけにとどめておくことにしま す。 SC ー制御コードと ESC シーケンス テキスト画面制御に関して , MS-DOS は ファンクションコール以外に ASCII 制御コード clear List 5 1 : 2 : / * clear 3 : clear(int Y) 4 : VO i d param[]={ESC, ・ [ ' 6 : static char 7 : csr-posit(l,y) : 8 : printf("X. 4s",param) : 9 : return; clr_right/clr_left 1 : 2 : / * clr_right 3 : 4 : VOid clr-right(int x,int y,int cnt) 6 : static char param[]={ESC, ・ [ ' 7 : i nt i : for(i=0;i く cnt,•i + + ) 8 : 9 : csr-posit(x,y 十 i); printf("X. 4s ” , param) : return; List 6 応用 c 言語 97
パラメータをセットした後て、 , printf 関 数て、出力しています。「 % 」に続く「 .4 」は精度 指定子て、 4 文字出力の意味て、す。「 s 」は変数 param の文字列出力て、あることを示しま す。 ライプラリが画面上に文字を表示する場 合や文字を入力する場合 , カーソル位置か ら表示 , あるいはカーソル位置て、入力する ようになっています (ListI) 。 put st 「 ( 文字列表示 ) 任意の場所に文字列を表示します。内部 て、 , csr posit 関数を呼び出しています。 printf 関数の「 % 」に続く「 * 」は , 表示する文 字数を引数 (cnt) て、渡すことを示しています 40 : / * 37 : VOid 36 : VOid VOid VOid VOid VOid 31 : VOid VOid 1 0 List 30 : 32 : 33 : 34 : 35 : 38 : 39 : 41 : 42 : 43 : { 44 : 45 : 47 : 50 : 52 : 54 : 56 : 59 : 63 : 70 : 77 : 86 : 92 : 93 : 98 : 100 : 101 : 102 : 103 : 104 : clr_right(int x,int y,int cnt); clr_left(int x,int y, int cnt); -fwd(void) : back ()o (d) : -up(void): down(void) : CSr_ CSr CSr_ CSr color (char *attr, char * c 引 0 に no ) : buzzer(void) : int main() str[60], work [ 20 ] . chr; Char int workno,x, y. cnt; menu: cls(); COIor(REV, SKY) : put - str ( 33 , 2. " 画面関数テスト " , 14 ) : c010r(0RG, WHITE) : csr-posit(), 5 ) : (List2) 。 put chr(l 文字表示 ) 部て、 csr posit 関数を呼び出しています。全 任意の場所に半角 1 文字を表示します。内 clea 「 ( 1 行消去 ) 用します (List4) 。 一般に起動直後 , 画面切り替えなどに使 します。 ソルは , ホームボジション ( 左上端 ) に位置 テキスト画面を全画面消去します。 cls ( 全画面消去 ) 角文字には対応していません (List3) 。 カー データだけを表示する場合 ( あるいは , その す。また , 左側に見出しを残しておいて , 一般に文字列表示を行う前に呼び出しま します。 カーソル位置から右側 ( 左側 ) を n 行分消去 ( カーソル右側 / カーソル左側消去 ) clr right/clr left す (List5) 。 一般に文字列表示を行う前に呼び出しま posit 関数を呼び出しています。 任意の 1 行を消去します。これも内部て、 csr CMAGAZINE 19 3 逆 ) にも使用て、きます (List6)0 102 printf()l : 文字列表示 \ n " ) : printf()2 : 1 文字表示 \ n " ) : printf()3 : 全画面消去 \ n " ) : printf( ” 4 : 1 行消去 \ n " ) : printf()9 : カーソル左移動 \ n " ) : pr i ntf ( " 8 : カーソル右移動 \ n" ) : printf()7 : ブザー鳴動 \ n " ) : printf()6 : カーソル左側消去 \ n " ) : printf()5 : カーソル右側消去 \ n " ) : printf()9 9 : 終了 \ n " ) : printf()1 1 : カーソル下移動 \ n " ) : printf()1 0 : カーソル上移動 \ n " ) : csr-posit(), 19 ) : clear(19); clear(18); case 4 : break : cls(); case 3 : break : put-chr(), Y, str[0]) : cls(); getxy (&x. (Y) : gets(str) : printf ( ”表示したい文字 = つ : csr-posit(), 18 ) : cIear(19): cIear(18); case 2 : break; put-str(x,y,str, cnt) : cls(): getxy (&x, (Y) : cnt=strlen(str) : gets (str) : printf(" 表示したい文字列 = csr-posit(). 18 ) : clear(19); cIear(18); case 1 : switch (workno) workno=atoi (str) : gets (str) : coIor(0RG, WHITE) : printf(" 処理番号 = " ) : csr-posit ( 0 , 19 ) : pr i ntf ( " 処理番号を指定してください。 Yn") : csr-posit(). 18 ) : coIor(0RG, SKY) : gets (work) : pr i ntf ( " 消去したい行番号 ( 0 ~ 2 4 )
五ロ 用 応 ことがて、きます。たとえば , カーソルの位 置づけて、は , カーソルの座標 ( X , Y ) を指定す ることがて、きます。 カーソル位置づけの ESC シーケンス ( ESC CpI ; pcH) は , 次のような文字列として出 力します。 x = 0 , Y= 10 とすると , 次のよ うになります。 char param [ ] [ 表 3 ] colo 「バラメータ define 名 List 9 バラメータ 0 7 ・・乙 - LO 定転線滅 既反下点赤青紫緑黄水白 0 日 G REV IJNDER 日凵 NK RED BLIJE PIJRPLE G 日 EEN YELLOW SKY WHITE CO ー 0 「 1 : 2 : / * col or 3 : 4 : color (char *attr. char * C010r - no ) VO i d param ロ ={ESC, ・ [ ・ 6 : static char 7 : param [ 2 ] =*attr; 8 : / * 表示属性 * / param[4]=*color-no; / * 表示色 * / 9 : param[5]=*(c010r-no + 1) : printf("X. 7s", param) : return; 13 : } 属 性 りし CO 1 / 8 0 りし Cu 0 し Cu 表示色 X 座標 Y 座標 これを CRT へ出力すれば , 指定した位置 にカーソルが位置づけられます。 サンプレプログラム サンプルプログラムは , 各関数のテスト 用のプログラムを内蔵しています。メニュ ーに従って , 操作すれば , 各関数のテストが て、きるようになっています。いろいろと , 自作の関数を増やしてください それて、は各関数を解説しましよう。 csr posit( カーソル位置づけ ) カーソルを任意の場所に位置づけます。 「 ESC = lc 」を使用しています。「 1 」 ( Y 座 標 ) , 「 c 」 ( x 座標 ) は , それぞれ 2 進数て、オフ セット 20H を加えた値て、す。 X 座標は , 0 ~ 79 まて , Y 座標は 0 ~ 24 ま て、となっています。以下 , XY 座標を指定す る関数は , この範囲て、指定してください たとえば x = 5 , Y= 10 とすると , 次のよう になります。 rnaln LlSt 1 0 1 : #include く i 0. h> 2 : # i ncl ud e く stdio. h> 3 : #include く string. h> 4 : #include く stdlib. h> 5 : #include く sysytypes. h> 6 : #include く sysYstat. h> 7 : 8 : #define ESC 0x 1 b 9 : #define B 亂し 0X07 11 : #define ORG 12 : #define REV 13 : #define UNDER 14 : #define B い NK 16 : #define RED 17 : #define B し UE 18 : #define PURP し E 19 : #define GREEN ” 20 ” 20 : #define YELLOW ” 21 ” 21 : #define SKY 22 : #define WHITE 23 : 24 : VOid getxy(int *x, int (y) : 25 : VOid csr-posit(int x, int y) : 26 : VOid put-str(int x. int y,char *buf, int cnt) : put-chr(int x, int y,char chr) : 27 : VOid cls(void); 28 : void clear(int y); 29 : VO i d char param [ ] {Ox1b, ' ' , Ox2a , 0X25 } ・ X 座標 Y 座標 応用 C 言語 101
ES C シーケンス をサポートしています。 これはファンクションコールの上位に当 たる部分て、すが , MS-DOS のファンクショ ンコールは , 画面制御についての機能が不 足しているため ESC シーケンスなどをサポ ートしています。 今回は , この ASCII 制御コードと ESC シー ケンスを利用して , 画面制御を行います。 ASCII 制御コードは , ASC Ⅱコード体系の 0X00 ~ 0x1f まて、のコード ( 制御コード / コン トールコード ) をさすものて、す。そのうちて、 CRT 画面を制御するコードを利用すると , テキスト画面を制御て、きます ( 表 1) 。 ESC シーケンスとは , ESC コード (0x1b) て、始まる文字列 ( シーケンス ) のことて、す。 ESC シーケンスを利用して , テキスト画面 を制御することがて、きます。なお , ESC シ ーケンスはハードウェアによってサポート している機能が違うのて , 注意してくださ い ( 表 2 ) 。以後 , とくにことわりのないかぎ り , ASCII 制御コードと ESC シーケンスをま とめて ESC シーケンスということにします。 使用方法 ESC シーケンスは , 使用したい機能のシ ーケンス ( またはコード ) を CRT へ送る ( 画面 出力する ) ことによって利用て、きます。たと えば , ASCII 制御コードの 0x07(BEL) を CRT へ出力すると , ブザーが鳴ります。 同様に , ESC シーケンスの「 ESC = lc 」を CRT へ送ると , 1 ( 行位置 ) と c ( 桁位置 ) て、指 定した箇所へカーソルが位置づけられます。 出力方法 ESC シーケンスは , 文字列として出力し ます。後に示すサンプルプログラムにある ように char 配列に ESC シーケンスを設定し て , それを画面出力関数 ( printf など ) て、出 1 : 32 : } List 6 25 : 24 : 23 : 22 : 17 : 15 : return; printf("X. 4s",param) : csr-pos it (), y 十 i) : for(i=0;i く cnt;i + + ) : int i : 20 : stat ic char param[]={ESC,' [ ' 18 : VO i d clr-left(int x, int y, int cnt) 16 : / * clr_left LlSt 7 buzzer 1 : 2 : 3 : 4 : 6 : 7 : / * buzzer buzzer(void) VO i d putchar(BELL) : return; csr-fwd/csr-back/csr-up/csr-down LlSt 8 return; printf("X. 2s",param) : static char param ロ ={ESC, ・ (') : VOid csr-down ()O id) / * csr_down return; printf("X. 2s ". param) : static char paran0={ESC, 'M ・ } : VOid csr-up (void) 24 : / * csr_up return; printf("X. 4s ". paran) : param[2]=l; 17 : static char paran ロ ={ESC, ・ [,,0, ・ D ・ }: VO i d csr-back(void) 13 : / * csr_back return; printf("X. 4s",param) : param[2]=1; static char VO i d csr-fwd(void) 2 : / * csr_fwd 40 : 39 : 38 : 36 : 35 : 34 : 33 : 30 : 28 : 26 : 25 : 23 : 15 : 14 : 12 : 9 : 8 : 7 : 6 : 4 : 3 : 力します。 パラメータの指定方法 ESC シーケンスては , パラメータを渡す 100 CMAGAZINE 19 3
0 「 m 面 00 from ( 0 pi 「 ma 「 5 gd = PC98 : gm = PC98C8 ; initgraph(&gd,&gm, " ) ; FMR シリーズて、は , ノーマルモ ード用の BGI ファイルをハイレゾモ ードて、使うことはて、きないのて、 , DETECT を指定しておくのが望ま しいて、しよう。この場合 , FMRM. BGI と FMRH . BGI を用意してお きます。 FMRL. BGI は直接指定し ないかぎり使用されません。この 場合 , 画面の大きさが異なるのて、 , 必要に応じて getmaxx( ) , get maxy( ) などの関数を使って画面 の大きさを取得しておくとよいて、 しよう。もちろん , ノーマルモー ドとハイレゾモードを別々のプロ グラムすることもて、きます。 こうしたプログラムて、は , 実行 ファイルとは別に BGI ファイルを置 いておく必要があります。 MS-DOS Ver. 3. x て、は , プログ ラムが起動したディレクトリやフ ァイル名を取得て、きますのて、 , プ ログラムの起動ディレクトリから BGI ファイルを呼び出すためには , List2 のようにしてプログラミング て、きます。 BGI ファイルをプログラム自身に 組み込んて、しまいたい場合は , BGIOBJ ユーティリティを使って BGI ファイルを . OBJ ファイルに変 ティレクトリやファイル名を取得 List 2 List 3 BGI ファイルをプログラムに組み込む場合 initgraph (&gd, &gm. bgidir); DETECT : fnmerge (bgidir, drv, dir, NU しし fnsplit (argv[0], drv, dir, file, int gd, gm; char drv[MAXDRIVE], dir[MAXDIR], char bgidirCMAXPATH] : main (int argc, char **argv) #include く graphics. h> #include く dir. h> NULL) : ext) : file[MAXFILE], ext[MÅXEXT] : 換し registerbgidriver を使ってプ ログラムにリンクします。特定の BGI をリンクするのて、あれば , regis terbgidriver が返した値とグラフィ ックスモードを指定します (List3)0 このときに , DETECT を 使って最適のグラフィックスドラ イバを検出したい場合は , すべて の BGI を組み込んて、おきます。 これらのフォントを頻繁に切り 換えるときは , 切り換えるたびに フォントファイルの読み込まなけ ればなりません。フォントファイ ルは , BGI ファイルと同じように Bouttext などて、 , ストロークフォ ントを使う場合は , settextstyle て、 フォントの指定 #include く graphics. h> main() List 4 int gd, gm: DETECT : initgraph (&gd, &gm. settextstyle (GOTHIC_FONT, フォント名を指定します (List4) 。 GIOBJ と registerbgifont を使って 実行プログラムにリンクて、きます。 こうしておけば , フォント切り換 えのたびにファイルにアクセスす る必要がなくなり , スムーズに切 り換えることがて、きます (List5) 。 住所変更された方へ 弊社からお送りしているアップ デートのご案内て、 , 転居先不明て、 戻ってくるものがかなりあります。 住所変更された方は , 必ずサポー トセンターにご連絡ください HORIZ_DIR, #include く graphics. h> main() int gd, gm; reg isterbgidriver if ()d くの abort(); PC98C8; gm ini tgraph (&gd. &gm, (PC98_driver): フォントファイルのリンク #include く graphics. h> main() List 5 int gd, gm; lnformation from Compiler Makers 137 in i tgraph (&gd, &gm, DETECT : if (registerbgi font (SMAL し _PONT) くの abort() : if (registerbgi font (GOTHIC_FONT) く 0 ) abort() :
C 十十 プログラミング 入門 コラム 2 補助クラス (Parameterized CIass) C 十十の設計者である Stroustrup は , 近い将来 C 十十 に容易に汎用クラスや容器クラス (Container Class) が 記述できる補助クラスの機能を導入すると述べてい る。これについては , いくつかの文献 ( 参考文献 [ 2 ] [ 4 ] ) で紹介されている。これによって , C 十十はコ ードの共有が可能な大規模なライプラリの記述に優 れた新しい機能を手に入れるであろう。 補助クラスは , キーワード template により以下のよ うに宣言される。 template く class PT > 補助クラスの名前は PT であり , これを使った汎用 スタック型は以下のように定義される。 class stack { private: PT * s; public: stack(ulong); stack(stack < PT > ) ; 名は , プリプロセッサて、処理されるため , 複雑なも の ( たとえば , ポインタなど ) は使用て、きません。そ の場合には , typedef により別名をつけます。 ロおわりに 今回は比較的有名なデータ構造をクラスて、実装す る例を示しながら , 実際のクラスの設計およびその 汎用版の作成を解説しました。これらの例はクラス 設計の適当な例題として取り上げましたが , すて、に oops や libg 十十て、優れたものが実装されています。そ れらについては , この連載の最後に紹介します。 コラム 3 genclass 現在ある処理系 ( release 2.0 以前 ) では , 汎用クラ く T >stack( く T >stack&); ス (Generic Class) を効率よく記述することはできな い。将来の機能 (Parameterized Class) では , これを簡 く T > pop(void); 単に記述できるであろうが , 今はマクロによる方法 などで我慢するしかない。 GN U C 十十ライプラリでは genclass プログラムによる興味深いアプローチを行っ ている。 genclass は特定の型についての容器クラスを 生成するが , その方法は Stroustrup のマクロによるも のではなく , Parameterized Class に近い記述を許して いる。そのため , 今後の修正は最小限に抑えられる。 Parameterized CIass 同様 , 擬似の型 (Pseude Type) の 表現にはく T > やく C > が使われる。以下にクラスス タックの例を示す。 class く T >stack { private: く T > * s; public: く T >stack(ulong); PT pop(void); PT stack く PT > : :pop(void) この型は以下のように使用できる。 stack く string > s1; stack く int> s2; このおかしな型名 ( たとえば stack く string > ) は typedef により別の名前にすることもできる。 この機能により , C 十十のプログラムのコード量は ドラスチックに減少することが予想される。また , コラム 3 で紹介するが , GNU では , 現状からこの機能 にスムーズに移行できるように genclass プログラムを 提供している。 参考文献 [ 1 ] Stroustrup , B. , 、、 The C 十十 Programmn ing Language" , Addison-Wesley , 1986. [ 2 ] Lippman, S. B. 、、 The C 十十 Primer Addison-Wesley , 1989. [ 3 ] Lea, D. , 、、 User's Guide to GNU C 十十 Library" , Free Software Foundation , 1989. [ 4 ] Stroustrup , B. 、、 Parameterized Types for C 十十〃 , ln Proc. USENIX C 十十 Confer ence, 1988. : POP(VOid) { く T > く T > stack : そして , genclass は以下のようにして , int 型のスタ ックを生成する。 ・ % genclass int val stack Creturn] 第 1 引数は取り扱う型 , 第 2 引数は v 引か ref のどちら かを指定する。第 2 引数の値は扱うデータの関数呼 び出しの型式を指定し , 前者では値による呼び出し , 後者では参照による呼び出しが使われる。最後の引 数は , もとになるクラスの名前である。この場合 ファイル int. stack. cc および int. stack. h に intstack という 名前のクラスが生成される。 88 CMAGAZINE 19 3
語 用 応 buzzer( プサー鳴動 ) 約 1 秒間ブザーを鳴らします。一般に , 工 ラーや警告メッセージとともに使用します (List7) 。 1 0 List y=atOi (work) : 105 : clear(y) : 106 : break : 107 : case 5 : 108 : clear(18); 109 : clear(19); 110 : csr-posit(), 18 ) : 111 : 112 : pr i ntf ( ”カーソルの右側を消しますっ : 113 : getxy (&x, (y) : 114 : printf ( " 消去したい行数 = " ) : 115 : gets (work) : 116 : cnt=ato i (work) : clr-right(x,y,cnt); 1 18 : break; 1 19 : case 6 : cIear(18); 120 : cIear(19); 121 : csr-posit(), 18 ) : 122 : pr i ntf ( " カーソルの左側を消します " ) : 123 : getxy(&x,&y) : 124 : printf ( " 消去したい行数 = " ) : 125 : 126 : gets (work) : cnt=ato i (work) : 127 : clr_left(), y,cnt) : 128 : 129 : break; 130 : case 7 : buzzer() : 131 : 132 : break; 133 : case 8 : cIear(18); 134 : put-str ( 0 , 18 , " 1 桁目なら 0 k 。確認 ! " , 22 ) : 135 : csr-posit(), 19 ) : 136 : csr-fwd() : 137 : 138 : break; 139 : case 9 : cIear(18); 140 : put-str ( 0 , 18. ” 0 桁目なら 0 k 。確認 ! " , 22 ) : 141 : csr-posit(1,19); 142 : csr-back ( ) : 143 : 144 : break : 145 : case 10 : cIear(18); 146 : put - str ( 0 , 18 , " この行なら 0 ko 確認 ! ル , 22 ) : 147 : 148 : csr-posit(), 19 ) : csr-up() : 149 : 150 : break : case 11 : cIear(18); 152 : put - str ( 0.18 げ 1 行飛びなら 0 ko 確認 ! " , 24 ) : 153 : csr-posit(), 19 ) : 154 : csr-down ( ) : 155 : 156 : break : / * 終了 * / 157 : case 99 : 158 : return; 159 : getchar ( ) : 160 : 161 : goto menu : 162 : } 163 : 164. ・ / * getxy 165 : 166 : getxy(int *x. int *Y) VO i d 168 : Char work [ 20 ] : 169 : 170 : clear(2 の : 171 : csr-posit(), 2 の : 172 : pr i ntf ( " X 座標 ( 0 ~ 7 9 ) = 173 : gets (work) : *x=atoi (work) : 174 : pr i ntf ( " Y 座標 ( 0 ~ 2 4 ) = 175 : gets (work) : 176 : *y=atoi (work) : 177 : 178 : return; csr fwd/csr back/csr up/csr down ( カーソル移動右 / 左 / 上 / 下 ) カーソルを 1 桁右へ ( 左へ / 上へ / 下へ ) 移動 します。ラインエデイタやスクリーンエデ イタを作成するときにカーソル制御用とし て使用します (List8)0 c 。 lo 「 ( 表示属性 / 表示色指定 ) 呼び出し後に表示する文字の「属性」と「表 示色」を指定します。指定パラメータは表 3 のとおりて、す。 必ず属性と表示色を指定してください 属性や表示色を変える場合には , また呼び 出してください なお , この ESC シーケンスは , 属性のみ , 表示色のみという指定がて、きます。目的に 応じて , どちらか一方のみの関数も作成し てください (List9) 。 関数の使用例 関数の使用例は , サンプルプログラムの main 関数をご覧ください。それぞれのテス トが使用例になっています (List10)0 宣言文が書かれています。必要な 定義文 , 関数だけを抜き出して使われる場合には , この部分も忘れないようにしてください また , 前回まて、作成してきたデータベー スアクセスプログラムの表示部分ゆ rintf 関 数 ) を上の関数を使って書き換えると , カー ド型データベースふうの表示がて、きます。 次回は , 今回の関数を利用して , 挿入 / 削 除機能つきのキーポード入力関数を作成す る予定てす。 応用 c 言語 103
MS - DOS プログラミング入門 List 2 unsigned long palettenunber; / * バックグラウンドカラー * / 66 : 67 : 68 : 69 : 73 : 75 : 78 : 82 : 83 : 84 : 85 : 86 : 88 : 89 : 90 : 92 : 93 : 94 : 95 : 96 : 98 : 99 : 100 : 101 : 102 : 103 : 104 : 105 : 106 : 107 : 108 : 109 : 110 : 1 12 : 1 16 : 1 18 : 119 : 120 : 121 : 122 : 123 : 124 : 125 : 126 : 127 : 128 : 129 : 130 : 13 い 132 : 133 : 134 : 135 : 136 : 137 : 138 : 139 : 140 : 141 : 142 : 143 : 144 : 145 : 146 : 147 : 148 : 149. 150 : 151 : 152 : 153 : 155 : 156 : 157 : 158 : 159 : 160 : 161 : 162 : 163 : 164 : 165 : 166 : 167 : 168 : 169 : 170 : 171 : 172 : 173 : 174 : unsigned unsigned unsigned unsigned setviewport: int int int int lupx; lupy; rdownx: rdowny : / * ビューポート領域左上 x 座標り / * ビューポート領域左上 y 座標 * / / * ビューポート領域右下 x 座標 * / / * ビューポート領域右下 y 座標 int int int int int int int Char int Char int int Char int long tileaddress; tilepattern: f i Ⅱ日 ag : ext pattern : pattern : ⅱ nepattern : linetype; long palette; 日 ag : y3; x3: y2; x2; yl; xl; OP : / * ラスタオペレーンヨン番号 / * 第 lx 座標 第 ly 座標 / * 第 2x 座標 / * 第 2y 座標 / * 第 3x 座標 / * 第 3y 座標 ″点画フラグ / * 塗りつぶしタイルバターン長 / * 塗りつぶしフラグ / 事拡張線種パターン / * 線種パターン / * 線の線種パターン長 / * 線の幅 / * 線の色を決めるパレット番号 / * タイルバターンの格納アドレス 事 / struct FOREGROUND / * NO. 8. フォアーグラウンドカラーの設定 * / unsigned long structaddr; foreground: unsigned long background: struct BACKGROUND / 事 NO. 9. バックグラウンドカラーの設定り unsigned long palettenumber; / * フォアーグラウンドカラー / * 仮±VRAM のアドレス structadd r : / * 仮想 VRAM のアドレス / * NO. 18 / 1 長方形の描画 , タイルバターンを使用しない * / struct BORDERCO し OR / * NO. 10. ポーダカラーの設定 * / unsigned long dumy: unsigned long mode; bordercol 0 「 : struct SETSWITCH / * NO. ll, / * ダミー / * ポーダカラー * / / * 表示スイッチ * / / * ダミー 表示スイッチの設定 * / ーチンのアド struct C し EAR / * NO. 1 画面の消去 * / long int int int int int Char int Char int int Char long long int int int int int Char int Char int int int int fillpalette; f i Ⅱ日 ag : extpattern; pattern; linepattern; linetype; long palette; f lag : endy; endx; starty; sta rtx : OP : reserved : / * 予約パラメータ / * ラスタオペレーション番号 / * 塗りつぶしフラグ な拡張線種パターン / * 線種パターン / * 線の線種パターン長 / * 線の幅 / * 線の色を決めるパレット番号 / * 描画フラグ / * 終了 y 座標 / * 終了 x 座標 / * 開始 y 座標 / * 開始 x 座標 / 事塗りつぶしカラーパレット番号 * / unsigned long dumy; unsigned char setswitch; struct SETDISP / * NO. 12. unsigned long dumy: unsigned int setdisp; SWh; struct INTSET / * NO. 13. 表示領域の設定 * / / * ダミ / * VRAM 上の Y 座標 * / / * ダミー 中断処理ルーチンの設定 * / / * NO. 18 / 2 長方形の描画 . タイルバターンを使用する * / unsigned unsigned intset; uns i g ned clear: long dumy: long addr: / * 中断処理ル レス * / reserved : OP : startx; sta rty : endx, endy, f ね g : long palette: linetype: ⅱ nepatte rn: pattern: extpattern; f i Ⅱ ag : tilepattern: long tileaddress; / * 予約パラメータ / * ラスタオペレーション番号 / * 塗りつぶしタイルバターン長 / * 塗りっぷしフラグ / * 拡張線種パターン / * 線種パターン / * 線の線種パターン長 / * 線の幅 線の色を決めるパレット番号 / * 描画フラグ / * 終了 y 座標 / * 終了 x 座標 / * 開始 y 座標 / * 開始 x 座標 / * タイルバターンの格納アドレス struct PSET / * NO. 15. 点の描画 * / unsigned unsigned unsigned unsigned unsigned unsigned pset : long int Char int int long struct Line / * NO. 16. 線の点画 * / ⅱ ne : unsigned unsigned unsigned uns i g ned uns i g ned uns i gned unsigned unsigned unsigned unsigned unsigned unsigned long int int int int int Char int Char int int long ext patter n : pattern; linepattern: linetype; long palette; f lag : y2; x2; xl; OP : reserved : node : Y : X : actmode : rop : reserved : param: / * 予約パラメータ . 常にゼロ * / / * 予約パラメータ / * 点の色を決めるパレット番号 * / / * 開始 y 座標 ″開始 x 座標 / * 動作番号 / * ラスタオペレーション番号 / * ラスタオペレーション番号 / * 予約パラメータ ″拡張線種パターン / * 線種パターン / * 線の線種パターン長 / * 線の幅 / * 線の色を決めるパレット番号 * / 描画フラグ / 本終了 y 座標 / * 終了 x 座標 / * 開始 y 座標 / * 開始 x 座標 ・″タイルバターンを使用しない構造体と , 使用する構造体とに区分けした * / / 事 NO. 17 / 1 三角形の描画 . タイルバターンを使用しない * / struct TRIANG し EI unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned uns i g ned unsigned unsigned unsigned unsigned unsigned unsigned unsigned trianglel: res erved : OP : xl: x2; Y2; x3: y3; f lag : long palette: linetype; linepattern; pattern; extpattern; f i Ⅱ f lag ; long fi llpalette; char int int Char int Char int int int int int int int long な予約パラメータ / 本ラスタオペレーション番号 / * 塗りつふしフラグ な拡張線種パターン / 本線種パターン 線の線種パターン長 / * 線の幅 / 本線の色を決めるパレット番号 / * 点画フラグ / * 第 3y 座標 / ま第 3x 座標 ″第 2y 座標 ″第 2x 座標 / * 第 ly 座標 / 事第 lx 座標 本 / 本 / 本 / 本 / 本 / 本 / 本 / ″塗りつふしカラーパレット番号本 / ″ NO. 17 / 2 三角形の描画 . タイルバターンを使用する本 / struct TRIANGLE2 unsigned long reserved; ″予約パラメータ 175 : 176 : 177 : 178 : 179 : 180 : 181 : 182 : 183 : 4 : 185 : 186 : 187 : 188 : 189 : 190 : 191 : 四 2 : 193 : 194 : 195 : 196 : 197 : 四 8 : 199 : 200 : 201 : 202 : 203 : 204 : 205 : 206 : 207 : 208 : 209 : 210 : 2 1 2 : 2 13 : 214 : 215 : 216 : 217 : 218 : 219 : 220 : 221 : 222 : 223 : 224 : 225 : 226 : 227 : 228 : 229 : 230 : 231 : 232 : 233 : 234 : 235 : 236 : 237 : 238 : 239 : 240 : 24 に 242 : 243 : 244 : 245 : 246 : 247 : 248 : 249 : 250 : 251 : 252 : 253 : 254 : 255 : 256 : 257 : 258 : 259 : 260 : 261 : 262 : 263 : 264 : 265 : 266 : 267 : 268 : 269 : 270 : 271 : 272 : 273 : 274 : 275 : 276 : 277 : 278 : 279 : 280 : 281 : 282 : 283 : unsigned unsigned unsigned unsigned unsigned unsigned uns i gned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned triangIe2; struct CYOUI unsigned unsigned uns i gned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned cyoul; struct CYOU2 unsigned unsigned unsigned uns i gned uns i gned unsigned unsigned unsigned unsigned unsigned unsigned uns i gned unS i gned unsigned unsigned cyou2: struct DA Ⅸ引 1 ″ NO. 19 / 1 台形の描画 . タイルバターンを使用しない * / unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned da i ke i 1 : long int int int int int int int Char int Char int int Char :ong f i Ⅱ col or : f i Ⅱ f lag : extpattern; pattern; linepattern; linetype; long palette: flag: x4; y3; x3: x2; xl; OP : reserved : / * 予約パラメータ / * ラスタオペレーション番号 / 本塗りつぶしフラグ な拡張線種パタニン / * 線種パターン / * 線の線種パターン長 / * 線の幅 / * 線の色を決めるパレット番号 / * 点画フラグ / * 第 4x 座標 / * 第 3y 座標 / 本第 3x 座標 / * 第 2x 座標 / * 第 ly 座標 / * 第 lx 座標 / * 塗りっぷしカラーパレット番号 * / struct DAIKE12 / * NO. 19 / 2 台形の描画 . タイルバターンを使用する事 / unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned da i ke i 2 : reserved : xl: x2; x3 : Y3; x4; f lag. long palette; linetype: linepattern: pattern; extpattern; f i Ⅱ f lag : pat tern に long patternaddr; int Char int int Char int Char int int int int int int int long / * 予約パラメータ / * ラスタオペレーション番号 / * 換りつぶしタイルバターン長 / * 塗りつぶしフラグ / * 拡張線種パターン / * 線種パターン / * 線の線種パターン長 な線の幅 / * 線の色を決めるパレット番号 ″点画フラグ / * 第 4x 座標 / * 第 3y 座標 / * 第 3x 座標 / ま第 2x 座標 / 本第 ly 座標 第 lx 座標 / * タイルバターンの格納アドレス ネ / 事 / 本 / 事 / 本 / 本 / structCIRC し EI / 本 NO. 20 / 1 円の描画 . タイルバターンを使用しないり unsigned unsigned unsigned unsigned unsigned unsigned long int int int int int reserved; OP : CY : startx; / 本予約パラメータ ラスタオペレーション番号 / * x 座標 ″ y 座標 な半径 ″開始 x 座標 本 / 本 / 本 / 本 / C プログラマのための MS ー DOS プログラミング入門 75
List 2 / * 開始 y 座標 unsigned int starty : / * 終了 x 座標 uns i gned int end x : / * 終了 x 座標 uns i gned int endy; / * 点画フラグ unsigned 日 ag : Char / * 線の色を決めるパレット番号 unsigned long palette; / * 線の福 unsigned Char cirtype: unsigned Char dummy; / * 線の線種パターン長 unsigned Char linepattern: / * 線種パターン unsigned int pattern : ″拡張線種パターン int 本 / uns i g ned extpattern; / * 塗りっぷしフラグ f i Ⅱ f lag : unsigned Char / * 塗りつぶしカラーパレット番号事 / unsigned long fillcolor; circlel; ″ NO. 20 / 2 円の描画 . タイルバターンを使用する * / struct CIRC し E2 / * 予約パラメータ unsigned long reserved : / * ラスタオペレーション番号 unsigned int OP : / * x 座標 unsigned int 事 / / * y 座標 unsigned int / * 半径 unsigned int / * 開始 x 座標 unsigned int startx; / * 開始 y 座標 unsigned int starty; ″終了 x 座標 unsigned int endX : / * 終了 x 座標 unsigned int endy; / 事点画フラグ unsigned Char f 信 g : unsigned / * 線の色を決めるパレット番号 long palette; / * 線の幅 unsigned Char cirtype; unsigned Char dumny; / * 線の線種パターン長 unsigned Char linepattern: / * 線種パターン unsigned int pattern; / * 拡張線種パターン unsigned int extpattern; / 事換りつぶしフラグ unsigned char f i Ⅱ f lag : / * 塗りつふタイルバターン長 int patternl : long patternaddr; / * タイルバターンの格納アドレス unsigned c ircl e2 : / * NO. 21 / 1 楕円の描画 . タイルバターンを使用しない * / struct DAENI long 予約パラメータ unsigned reserved : / * ラスタオペレーション番号 unsigned int OP : / * x 座標 unsigned int CX . / * y 座標 unsigned int CY : / * x 方向の半径 unsigned int rX . / * y 方向の半径 unsigned int / * 開始 x 座標 unsigned int startx: / * 開始 y 座標 unsigned int sta rty : / * 終了 x 座標 unsigned int endx: / * 終了 y 座標 unsigned int endy; / * 点画フラグ unsigned Char f lag : / * 線の色を決めるパレット番号 unsigned long palette: / * 線の幅 unsigned Char cirtype: unsigned Char dummy; / * 線の線種パターン長 unsigned linepattern; char ″線種パターン unsigned int pattern; / * 拡張線種パターン unsigned int extpattern; / * 塗りつぶしフラグ unsigned Char f i Ⅱ fl ag : / * 塗りつぶしカラーパレット番号 * / unsigned long fillcolor; daenl : struct DAEN2 / * NO. 21 / 2 情円の描画 . タイルバターンを使用する * / long / * 予約パラメータ uns i gned reserved : / * ラスタオペレーション番号 unsigned int OP : / * x 座標 uns i gned int / * y 座標 uns i gned int / * x 方向の半径 unsigned int rx : / * y 方向の半径 unsigned int / * 開始 x 座標 uns i gned int sta rtx : / * 開始 y 座標 uns i gned int starty; / 本終了 x 座標 uns i gned int endX : / 本終了 y 座標 uns i gned int endy; / * 点画フラグ uns i g ned Char f 信 g : / 本線の色を決めるパレット番号 long unsigned pal ette : / * 線の幅 unsigned Char cirtype: unsigned Char dunmy: ″線の線種パターン長 uns i gned Char linepattern; / * 線種パターン uns i gned int pattern: / 事拡張線種パターン unsigned int extpattern; / * 塗りっぷしフラグ unsigned Char f i 日 f lag : ″塗りつぶしタイルバターン長 unsigned int pat tern に / 本タイルバターンの格納アドレス unsigned long patternaddr; daen2 : struct 円しし / * NO. 22. 閉鎖領域の塗りつぶし * / uns i gned / * 予約パラメータ long reserved , / * ラスタオペレーン番号 uns i gned int OP : / * 描画開始 x 座標 uns i gned int xl; yl: 描画開始 y 座標 unsigned int / ま境界を表わすパレット番号 unsigned long palette; / 事塗りつぶしフラグ unsigned Char f i Ⅱ f lag ; unsigned Char dumny; / * 塗りつぶしハ・しット番号 / ハ・しット長 int unsigned pat tern : ″タイルバターン格納アドレス unsigned long patternaddr; ″作業領域の先頭アドレス unsigned long workaddr: / * 作業領域の大きさ unsigned int workerea : 393 : 394 : 395 : 396 : 397 : 398 : 399 : 400 : 401 : 402 : 403 : 404 : 405 : 406 : 407 : 408 : 409 : 410 : 411 : 412 : 413 : 414 : 415 : 416 : 418 : 419 : 420 : 4 幻 : 422 : 423 : 424 : 425 : 426 : 427 : 428 : 429 : 430 : 431 : 432 : 433 : 434 : 435 : 436 : 437 : 438 : 439 : 440 : 441 : 442 : 443 : 444 : 445 : 446 : 447 : 448 : 449 : 450 : 451 : 452 : 453 : 454 : 455 : 456 : 457 : 458 : 459 : 460 : 46 に 462 : 463 : 464 : 465 : 466 : 467 : 468 : 469 : 470 : 471 : 472 : 473 : 474 : 475 : 476 : 477 : 478 : 479 : 480 : 481 : 482 : 483 : 484 : 485 : 486 : 487 : 488 : 489 : 490 : 491 : 492 : 493 : 494 : 495 : 496 : 497 : 498 : 499 : 500 : 501 : unsigned int 「 dO wnx : uns i g ned int rdowny : int unsigned mensiz: unsigned long nenaddr; glnage; struct GIMAGESET unsigned long reserved : unsigned int unsigned int lupx: int unsigned lupy; unsigned int mensiz, unsigned long menaddr; unsigned Char cswitch: uns i gned long foreground : uns i gned long background; g inageset : struct COPY / * NO. 25. 転送領域 unsigned long sstructaddr; ソース側 VRÅM アドレス unsigned int / * ソース側左上 X 座標 S ー u px : unsigned int / 事ソース側左上 Y 座標 SiUPY; / 事ソース側右下 X 座標 unsigned int srdownx; unsigned int / * ソース側右下 Y 座標 srdowny; uns i gned / * ディスト側 VRAM アドレス long dstructaddr; / 事ラスタオペレーション番号 uns i gned int OP : dlupx. / * デスト側左上 X 座標 unsigned int unsigned int / * デスト側左上 Y 座標 dlupy; な X 方向倍率 uns i g ned int int / * Y 方向倍率 uns i gned Y : / * 裏かえし unsigned Char riverse: unsigned Char / * 回転 rotate : 284 : 285 : 286 : 287 : 288 : 289 : 290 : 291 : 292 : 293 : 294 : 295 : 296 : 297 : 298 : 299 : 300 : 301 : 302 : 303 : 304 : 305 : 306 : 307 : 308 : 309 : 310 : 3 1 1 : 312 : 313 : 314 : 315 : 引 6 : 317 : 318 : 引 9 : 320 : 321 : 322 : 323 : 324 : 325 : 326 : 327 : 328 : 329 : 330 : 331 : 332 : 333 : 334 : 335 : 336 : 337 : 338 : 339 : 340 : 341 : 342 : 343 : 344 : 345 : 346 : 347 : 348 : 349 : 350 : 351 : 352 : 353 : 354 : 355 : 356 : 357 : 358 : 359 : 360 : 361 : 362 : 363 : 364 : 365 : 366 : 367 : 368 : 369 : 370 : 371 : 372 : 373 : 374 : 375 : 376 : 377 : 378 : 379 : 380 : 381 : 382 : 383 : 384 : 385 : 386 : 387 : 388 : 389 : 390 : 391 : 392 : / * 右下 x 座標 / * 右下 y 座標 / * メモリサイズの大きさ / * メモリ格納アドレス / * NO. 24. グラフィックイメージの設定 * / / * 予約パラメータ / * ラスタオペレーン番号 / * 左上 x 座標 / * 左上 y 座標 / * メモリサイズの大きさ / * メモリ格納アドレス / * カラースイッチ / * フォワグラウンドカラー パックグラウンドカラー COPY : struct MOVE unsigned long reserved : int unsigned int int Y : uns i gned Char cflag; / * NO. 26. 転送移動 / * 予約パラメータ / * ラスタオペレーション番号 / * X 方向移動ドット数 / * Y 方向移動ドット数 クリアフラグ nove : / * NO. 27. 構造体は無し * / / * NO. 28. 構造体は無し * / str uct 田 SPMODE unsigned long structaddr: Unsigned int dmode: dispnode: struct GETDROWP し ANE unsigned long structaddr: unsigned long duny; getdrowpl ane : struct GETDISPP し ANB unsigned long dumy: unsigned long structaddr; getdispplane: struct GETPA し ETTE unsigned long dumy: unsigned long structaddr; getpalette; struct GETVIEWPORT unsigned long structaddr: unsigned int lupx; unsigned int lupy; int rdownx : unsigned unsigned int rdowny : getviewport: / * NO. 34. フォアーグラウンドカラーの拾得 * / struct G ETFOREG ROUND / * VRAM 構造体のアドレス unsigned long structaddr; フォアーグラウンドカラー unsigned long palettenumber:/* get foreground を パックグラウンドカラーの拾得 * / struct GETBACKGROUND / * NO. 35. / 本 VRAH 構造体のアドレス unsigned long structaddr; unsigned long palettenunber:/* バックグラウンドカラー getbackground; struct GETBORDER unsigned long dumy: unsigned long CO ー 0 「 : / ま NO 認 9. 表示モードの取得 / * VRAM 構造体のアドレス / * 表示モード / ま NO. 30. 描画プレーンの取得 / * VRAM 構造体のアドレス / * ダミ / * NO. 31, 表示プレーンの取得 / * ダミ / * VRAM 構造体のアドレス / * NO. 32. パレットの取得 / * ダミー / * パレット番号 / * NO. 33. ビューポート領域の取得り / * VRAM 構造体のアドレス / * ビューポート領域左上 x 座標 / * ビューポート領域左上 y 座標 / * ビューポート領域右下 x 座標 / * ビューポート領域右下 y 座標 f i Ⅱ : ″ NO. 23. グラフィックイメージの取得事 / struct GIMAGE / 本予約パラメータ 事 / reserved : unsigned long / 事左上 x 座標 unsigned int lupx; ″左上 y 座標 unsigned int lupy : な NO. 36. ポーダカラーの取得 / * ダミー / まポーダカラー 76 CMAGAZINE 19 3
五ロ 一三ロ はじめて学ぶプログラー ニンク て、はありません。各バージョンの違いは次 のような点にあります。 ・関数定義の形が新しいか , 古いか ? ・関数の記述順序 ・関数型宣言の位置 6-4-2 関数の型宣言と 関数プロトタイプ こて、関数の型宣言ということばが出て きましナ 、 0 float average(int a, int b, int c); List10 の例て、は , この部分が関数型宣言文 にあたります。 関数の呼び出しを行う側ては , 原則とし てその呼び出す関数の型宣言をしておかな くてはいけないのてす。ただし , その関数 が関数を呼ぶ前に定義されていれば型宣言 は省略て、きます。関数を呼ぶ前というのは プログラムファイルにおいて , より前方に 己述されているということてす。例ては e と f が関数型宣言を省略て、きます。 さらにこの関数型宣言文には次の形態が 存在します。 ① float average(int a, int b, int c); ② float average(int, int, int); ③ float average(); このうち①と②は形の違いこそあれ , ま ったく同じ動作をします。これらは関数の 型の宣言と同時に , 引数の型チェックの機 構をもっています。すなわち関数 average は 3 つの int 型変数を期待し , 戻り値は float 型て、あることを明示しているわけて、す。 のような機能をもった宣言文を関数プロト タイプ宣言文と呼びます。これに対し③は 関数の型の宣言をするだけて、 , 引数の型チ ェックはて、きません。 関数の定義にはふたつのタイプがありま したが , それらの働きの違いについてよう やくここて説明することがてきます。実は Fig. 1 のタイプ 1 は , 関数定義と同時に関数プ ロトタイプの宣言も行うことがてきるのて す。ただしその関数は呼ばれる前に定義さ れていなくてはいけません。したがって , e のような形は冗長なものになっているわけ て、す。 List 1 Oc 2 : 4 : #include く stdiO. h> 5 : 6 : / * 皿 in 関数部分 7 : void main(void) 9 : int X, y, 2. 10 : f 1 oat f : 00000 ・ 000 、 0 、 0 、 float b, int 12 : = 100 : y = 85 : 2 = X = average(), y, 2 ) : f printf("ans = XfYn" 18 : / * 3 つの整数の平均値を返す関数 ( タイプ 1 ) average(int a, int b, int c) 19 : float 20 : { float tmp; 22 : ((float)a + (float)b + (float)c) / 3.0 : 23 : tmp ー return (tmp) : 24 : 関数を使ったプログラム 省略できない List 1 Od 1 三ロ 2 : 4 : #include く stdio. h> 5 : 6 : 7 : / * main 関数部分 8 : void main(void) 12 : 14 : 19 : / * 3 つの整数の平均値を返す関数 ( タイプ 2 ) 20 : f loat int 22 : { 23 : 24 : 25 : 26 : 関数を使ったプログラム int x, y, 2 : f loat f : average(int a, float int i nt し ニ 100 : y ニ X average(), y. z) : printf("ans ニ %fYn" 省略できない average(). b, c) float tmp: ((float)a { (float)b + (float)c) / 3.0 tmp return (tmp) : List IOe 2 : 4 : #include く stdio. h> 5 : average(int a, int b, int c); / * 省略可能 * / 6 : float / * ma i n の中に入れてもよい 7 : 8 : 9 : / * 3 つの整数の平均値を返す関数 ( タイプ 1 ) average(int a, int b, int c) 10 : float float tnp; 関数を使ったプログラム はじめて学ぶ C プログラミング 117