func - みる会図書館


検索対象: 月刊 C MAGAZINE 1990年3月号
15件見つかりました。

1. 月刊 C MAGAZINE 1990年3月号

宀言するという意味て、す。定義はプログラ ム中ただ一度行われるのに対し , 宣言はそ の変数を使う場所 ( モジュールあるいは関数 ) て、何回て、も行うことがて、きます (List13a List 12 2 : 4 : #include く stdio. h> 5 : 6 : void func(void); 7 : 8 : void main(void) i nt i : for ( i = 0 : i く 10 : 十十 i ) func ( ) : 16 : void func(void) static int count 十十 count : printf("XdYn" 20 : s t a t i c 変数 匚蟲司 6-7-1 関数間のテータの授受 関数間のデータの受け渡しについて補足 も含めここにまとめます。 C における関数間のデータの授受には次の 3 つの方法があります。 ①外部変数渡し ②値による引数渡し (call by value) ③参照による引数渡し (call by reference) このうち② , ③が引数によるものて、す。 今まて、にお話したのはこのうち①と②て、し た。特長は次のとおりて、す。 ①外部変数はすべての関数から見ることが て、きるのて、 , これを用いれば引数渡しを 用いることなくデータの授受が行えます。 しかしこの方法は関数の独立性と汎用性 を低下させてしまいます。このためこの 方法は , 外部変数が各関数に共通名のあ る場合を除いてなるべく避けるべきて、す。 ② C て、はもっとも一般的な引数渡しの方法て、 す。この方法て、は実引数の値をコヒ。ーし て仮引数に渡します。このため呼ばれた 側の関数て、どんなにその値をいじっても 呼び出し側にその結果は影響しません。 ふたつの関数の間て、変数はたがいに影響 することなく , 独立性の高いモジュール をつくれます。 ③この方法て、は引数渡しをする際に実引数 の内容 ( 値 ) て、はなく , 実引数がどこにあ るかという情報 ( アドレス ) を仮引数に渡 します。これによって呼ばれた側の関数 て、はポインタを用いて , 呼び出し側関数 の引数を参照 , 変更することが可能て、す。 配列データを渡すときやふたつ以上の値 を呼び出し側に戻したいときに有効て、す。 コンパイル時に 1 度だけ初期化される count) : 1 3a List e x t e r n 変数 2 : 4 : #include く stdio. h> 5 : 6 : void funcl(void); 7 : void func2(void) : 8 : void func3(void); 9 : void func4(void): int X; 13 : void main(void) printf ("XdYn" funcl ( ) : printf("XdYn", func2() : printf("%dYn" 20 : func3() : printf("%dYn", 22 : func4() : printf("%dYn" 外部変数 X List 1 3b 2 : このモジュール全域で外部変数 X を使用 4 : extern int X : 5 : void funcl(void) 7 : X * = 2 : 9 : 10 : void func2(void) 122 CMAGAZINE 19 3

2. 月刊 C MAGAZINE 1990年3月号

構造体の実際例 / * NO. 18 / 1 長方形の描画 . タイルバターンを使用しない * / struct CYOUI ま / / * 予約パラメータ unsigned long reserved : ラスタオペレーション番号 unsigned i nt OP : / * 開始 x 座標 unsigned i nt startx; / * 開始 y 座標 unsigned i nt starty; / * 終了 x 座標 unsigned i nt endX : / * 終了 y 座標 unsigned i nt endy : / 事描画フラグ unsigned Char f lag : 事 / / 事線の色を決めるパレット番号 unsigned long palette: / * 線の幅 ネ / unsigned int linetype; / * 線の線種パターン長 linepattern: unsigned Char / * 線種パターン unsigned int patte rn : / * 拡張線種パターン 本 / unsigned int extpattern; / * 塗りつぶしフラグ f i Ⅱ f lag : uns i gned Char / * 塗りつぶしカラーパレット番号 * / long fi llpalette; unsigned cyou 1 : List 3 n = func_18(); if( n 〉 0 ) fprintf(stderr, " 長方形の作成でエラーが発生しました yn " ) : fprintf(stderr, 工ラーコード exit(l); 85 : 86 : 88 : 89 : 90 : 92 : 93 : 94 : 95 : 96 : 97 : 98 : 99 : 100 : 101 : 102 : 103 : 104 : 105 : 106 : 107 : 108 : 109 : 1 10 : 112 : 114 : 1 15 : 116 : 1 1 8 : 1 19 : 120 : 121 : 122 : 123 124 : 125 : void gaddr() 126 : { 127 : lnregs. X. aX 128 : inregs. X. bX 129 : int86(0xcd. &inregs, &outregs) : 130 : } 131 : func-0() 132 : int 133 : 134 : return( (*(GL->FUNC[O])) ((unsigned iong) ( int far 事 ) &GrpData) ) : 135 : 136 : func- 1 ( ) 137 : i nt 138 : 139 : return( (*(GL->FUNC[I])) ((unsigned long) ( int far * ) åGrpData) ) : 140 : } 141 : func-3() 142 : int 143 : 144 : GrpData. mode. structaddr : 0 : GrpData. 田 ode. mode : 0X0101 : 145 : 146 : return( ←()い〉 FUNC[3])) ((unsigned long) ( int far * ) &GrpData) ) : 147 : 148 : } 149 : 150 : int func_ll() 152 : GrpData. setswitch. swh 153 : return( (*(GL->FUNC[II])) ((unsigned long) ( int far *)&GrpData) ) : 154 : 155 : } 156 : int func_14() 157 : 159 : GrpData. clear. param 160 : return( (*(GL->FUNCC14])) ((unsigned long) ( int far *)åGrpData) ) : 1 6 1 : 162 : } 163 : int func_17() 164 : 165 : 166 : GrpData. trianglel . reserved 167 : GrpData. trianglel . OP 168 : GrpData. trianglel. xl : 300 : 169 : GrpData. trianglel. yl : 25 : 170 : GrpData. trianglel. x2 : 50 : 171 : GrpData. trianglel. y2 = 375 : 172 : GrpData. trianglel. x3 = 550 : 173 : GrpData. trianglel. y3 = 375 : 174 : GrpData. trianglel. flag . palette; 1 : 175 : GrpData. trianglel 176 : GrpData . trianglel. linetype ニ 6 : 177 : GrpData. trianglel. fillflag 178 : GrpData. trianglel. fillpalette = 5 : 179 : 180 : return( (*(GL->FUNC[17])) ((unsigned long) ( int far *)&GrpData) ) : 182 : 183 : int func-18() 185 : GrpData ・ cyoul. reserved 186 : GrpData. cyoul. op GrpData ・ cyoul. startx 188 : GrpData. cyoul. starty 189 : GrpData. cyoul. = 639 : endX 190 : GrpData . cyoul. endy ニ 399 : 191 : GrpData . cyou l. ag = 0x : 192 : Grp Data . cyoul. linetype 193 : GrpData. cyoul. palette = 2 : = func_17() : n if( n 〉 0 ) fprintf(stderr, 三角形の作成でエラーが発生しました Yn") : fprintf(stderr, 工ラ・一コード exit(l); getch ( ) ; n = れ nc -26 ( ) : if( n 〉 0 ) fprintf(stderr. ”移動でエラーが発生しました yn") : fprintf(stderr, ニ [Xd] Yn". ”工ラ・一コー - ド exit(l); List 4 10 : CompiIed 1 1 : 12 : 14 : 15 : #include く stdio. h> 16 : #include く conio. h 〉 17 : #include く dos. h 〉 18 : #include "ga ・ h" 20 : 11ifiG REGS inregs, outregs; 21 : struct SREGS segs: 22 : 23 : void gaddr(void) : _0(void) : 24 : int func _l(void): 25 : int func _3(void) : 26 : int func -ll(void); 27 : int func 28 : 14(void); int func 29 : -17(void); int func -18(void); 30 : int -26(void) : int funC 32 : 33 : P ILE *fp : 34 : 35 : int main() 36 : { 37 : i nt n : 38 : if( (fp=fopen("GRAPH 39 : fclose 、 (fp) ; 40 : れ : else 42 : 43 : 44 : 45 : 46 : 47 : 48 : 49 : 50 : 52 : 53 : 54 : 55 : 56 : 57 : 58 : 59 : 60 : 62 : 63 : 64 : 65 : 66 : 68 : 69 : 70 : 77 : 80 : 82 : 83 : getch() : puts("Yxlb[>51"); / * カーソル ON * / puts("Yxlb[>ll"); / * ファンクションクー表示 ON * / n = func-l ( ) : / * グラフィックスの終了 * / if( n 〉 0 ) fpr intf (stderr, ”グラフィックスの終了でエラーが発生しました Yn") : fprintf(stderr. " 工ラーコード exit(l); Programmed by A. Akitu Da ted 1990-01-1 ] Version Purposed 四角形を赤で描いて黄色で塗りつぶす。このとき線の幅を 4 ドットにする。さらに三角形を描いて右へ 320 ドット分 移動させる。 Q U I C K ー C , M S C が稼働 qcl /AS /0x /WI /la:wqc gal.c printf("GRAPH. SYS が登録されていません Yn ” ): return( 0 ) : gaddr() : = func_0() : / * グラフィックス初期化 n if( n 〉 0 ) fprintf(stderr, " グラフィックの開始でエラーが発生しました Yn") : fprintf(stderr, ”工ラーコード : [Xd] Yn" ex i t ( l) : = func_3() : / * 表示モードの設定 n if( n 〉 0 ) fprintf(stderr, ”表示モードの設定でエラーが発生しました Yn") : fprintf(stderr, “工ラーコード exit(l); : [Xd]Yn" puts("Yxlb[2J") : / * テキストクリアー * / puts( ” \対b[〉5h ” ): / * カーソル OFF * / puts("Yxlb[>lh つ : / * ファンクションキ ー表示 OFF * / = func_14() : / * クリアー * / n if( n 〉 0 ) fprintf(stderr, " 画面の消去でエラーが発生しました Yn ” fprintf(stderr, ”工ラーコード exit(l); / * 表示スウィッチの設定 * / = func_ll() : n if( n 〉 0 ) fprintf(stderr." 表示スウィッチの設定でエラーが発生しました Yn つ : fprintf(stderr, “工ラーコ -- ド exit(l); 78 CMAGAZINE 19 3

3. 月刊 C MAGAZINE 1990年3月号

MS - ロ OS プログラミング入門 List 4 fprintf(stderr, " 円の描画でエラーが発生しました Yn") : fprintf(stderr, ”工ラーコード exit(l); f i Ⅱ a g GrpData. cyoul. . fillpalette : 6 : GrpData. cyoul (*(G し ->FUNC[18])) ((unsigned long) ( return( i nt far *)&GrpData) 85 : 86 : 88 : 89 : 90 : 92 : 94 : 95 : 96 : 98 : 99 : 100 : 1 ・ 102 : 103: 104 : 105 : 106 : 107 : 108 : 109 : 1 10 : 1 12 : 1 18 : 120 : 121 : 122 : 123 : ・ 124 : 125 : 126 : 127 : 128 : 129 : 130 : 131 : 132 : 133 : 134 : 135 : 136 : 137 : 138 : 139 : 140 : 141 : 142 : 143 : 144 : 145 : 146 : 147 : 148 : 149 : 150 : 15 い 152 : 154 : 155 : 156 : } 157 : void gaddr() 158 : 159 : 160 : inregs. X. ax : 0 : ( (int)&G し ) : 161 : inregs. X. bX : int86(0xcd, &inregs. &outregs) : 162 : 163 : } 164 : func-0() 165 : i nt 166 : { return( い ( G し - 〉間 NC [ 0 ] ) ) ((unsigned long) ( int far *)&GrpData) ) : 167 : 168 : } 169 : func-l() 170 : int 17 い return( (*(G し ->FUNC[I])) ((unsigned long) ( int far * ) &GrpData) ) : 172 : 173 : 174 : func-3() 175 : int 176 : { 7 : GrpData. 新 Ode. structaddr 】 78 : GrpData. 田 ode. node = 0X0101 : 179 : return( (*(GL->FUNC[3))) ((unsigned long) ( int far *)&GrpData) ) : 180 : 181 182 : int func-ll ( ) 183 : 184 : { GrpData. setswitch. swh 185 : 186 : return( ← ( G い ) 間 NC [ 11 ] ) ) ((unsigned long) ( int far *)&GrpData) ) : 187 : 188 189 : int func-14() 190 : 191 ニ 0 : GrpData. C a 「 . param 192 : 193 : 194 : 195 : 196 : 197 : 198 : } 199 : int func_26() 200 : 201 . move. reserved : 0 : GrpData 202 : GrpData. 田 ove. op : 0 : 203 : -320 : GrpData 204 : . 第 ove. X GrpData. nove. y : 0 : 205 : GrpData. 第 ove. c ロ ag 206 : 207 : return ( ← ( G い > 間 NC [ 26 ] ) ) ((unsigned long) ( 208 : int far *)&GrpData) ) : 209 : } 幻 0 : / 本 * 本 * 事 * 事事事事 * 本事事事 * 本事事事 * 事本本事 end 0f prgram 211 : : func -20a ( 0 し . 0. rand ( ) % 640. rand ( ) % 400 , 70.0.0.0.0 , 0 , 2 し 0 , 0 , 0.0. 圧 0X01 , 2 い : if( n 〉 0 ) fprintf(stderr. " 円の描画でエラーが発生しました Yn") : fprintf(stderr, ”工ラー - コード ex i t ( l) : n n = func_20a(0L, 0. rand()X640. rand ( ) % 400. 70.0.0.0.0.0.3 し . 0.0 , 0 , 0.0 , 0X01 , 3 し ) : if( n 〉 0 ) fprintf(stderr, " 円の描画でエラーが発生しました Yn ” ) : fprintf(stderr, ”工ラーコード ex i t ( l) : GA3. C List 5 : func-20a(0 し . 0. nd ( ) % 640. rand()X400. 70.0.0.0 , 0.0.4 し 0.0 , 0.0.0 , 0X01. 4 い : if( n 〉 0 ) fprintf(stderr, “円の描画でエラーが発生しました Yn ” ) : fprintf(stderr. ”工ラーコード exit(l); n Programned by A. Ak i れ 1990-0 ト 11 Dat ed Version 6 : Comp ⅱ ed 9 : 10 : #include く stdio. h> 11 : #include く stdlib. h> 12 : # i nc lud e く conio. h 〉 13 : #include く dos. h 〉 14 : #include "ga. ド 15 : 16 : union REGS inregs. outregs; 17 : struct SREGS segs : 18 : 19 : void gaddr(void): 20 : int func_0(void) : int func-l (void) : 21 : 22 : int func-3(void) : 23 : int func:ll(void); 24 : int func-14(void): 25 : 26 : FILE *fp; 27 : 28 : int nain() 29 : 30 : i nt n : if( (fp=fopen("GRA?H 32 : 33 : fclose(fp) : 34 : 35 : 36 : 37 : 38 : 39 : 40 : 42 : 43 : 44 : 45 : 46 : 48 : 49 : 50 : 52 : 53 : 54 : 55 : 56 : 58 : 59 : 60 : 62 : 64 : 65 : 66 : 68 : 69 : 74 : 79 : 80 : 82 : 84 : n = func-20a(0L. 0. 「 and ( ) % 640. rand()X400. 70 , 0.0.0.0.0. 5 し 0.0.0.0 .0XOL5 い : if( n 〉 0 ) fprintf(stderr, ”円の描画でエラーが発生しました Yn") : fprintf(stderr, ”工ラーコード ex i t ( l) : qcl /AS /0x /WI /la:yqc ga2. n = func-20a(0 し . 0. rand()X640. rand ( ) % 400. 70.0 , 0.0.0 を 0.6 し . 0.0 , 0 , 0.0. 0X01.6 し ) : if( n > 0 ) fprintf(stderr. " 円の描画でエラーが発生しました yn") : fprintf(stderr, “工ラーコード exit(l); n = func-20a(0L, 0 げ and ( ) % 640. rand ( ) % 400. 70.0.0 , 0 , 圧 0.7 し圧 0 , 0 , 0.0.0 x01, 7 い : if( n 〉 0 ) fprintf(stderr, ”円の描画でエラーが発生しました Yn") : fprintf(stderr. ”工ラ -- コード ex i t ( l) : }while( !kbhit() ) : puts("Yxlb[>51"); ″カーソル ON * / puts ("YXI b [ 月ド ) : / * ファンクションキー表示 ON り n = func-l(); / * グラフィックスの終了り if( n 〉 0 ) fprintf(stderr. “グラフィックスの終了でエラーが発生しました Yn " ) : fprintf(stderr. ”工ラーコード : [Xd]Yn ” exit(l); printf("GRAPH. SYS が登録されていません Yn つ : return( 0 ) : gaddr() : ニ func-0() : ″グラフィックス初期化 n if( n > 0 ) fprintf(stderr, ”グラフィックの開始でエラーが発生しました Yn ・・ fprintf(stderr, ”工ラーコード exit(l); n = func-3() : / * 表示モードの設定 */ if( n 〉 0 ) fprintf(stderr, ”表示モードの設定でエラーが発生しました \ n ” ) : fprintf(stderr, ”工ラーコード exit(l): puts("Yxlb[2J") : / * テキストクリアー * / puts( ” YxIb[>5h ” ): / * カーソル OFF * / puts("Yxlb[>lh"); / 事 ファンクションキ ー表示 0 り : func-14() : / * クリアーり n if( n 〉 0 ) " 画面の消去でエラーが発生しました Yn") : fprintf(stderr, fprintf(stderr, ”工ラーコード ex i t ( l) : / * 表示スウィッチの設定り ニ func-ll ( ) : n i f ( n 〉 0 ) fprintf(stderr. " 表示スウィッチの設定でエラーが発生しました Yn ” fprintf(stderr, ”工ラーコード ニ [Xd]Yn" ex i t ( l) : do{ ″円の描画り n ニ func-20a(0 し . 0. 聞 nd ( ) % 640. rand ( ) % 400. 70.0.0.0.0.0 靆し 0.0. 0.0.0. 0XOL1 い : if( n 〉 0 ) C プログラマのための MS ー DOS プログラミング入門 79

4. 月刊 C MAGAZINE 1990年3月号

GAI.C List 1 0 : lnregs. X. aX : ニ ( (int)&G し ) : inregs. X. bX int86(0xcd, &inregs, &outregs) : 111 : 1 12 : 1 14 : 115 : func-0() 116 : int return( (*(GL- 〉 FUNC[O])) ((unsigned long) ( int far * ) &GrpData) ) : 118 : 119 : } 120 : func-l ( ) 121 : int 122 : return( (*(G し ->FUNC[I])) ((unsigned long) ( int far *)&GrpData) ) : 123 : 124 : 125 : func-3() 126 : int 128 : GrpData. mode. structaddr : 0 : 129 : GrpData. mode. mode = 0X0101 : 130 : return( (*(GL- 〉 FUNC[3])) ((unsigned long) ( int far *)&GrpData) ) : 131 : 132 : 133 : 134 : int func-ll() 135 136 : GrpData. setswitch. swh = 137 : 138 : return( (*(GL->FUNC[II])) ((unsigned long) ( int far *)&GrpData) ) : 139 : 140 : int func_14() 141 : 142 : 143 : GrpData. clear. param 144 : return( ←()い〉 FUNC[14])) ((unsigned long) ( int far *)&GrpData) ) : 145 : 146 147 : 148 : 2 : Progranned by 3 : Dat ed Version Pur posed 10 : CompiIed 14 : #include く stdio. h> 15 : #include く coniO. h 〉 16 : #include く dos. h> 17 : #include "ga. h ” 19 : union REGS inregs, outregs; 20 : struct SREGS segs : 21 : 22 : void gaddr(void) : 23 : int func-O(void) : 24 : int func_l (void) : 25 : int func_3(void) : 26 : int func-ll(void) : 27 : int func-14(void) : 28 : 29 : PILE *fp; 30 : int main( void ) 31 : 32 : { 33 : int n: 34 : 35 : グラフィックスドライバが登録されているどうかを調べる 37 : 38 : if( (fp=f 叩 en("GRAPH $ \ 0 ". 39 : fclose(fp) : 40 : 41 : 42 : 43 : 44 : 45 : 46 : 47 : 48 : / * 工ントリテープルの先頭アドレスの取得 49 : 50 : gaddr() : n = func-0() : 52 : / * グラフィックス初期化り if( n 〉 0 ) 53 : 54 : fprintf(stderr, 55 : ”グラフィックの開始でエラーが発生しました Yn" 56 : fprintf(stderr, ”工ラーコード exit(l); 58 : 59 : 62 : 63 : 64 : 66 : 68 : 69 : 79 : 80 : t2: 85 : 86 : 87 : 88 : 89 : 90 : 92 : 95 : 96 : 98 : 99 : 100 : 101 : 102 : 103 : 104 : 105 : 106 : 107 : } 108 : 109 : void gaddr() 110 : A. Ak itu 1990-01-11 グラフィックスをプログラムするためのプロトタイプ Q U I C K ー C , M S C が稼働 qcl /AS /0x /WI /la:yqc gal. c GA. H List 2 printf("GRAPH. SYS が登録されていません \ n " ) : return( 0 ) : Header file for Graphics し ibrary 5 : Creator A. Akitu 7 : dated 1990 ー 01 ー 11 9 : 1 1 : struct FuncEntryTag int (far pascal * FUNC[41]) (unsigned long) : 15 : far * G し : 17 : union GrpDataTag unsigned int work [ 1024 ] : 19 : 20 : / * NO. 0. 構造体は無し * / / * NO. l. 構造体は無し * / 22 : 23 : struct VRAM / * N0. 2 仮想 VRAM の生成 * / 24 : 25 : long structaddr: / * 仮想 VRAM の構造体アドレス * / 26 : unsigned / * 仮±VRAM のアドレス unsigned long addr; int / * X 方向のドット数 28 : unsigned X : 29 : int / * Y 方向のドット数 unsigned Y : 30 : p ー ane : / * プレーン数 unsigned int 32 : 33 : 34 : 35 : 36 : 37 : 38 : 39 : 40 : 42 : 43 : 44 : 45 : 46 : 49 : 50 : 52 : 53 : 54 : 55 : 56 : 58 : 59 : 60 : 62 : 63 : 64 : 65 : = func_3() : n if( n 〉 0 ) fprintf(stderr, ”表示モードの設定でエラーが発生しました Yn" fprintf(stderr, ”工ラーコード exit(l); / * 表示モードの設定 * / [Xd] Yn". puts("Yxlb[2J") : / * テキストクリアー * / puts("Yxlb[>5h"); / * OPF り カーソル puts( ” Yxlb[>1h ” ): ファンク ー表示 0F P * / ションキ ニ func_14() : / * クリアー * / n if( n 〉 0 ) ”画面の消去でエラーが発生しました Yn") : fprintf(stderr. fprintf(stderr. ”、エラー - コ・一ド ex i t ( l) : 丿 Vram: struct MODE / * NO. 3. 表示モードの設定 * / / * 仮想 VRAM 構造体アドレス * / unsigned long structaddr: node : / * 表示モード unsigned int / * 表示スウィッチの設定 */ : func-ll ( ) : n if( n > 0 ) fprintf(stderr," 表示スウィッチの設定でエラーが発生しました Yn つ : fprintf(stderr, " 工ラー・コ -- ド ex i t ( l) : mod e : struct SETDROWP しÅNE / * NO. 4. 描画プレーンの設定 * / / * 仮想 VRAM 構造体アドレス * / unsigned long structaddr; / * 描画プレーン unsigned long setdrowplane: struct SETDISPP し ANE / * NO. 5. 表示プレーンの設定 * / / * ダミ unsigned long dummy; / * 表示プレーン * / unsigned long mode : setdispplane: struct SETPA し ETTE / * NO. 6 , トの設定 * / パレッ unsigned long dummy; unsigned long palette; unsigned long mode; setpalette; ビューポート領域の設定 * / struct SETVIEWPORT / * NO. 7. / * 仮想 VRAM のアドレス unsigned long structaddr; fpr i ntf (stdout. "Yn このプログラムは , プロトタイププログラムです Yn " fp 「 intf ( stdout. " この間にユーザプログラムを入れてください \ n " ) : puts("Yxlb[>51"); / * カーソル ON * / puts("Yxlb(>ll"); / * ファンクションキー表示 ON * / n = func-l() : / * グラフィックスの終了 * / if( n 〉 0 ) fprintf(stderr. " グラフィックスの終了でエラーが発生しました yn つ : fprintf(stderr, ”工ラーコード exit(l); 号ド トコ ミレラ ダバカ 74 CMAGAZINE 19 3

5. 月刊 C MAGAZINE 1990年3月号

ライフボート 0 「 m on from (ompiler Ma 「 5 レ ice C Ve れ 4.1 従来の C 言語て、は , 式が評価され るときに , float 型 ( 4 バイトデータ 型 ) は double 型 ( 8 バイトデータ型 ) に変換されることになっていまし たが , ANSI 規格て、は , float 型は double 型との演算がないかぎり , float 型のまま扱われるようになり 従来 , float 型を double 型に変 換していた理由は , C 言語が , もと もと DEC 社の PDP ー 11 上て開発さ れ , PDP ー 11 の浮動小数点演算が float 型より , double 型のほうが速 かったため , 大は小をかねるし , 演算速度も速いということて、 , 全 部 double 型に変換して扱うという 言語仕様になったといわれていま す。 しかし , ANSI 規格は , 特定のハ ードウェアに依存した仕様にする わけにはいきませんし , 一般的に いって , float 型は double 型より演 算速度が速いはずて、すから , プロ グラマは float 型に特定したプログ ラムを作成したい場合もあるわけ て、す。そこて、 , 仕様変更となりま こて間題となるのは関 さて , 数の引数て , 実引数は値の評価を 受けるわけてすから , 従来は , す べて double 型になっていました。 てすから , 仮引数を float と記述し ても , 扱いは自動的に double 型に 変換されていました。 しかし , ANSI 規格ては float 型 は評価されても float 型のままてす から , 実引数も float 型のまま渡さ れますし , 仮引数も float 型て宣言 升 oat 型引数について されていれば , 自動的に double 型 に変換するというような扱いをす るわけにはいかなくなりました。 ところが , 従来は float 型と dou ble 型には明確な区別がなかったの て、 , 混在させて使用しているソー スがうまく動かなくなることにな ります。そこて , Lattice C ては , 従来の扱いを残しつつ , て、きるだ け混乱の起こらない形て、 ANSI 規 格にそうようになっています。以 下 , 具体的な例をあげて説明しま す。 基本的には , ANSI 規格にそった 記述があれば , float 型は float 型の まま扱われます。したがって , 以 [ 例 2 ] printf("%f" (f) ; VOid func (float f) [ 例ロ 型として扱います。 下のふたつの例て、は , 変数 f は float float f ; void func (f) / * プロトタイプ宣言 * / void func (float f) ; printf("%f" (f) ; 従来の形式の関数定義をする場 void func (float f) ; または void func (float) ; ておきます。 次のようなプロトタイプ宣言をし 出す前に上記の定義をしておくか , 実引数を float 型て、渡すには , 呼び も float 型て、渡す必要があります。 てすから , この場合には実引数 合には , 仮引数が float 型宣言され ていても , 自動的の double 型とし printf("%f" (f) ; float f ; func (f) て扱われます。 の区別を明確につけておく必要が る場合には , float 型と double 型 が ,ANSI 規格にそった表記がされ には , 従来どおりにふるまいます 形式がまったく入っていない場合 以上のように ANSI 規格の記述 void func(double f) : void func(double) : void func() ; [ プロトタイプ宣言の例 ] ます。 るいは , 引数を double 型て、指定し か , しても引数を指定しない , あ には , プロトタイプ宣言をしない がって , この関数を呼び出す場合 double 型として扱われます。した 上の例て、は変数 f は自動的に あります。 以下に , 不具合が起こる例をあ printf ("%f" func (float ff) func(f) : scanf ("%f" float f ; main( ) [ 例 ] げます。 この場合 , main 関数から func 関 数が呼び出される前にプロトタイ プ宣言がありませんから , 実引数 は double 型に変換されて渡されま す。しかし , func 関数の定義は ANSI 規格の定義方法てすから , 仮 引数 ff は float 型として扱ってしま いますのて , 実際に渡されたデー タとフォーマットが違いますから , て、たらめな数値が表示されること になります。 とくに , 関数定義をしているフ ァイルとその関数を使用する関数 のファイルが別々の場合に , 注意 する必要があります。上の例ては , 最初に以下の 1 行を入れる必要があ ります。 func (float f) ; プロトタイプ宣言は , 記述ミス をチェックするだけてはなく , 正 確なデータ引渡しを行うためにも 必要て、すから , ぜひ , 各関数のプ ロトタイプ宣言をするようにして ください 編集部からのお願い lnformation from Compiler Makers では , 読者のみなさま からのご質問 , こ・要望をお待 ちしております。プログラミ ングに関する疑問点 , 問題点 など , どしどしお寄せくださ い。なお , 疑問点 , 問題点を お寄せくださる場合は , 書面 にてできるだけ具体的にお願 いいたします。また , 今後掲 載を望まれるコンバイラメー カーなどがございましたら , あわせて , 編集部 rlnformation from CompiIer Makers 」係まで お寄せください。 lnformation from Compiler Makers 139

6. 月刊 C MAGAZINE 1990年3月号

五ロ はじめて学ぶプログラー ニンク ・配列名 ( この場合 data ) が配列の処在を表 ただし関数間の独立性は低下します。 きませんてしたね。配列の受け渡しはどの すアドレス値を示す このうち① , ②については今まて、にお話 ようになるのて、しようか ? この解説はま ・参照による引数渡しをされた変数は , 引 したのて、 , だいたいの点は理解していただ だしていない、、ポインタクの概念がからん 数の値を変更して戻ることができる けたかと思います。③についてて、すが , 配 て、くるのて、 , ここて、は実例をあげるにとど ・関数 func は値による引数渡しを行ってい 列データという言葉が出てきました。そう めておきます (List14) 。注意すべき点として る いえばこれまて、の例て、は配列データが出て は , 13C List Fig. 6 宣言の例 2 : fu nc3 だけで外部変数 X を他用 3 : fu nc4 では外部変数 X は川できない 5 : void func3(void) 7 : extern int X; 8 : 1 に void func4(void) i n t X : ①自動変数 . auto autO int i : ②レジスタ変数 register registe 「 int i , ③静的変数 : static static int i , static double data . ④外部変数 . exte 「 n Fig. 5 変数の宣言位置 int X€ Y. VOid ma in (void) X = 10 ; 変数の宣言の位置 く stdio. h 〉 ー - ー #include function(int a, int b) : count : data [ 100 ] : double main(void) VOid VOid int 関数外での宣言 extern int Xo Y : fu ncl ( ) X=X * 2 : int & y, Z : 関数内での宣言 float f : fu nction (int a , int b) float tmp , VOid 関数内での宣言 ~ func2() extern int X, Y : X =X * Y : はじめて学ぶ C プログラミング 123

7. 月刊 C MAGAZINE 1990年3月号

五ロ はじめて学ぶ C プログラミンク 指定子と通用範囲については表 1 に , 変数の 宣言の位置ついては Fig. 5 に示します。これ らをもとにすると , 変数が影響をおよばす 範囲について理解て、きるのて、はないかと思 います。それて、は記憶クラスそれぞれにつ いて考えていきましよう。 ①自動変数 : auto C におけるもっとも一般的な変数て、 , 関数 ( プロック ) 内て宣言され , そのプロック内 て、のみ有効て、す ( Fig. 6 ① ) 。関数 ( プロック ) の開始時にスタック領域に生成され , 関数 ( プロック ) の終わりて、消滅します ( List11 ) 。 ②レジスタ変数・ register 記憶領域を CPU のレジスタに割り当てま す (Fig. 6 ② ) 。これによって変数アクセスに 対する処理の高速化が期待されます。ただ しレジスタの数は有限 ( システムによる ) て すのて、 , レジスタがふさがっていて割り当 てることのて、きない場合には , スタック領 域に割り当てられます。それ以外は auto 変 数とまったく同じて、す。 ③静的変数・ static 記憶領域を静的領域 ( いわゆるメモリ上 ) に割り当てます ( Fig. 6 ③ ) 。関数内て、宣言さ れた static 変数は , その関数内て、のみ参照可 能て、す。さらに関数の外て、宣言された static 変数は , その宣言のなされているモジュー ル内て、のみ参照が可能て、 , ほかのモジュー ルから値を見ることはて、きません。また , これらの static 変数は , プログラムの開始か ら終了まて、同一の記憶領域に確保されてい るのて、 , 値が消滅することがありません。 つまり関数に再び入っても , 以前の値が保 存されています (List12)0 ④外部変数・ extern 関数の外て、記憶クラス指定子をつけずに 定義されたものが外部変数となります。外 部変数はすべての関数およびすべてのモジ ュールから参照て、きます。ほかのモジュー ルて、外部変数を使用したい場合に extern 宣 言を行います ( Fig. 6 ④ ) 。 外部変数においては定義と宣言の意味の 違いに注意しなくてはいけません。定義は , 変数のメモリ割り当てのことをいい , 宣言 は外部て、定義された変数を使用することを はじめて学ぶ C プログラミング 121 [ 表 1 ] 変数の記憶クラスと通用範囲 宣言位置記憶クラス指定子記憶場所 静的領域 全モジュールの全滅 . 不変 〇 static 静的領域 宣言されている : 不変 〇 寿命 配列の 初期化 通用範囲 ま 0 内 モジュールの全域 ほかで定義されている変数をこの宣言以後の , モジュールの全域で使用できることを宣 スタック 宣言されている 消滅 関数 ( プロック ) 内 宣言されている 関数 ( プロック ) 内 宣言されている 不変 〇 関数 ( プロック ) 内 ほかで定義されている変数を , この関数 ( プロック ) 内で使用できることを宣 exte rn 消滅 : レジスタ o 「 スタック 静的領域 register static extern List 1 1 a u t 。変数 3 : 5 : #include く stdio. h> 6 : 7 : void func(void) : 8 : 9 : VOid main(void) int tmp printf("%dYn" 13 : int tmp 14 : printf("%dYn", tmp) : int tmp printf("%dYn" 20 : int tmp printf("%dYn" 22 : func ( ) : printf("%dYn" 24 : 25 : pr intf ("%dYn" 26 : printf("XdYn" tmp) : 28 : printf("%d\n" 29 : tmp) : 30 : } 32 : void func(void) 34 : int tmp = 100 : printf("XdYn" 35 : tmp) : tmp) : tmp) : tmp) : tmp) : tmp) :

8. 月刊 C MAGAZINE 1990年3月号

五ロ はじめて学ぶ 0 プログラー ニンク List 1 4 List 1 5 参照による引数し 2 : 4 : # i Ⅲヨ u de く s td 沁 . h > sort(int d[], i n t n ) : 6 : ( i n t a. i n t b) : 7 : 8 : 9 : ma i n ( vo i d ) int data[10]; 20 : 22 : 23 : VO i d 25 : 26 : 28 : 29 : 30 : 32 : 34 : 38 : VO i d 40 : 41 リカーシプコール 2 : 4 : # i ncl ude く st d i 0. h > 5 : 6 : void main(void) printf()l am in the main()Yn"); 8 : main(); 9 : for (i ー 0 : i く 10 ; + + i ) printf("data[%d] (data[i] ニ %dYn ” func (data [ 3 ]. data [ 9 ] ) : / * 配列を使っていても値による引数渡し * / sort(data, 10 ) ; / * 配列 d ata が参照による引数し for (i 0 : i く 10 : + + i) printf("data[%d] i , data [ 冂 ) : = %dYn ” func(data[3] , data[9]) : List 1 6 リカーシプコール 2 : 4 : #include く stdio. h> 5 : 6 : int factorial(int n); 7 : 8 : void main(void) printf("XdYn" 13 : int factorial (int n) return(l) : e ー se sort(int d[], int n) / * 配列 d のサイズは自動的に決まる ・ 0 ・ 0 本し ・ー・ 0 十しー 0 十し↓し 0 factorial ( 6 ) ) : return(n * factorial(n-l)); func(int a, int b) printf("Xd * Xd = XdYn" List 1 7 2 : 4 : #include く stdio. h> 5 : 6 : VOid main(int argc, char *argv[]) 8 : i nt i : 9 : fo r ( i = 0 : i く argc : 十 + i ) 0 : printf("XsYn", argv[i]); 12 : } m a i n 関数の引数 コラム 3 ・ボトムアップ , トップダウン プログラムを作るうえでは , 次のふたつの立場があります。 ・必要なバーツ ( 関数 , 処理 ) をまえもってそろえておいてから , 全体を築き上げる ・全体の構成を大まかに考えてから細部の組み立てに入る 前者をポトムアップ , 後者をトップダウンと呼びます。必ずしもどちらがよいというわけ ではありません。 C のプログラムは記述法が柔軟すぎて , 初心者はそれだけで混乱してしまう ことがままあります。そのようなときには自分が何をプログラムしたいのかを , 図なりフロ ーチャートなりに示して , はっきりさせることです。そのためには解決すべき問題をます大 局的にとらえ , その後に行う処理を関数に振り分けます。そうして各関数こ・とに制御プロッ というわけて、 , 今月号のクイズはお休み クなどを検討していきます。 にして , 2 月号のクイズの解答を募集して 実は普通のプログラミングではポトムアップとトップダウンとの相互作用が生じているの です。しかし初心者 , それもプログラミングそのもの ( おもにアルゴリズムを考えること ) と います。また本記事についての質問・ご意 プログラムをある言語で記述していくことを切り離して考えることがうまくできないうちは , 見もあわせておよせください 努めてトップダウンの立場をとったほうがよいかと考えます。 4 月号よりいよいよ皆様からおよせいた だいたクイズの解答を解説っきて、掲載する ・今月のクイズ 次回は , コンパイラメーカーが用意して 予定て、す。楽しみにしていてください 2 月号て、出題したクイズに誤りがありま くれているいわゆる標準関数の使い方につ 宛先 した。「 N 語の double 型のデータを入力し , いて解説します。さらに今回て、きなかった 〒 102 千代田区九段南 2 ー 3-26 井関ビル それを大きい順に並べ換えて出力するプロ 関数化の手引といった点もて、きれば言及し 日本ソフトバンク「 C マガジン編集部」 グラムを書きなさい ( ただし N は可変てある ) 』 たいと思います。 C 言語入門構座係 という出題て、したが , N 語は N 個の誤りて、 す。 はじめて学ぶ C プログラミング 125

9. 月刊 C MAGAZINE 1990年3月号

たとえば , コール時に 2 バイトの引数を ふたっスタックに積んだとすると , POP CX POP CX という、、空ポップクを 2 回するとか , add sp, 4 のように直接 SP の値を変えるという手段て、 行われています。 通常これは , コンパイラがかってに生成し てくれるコード中の出来事なのて、 , プログ ラマが気にする必要はありません。 しかし , こて、注意しなければならない のは , コール側には , 自分が関数コール時 にスタックに積んだ引数の個数や大きさし か念頭にない という点て、す。つまりいっ て、もバカ正直に , その大きさ分だけスタッ クを縮小・掃除しようとします。この掃除 によって , スタックは正確に関数コールの 直前の旧状に復帰しなければなりません。 つまり , コールした関数やその関数から 再コールされる関数などの中て、スタックの 姿が妙チキリンに変えられていたとしても , 関数コールからリターンするときには , ス タックはコールされた時点の姿と正確に同 じて、なければならないことを意味します。 したがって , たとえば自前のスタックを 設けて使用するようなルーチンを書いた場 合は , そのルーチンの冒頭と最後に , SS ( ス タックセグメント ) レジスタと SP ( スタッ クポインタ ) レジスタをセープし , リスト アする文がなければならないことになりま す。そしてまた , その自前のスタックの領 域が確実に , 既存のほかのスタックなどの 領域を侵さないようにすることも必要て、す。 あちこちて、複雑にスタックの切り替えを するようなプログラムは , プログラマの頭 が混乱しがちて、 , 往々にしてバグとドジの 宝庫になります。これらのドジについても , いすれ、、告白〃の機会があると思います。 以上は , 関数をコールするコール側の諸 事情て、した。以下に述べるのはコールされ る関数側の諸事情てす。 ④関数は自分に渡される引数を , スタッ ク上の位置・順序により機械的に判断 してアクセスする。 たとえば , C 言語フォーラム 105 func(int a, float し char * c) という引数形式の関数を定義したら , コー ル側はつねにこの順序て、引数を渡さなけれ ばならないということて、す。都合て、たとえ ば int の引数と float の引数の渡し順を変えて も , コールされた関数側には「渡され順が変 わったことを知り得る方法」がありません。 同様に , 逆にコールする側のモジュール が先に確定していて , コールされる関数を 後て、定義するという場合 , その定義におけ る引数の形式や並び順は , コールしている 形式と完全に同一て、なければなりません。 このような次元のドジに対しては , 「関数 プロトタイプ」が役に立ってくれる場合が あります。すなわち , 上記の func ( ) の関数 プロトタイプを宣言しておけば , それと違 う形式て、 func ( ) をコールないし定義してい ると , コンパイル時点て、エラーとして検出 されるからて、す。 ちなみに関数プロトタイプの行は通常の 場合 , そこに新たに書くよりは , 関数の定 義行からコピーしてきたほうが , タイプミ スなどの心配がなくていいようて、す。 C コンパイラの標準ライプラリの関数プ ロトタイプは , さまざまなヘッダファイル に書かれて提供されています。 そこて、 , たとえば昔の C だと , exit( ) ; と書いても OK て、したが , 今の C だと、、 exit ( ) に引数がないぞ〃というエラーメッセージ が返ってきます。これは処理系が , プログ ラマの書いた exit ( ) のコール形式を exit ( ) の 関数プロトタイプと照合してチェックして いるからて、す。しかし , どの C プログラム にも必すある main( ) 関数に関しては , その プロトタイプ宣言はどのヘッダファイルに も存在しません。 プロトタイプが存在すれば , コンパイラ はその関数のコール形式だけて、なく , 定義 形式もプロトタイプと照合してチェックし , 違っていれば工ラーメッセージを出します。 したがってどこかに main(int, char * * ) ; という正しいプロトタイプが存在していた ならば , main ( ) の定義において , main(char * * argv, int argc) というドジを犯さすにすんだのて、す。 上記の定義て、はなぜマズイかというと , C プログラムのスタートアップコード ( Turbo こて、、、 x クは s, c, 1 な C なら cOx. 0bj ・・ ど ) が main ( ) をコールするときに , 引数を argv, argc の順にスタックに積んて、いて , ・ スタックトップにあるのは argv て、はなくて 必 iargc だからて、す ( もちろん ,argc, argv という名前自体には絶対性はなく , こて、 は , ただ慣行に従ってこれらの名前を使っ ているだけて、す ) 。 上記のようなまちがった定義をした main ( ) のなかて、 argv にアクセスする文を書くと , 定 義形式における最初の引数 ( argv ) ? = ? スタ ックトップに渡される引数 (argc) , という 食い違いの状況が発生します。つまり , argc て、ある引数を argv すなわち「文字列 ポインタの配列へのポインタ」として遇し ているのて、す。その実態は 1 個の整数変数 て、すから , ポインタ ( アドレス ) として見 た場合にはおそらく , とんて、もない番地に なっていることて、しよう。 上記の問題は , 、、定義〃を基準にしてみる と , スタートアップコードからの引数の渡 され方の順序が定義とは、、違っている〃と いうことになるのて、すが , しかし関数側は , 違いを知る手段も , 違いに正しく対応する 手段もともにもっていないのて、す。 結論として , 関数の引数の順序や形式は , 定義行 / コールしている行 / プロトタイプ 宣言の 3 者において完全に機械的に一致し ていなければならない ということになり ます。いい換えると , その機械的な並び順 が , 引数に正しくアクセスするための関数 にとっての唯一のより所なのて、す。 ⑤関数は自分が内部で使うローカル変数 もスタック上に確保し , 渡される引数 とローカル変数の両者に対して , スタ ックフレームレジスタ ( 8086 では BP レ ジスタ ) からのアドレシングによりア クセスする。 これについては , 前回に述べたのて、繰り 返しません。スタックの , ローカル変数領域 を確保した部分の、、掃除〃は , もちろん関 数自身が ( リターン直前に ) 行います。

10. 月刊 C MAGAZINE 1990年3月号

List 5 GrpData. circlel GrpData. circlel. GrpData. circlel. paIette=PaIette; GrpData. circlel. cirtype=Cirtype. BOOOOH - BFFFFH ノーマ丿レモードの機種 COOOOH - CFFFFH COOOOH - C7FFFH C8000H - CFFFFH BOOOOH - BFFFFH COOOOH - CFFFFH COOOOH - C7FFFH C8000H - CFFFFH BOOOOH ー BFFFFH 194 : 196 : 197 : 198 : 199 : 2 圓 : 201 : 202 : 203 : 204 : 205 : 206 : 207 : 208 : 209 : 210 : 211 : 212 : 213 : 214 : 215 : 216 : 217 : 幻 8 : 219 : return( (*(GL->FUNC[14])) ((unsigned long) ( int far *)&GrpData) Flag. Palette, Cirtype. Dummy, し inepattern, Pattern, int func 20a(Reserved, 0p, Cx. Cy. R. Startx. Starty. Endx, Endy, Extpattern, Fi llflag, Fi 日 c 引 0 「 ) 220 : 221 : 222 : 223 : 224 : 225 : 226 : 227 : 228 : 229 : 230 : 231 : 232 : 233 : 234 : 235 : 236 : 237 : 238 : 239 : 240 : 241 : 242 : 243 : } 244 : 245 : / * NO. 20 / 1 円の描画 . タイルバターンを使用しない * / unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned long i nt int int int int int int int Char ー ong unsigned Char unsigned unsigned unsigned unsigned unsigned unsigned Char Char int int Char long Reserved; 0p; Cx: Cy : R : Startx: Starty: Endx; Endy; 日 ag : Palette; Cirtype; Dummy : い nepattern; Pattern; Extpa ttern : F i Ⅱロ ag : F i Ⅱ col or : / * 予約パラメータ / * ラスタオペレーション番号 / ネ x 座標 / * y 座標 / * 半径 / * 点画フラグ / * 線の色を決めるパレット番号 / * 線の福 / * 塗りつぶしフラグ . reserved=Reserved; GrpData. circlel. flag=FIag; GrpData. circlel. r=R; GrpData. ci 「 c 1. cy=Cy; GrpData. circlel. op=0p; GrpData. circlel. fillflag=Fillflag; / * 塗りつふしカラーパレット番号事 / GrpData. circlel. fillcolor=Fillcolor; return( (*(GL->PUNC[20])) ((unsigned long) ( int far *)&GrpData) ) : [ 表 6 ] 機種とページの関数表 日本語 MS-DOS Ver. 3 . 3 B まず最初に ,MS-DOS Ver. 3.3 と 3.3B に ついて基本的な違いを明確にしておこう。 日本電気が提供している MS-DOS のバー ジョンは , マイクロソフトや IBM が出荷し ている MS-DOS のバージョンと同期をとっ ているわけて、はない もちろんエプソンが 出荷している MS-DOS とも同期がとられて いるわけて、はない。つまり , このバージョ ンは日本電気によって独自につけられてい るバージョンと理解したほうが正しいとい える。そのなかて、 Ver. 3.3 は , 3.3 , 3.3A と 3.3B というノヾージョンに分かれている。し たがって , Ver. 3.3 には 3 つのバ、一ジョンが 存在することになる。さらに正確に説明す ると , Ver. 3.3 には内部バージョンという公 表されていないバージョンが存在している。 そのため , 厳密にいえば Ver. 3.3 といっても 正確に識別て、きないのが現状て、ある。 日本電気の説明によると , Ver. 3.3 は 16 ビ ット CPU ューザが対象て、あり , Ver. 3.3A は 386CPU ューザが対象だとしている。そし て , Ver. 3.3B は Ver. 3.3A の機能が更新さ れたバージョンとしている。たしかに , 386 マシンユーザには , 更新のニュースが届け られているが , 16 ビットユーザにはそのニ ュースが届いていないという事実がある。 Ver. 3.3 はこうした特異なバージョンて、あ 0 CMAGAZINE 19 3 るという理解を前提に , 実際にどの機能が RL, RA, ES, LS, RS 使用機種 X L2 機能の違いに絞って説明する。 更新されたかを , Ver. 3.3 と Ver. 3.3B との 八イレゾリューションの機種 RL, XL2 /F, / D , / U の指定 省路または /F=BOOO /F=COOO /F=COOO/D /F=OOOO/U 省路または /F=BOOOO /F=COOOO/U /F=COOOO/D 省路または /F=COOOO /F=BOOOO ページフレーム アド レス 物理 ページ 4 4 2 2 2 2 4 4 0 4 辛見に追加された コマンド / ドライノヾ 1 . EMM386. SYS ◆ このドライバは 386 または 386SXCPU 使用 時に , 640K バイト以上のメモリを仮想 8086 モードに割りあて , EMS メモリとして使用 可能にするドライバて、ある。メガソフトか ら市販されている MEMORY-PR0386 によ く似た製品と考えればよい。対象機種は , XL, RA, RL, LS, ES て、 , エプソンの 386 , 386 V て、も使用可能て、ある。 DEVICE=EMM386. SYS [/P= xxx] [/F=XXX] [/D I/U] P は , 拡張メモリに割り当てるべージ数を 指定する。 1 ページは , 16K バイト単位て、あ る。 F は , 使用するべージフレームのアドレ スを指定する。 D または U のオプションはど ちらかを指定することて、 , 実装されていな い拡張 ROM のアドレスに設定て、きる。詳し くは , 表 6 , 表 7 を参考にしてもらいたい 2. PATCH コマンド このコマンドにより , 指定されたファイ ルの内容を 16 進て、変更て、きるようになった MS-DOS Ver. 2.11 から動くことが確認て・ ジョンを問うことはなく , 簡単に動作する。 いえる。このコマンドは , MS-DOS のバー FILEEDIT コマンドのほうが使いやすいと が , 比較すると , 圧倒的にエプソン製の -DOS にもサポートされるようになった。だ なかったが , Ver. 3.3B から日本電気製の MS (FILEEDIT コマンド ) にしか提供されてい 今まて、は , この機能はエプソン製の MS ー DOS 1 . CUSTOM . EXE 、 0 ◆機能強化されたコマンド 2. USKCGM . EXE れた。 定て、きるデバイスにフォント指定が追加さ の作成機能をもっているが , そのときに指 このコマンドは , CONFIG. SYS ファイル 80