include - みる会図書館


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

1. 月刊 C MAGAZINE 1991年7月号

Li st 3 LISt 6 5 : #include く fcntl.h> 6 : #include く string. h> 7 : 8 : # i fdef MSC 9 : #include く stdlib. h 〉 10 : #include く præess. h> 11 : #endif 13 : #ifdef SYSV 14 : #include く sys/ioctl.h> 15 : 日し E *stdprn : 16 : void myerror() : 17 : char *mids(); 18 : #endif 20 : #include "prepmini. h" 21 : #include ” dbarvar5. h ” 22 : #include "barcode2. h ” 23 : #include "pldwn. h" 24 : #include ” lips. h ” 25 : #include "lipsvar. h" 26 : #include ” barvar. h" 28 : #ifdef PROTOTYPE 29 : #include "pldwnvar. h 30 : # i nc lude "barprot. h" 31 : #include ” lipsprot. h ” 32 : #end i f 33 : 34 : 35 : EXTERN short xhaba : 36 : EXTERN short yhaba : 37 : EXTERN short llhaba ; 38 : 39 : #def i ne _LABE し NUM 50 40 : 41 : bar Iase6 (I j i kan, lformat, prtdev) 42 : long 凵 i kan ・ 43 : long lformat : 44 : char *prtdev : 45 : { 46 : char num [ し ABE し NUM] [MOJ ILEN) : 47 : char IIIOJ it-LABE し NUM] CMOJILEN] : 48 : int handle, i : 49 : char jikan[10]; 50 : char format 10 ・ 51 : char number 20 52 : char pnum[20] : 53 : long ⅱ : 54 : POINT p; 55 : uns i gned long i nt samen=O : 56 : if(Gbarkind くニ 0 Ⅱ Gbarkind > 8 ) { 58 : Gbarkind ニ 1 59 : if(Gbai くニ 10 Ⅱ Gbai > 40 ) { 60 : Gba i 62 : 63 : xhaba ニ 40 64 : llhaba : 4 ・ 65 : Gdpi ニ 240 : 66 : 67 : #ifdef SPARCLT if((handle ニ open(prtdev, 0 WRON し Y ) ト 68 : myerror("can ・ t open printer Yn") : 69 : ioctl(handle, RAW) : if((stdprn ニ fdopen(handle, "w") ) = NU しい { myerror("can ・ t fopen printer Yn") : 73 : 75 : #endif 76 : 77 : #ifdef PCUX V if((handle : open("/dev/lp", 0 WRON し Y ) ) = myerror("can ・ t open printer Yn") : 80 : ioctl(handle, し円 OCTHR) : if((stdprn : fdopen(handle, "w") ) = NUL し ) { 82 : myerror("can ・ t fopen printer Yn") : 83 : 84 : 85 : #endif 86 : 87 : 88 : 89 : 90 : 92 : 93 : 94 : 95 : 96 : 98 : 99 : 100 : 101 : 102 : 103 : 104 : 105 : 106 : 107 : 108 : 10 : #include ” dbarvar5. h" 12 : VOid 13 : f i Ⅱ t 叩 2 (canvas_name) 14 : Canvas canvas_name : 16 : PiXWin *pw; 17 : char *homeptr; 18 : char bairitsu[50]; 19 : char barkind[50] : 20 : pw = canvas_pixwin(canvas_name) : 22 : selboxdp(pw, &Gbox[0 , Gsprtdev, " プリンタデパイス ". Gprtdev_tbl) : 23 : 24 : selboxdp(pw, &Gbox[l . Gsprtkind, " プリンタの種類 " , Gprtkind_tbl) : 25 : seIboxdp(pw,&Gbox[2 ,Gsbarkind,"JS—コードの種 M",Gbarkind_tbl); 26 : selboxdp(pw, &Gbox 3 , Gslabel " ラベルの種類 ",Glabelkind_tbl); 27 : selboxdp(pw, &Gbox 4 , Gspaper , ”用紙の種類 ",Gpaper tbl); ・ 28 : selboxdp(pw, &Gbox 5 , GsfiIe " ファイル指定 ",Gfile_€bl); 29 : selboxdp(pw. &Gbox 6 , Gscolumn " 列数 ",Gcolumn_tbl) : 30 : se lboxdp (pw. &GbOX 7 , " 行数 ",Grow tbl); , Gsrow " 横幅 ",Gbai:tbl); selboxdp(pw, &Gbox 8 . Gsbai 32 : selboxdp(pw, &GbOX 9 , Gsbheight " 縦幅” ,Gbheight_tbl) : 33 : selboxdp(pw, &GbOX 10 , GsIeft ," 左余白 ",Gleft_tbl); 34 : selboxdp(pw, &GbOX 11 , Gskaigyo , ”行間 ". Gkaigyo_tbl); 35 : selboxdp(pw, &GbOX 12 , Gsnumrow " 数字行 " , Gnumrow tbl) : , " 桁数 ",Gketa_tbl) : 36 : selboxdp(pw, &Gbox 13 , Gsketa selboxdp(pw. &Gbox 14 . Gsup ," 上余白 ",Gup-tbI) : 38 : selboxdp(pw, &Gbox 15 ,Gscolint ,"パー間 ",GcoIint_tbl); 39 : selboxdp(pw, &GbOX 16 , Gsmoj i row ”文字行 ". Gmojirow tbl); ," 字間隔 ". Gjikan_t61); 40 : selboxdp(pw, &GbOX 17 , Gsj ikan selboxdp(pw. &Gbox 18 , Gsrenpr . " 連続番号印刷 " . Grenpr tb l) : 42 : selboxdp(pw, &GbOX 19 . Gsfilepr " ファイル印刷 ". Gf ⅱ ep 己 tbl) : 43 : se lboxdp (pw, &Gbox 20 ] , Gsd i rectpr, ”問合せ ",Gdirectpr_tbl) : 44 : dbutton(pw, Gbox [ 21 ]. xl , Gtm [ 21 ]. yl, " 終了 " ) ; 45 : 46 : List SELBOXDP. SUN . #define EXTN extern 2 : 3 : #include く suntool/sunview. h> 4 : #include く suntool/canvas. h> 5 : 6 : #include "vartype. h" 7 : #include ” smarknva. h ” 8 : 9 : selboxdp(pw, boxn, selnum, title, str) 10 : Pixwin *pw; 11 : struct GbOXY *boxn; 12 : SHORT selnum; 14 = UCHAR 0 ロ ESMOJILEN ・ 16 : SHORT if( strlen(str[selnum]) ) { dboxstr(pw, boxn->xl, boxn->yl, title, str[selnum] 20 : } LiSt DBOXSTR. SUN 1 : #def i ne EX'I'N extern 2 : 3 : #include く suntool/sunview. h> 4 : #inglude く suntool/canvas. h> 5 : 6 : #include "smarknva. h ” 7 : 8 : dboxstr(pw, x, y, strl, str2) 9 : PlXWln *pw; 10 : int x; int y: 12 : Char *strl : 13 : Char *Str2 : 15 : int boxlength; drawbox(pw, x, y + 5 , str2) : 17 : pw-text(pw, x, y, 円 X_NOT( 円 X_SRC), N 乢し . strl) : 18 : } 0 ・ー O tn 0 E , 0 編し 1 ー E く 0 《 0 X C.21 よ 一十しい 0 一 : ー C 十し NC 0 0 0 ・ー cd ・し + ) 本し 0 よー List BARLASE6. SUN . #def i ne EXTERN extern 2 : 3 : #include "config. h ” 4 : #include く stdio. h> 86 C MAGAZINE 1991 7

2. 月刊 C MAGAZINE 1991年7月号

応言吾 C の道具箱 起動しなかった方は , ソース中に、、 dlregs. h 〃 があるかないかを確認していただき , ある 場合には , それをを egs2. h 〃に書き換えてい ただくとともに , 割り込み処理部分を以下 のような形に訂正していただきたい clockoff. c 1 : #define EXTERN extern 2 : #include ” config. ド 3 : 4 : #include く stdio. h> 5 : #include く dos. h> 6 : #include く con iO. h> 7 : #include く process. h> 9 : #include "regs2. h" 10 : #include "pldwn. h ” 11 : #include myt ime. h ” 12 : #include "mytimeva. h" 14 : #ifdef TURBOC 15 : #def ine _dos_getvect ino) getvec t ( i no) 16 : #def ine _dos setvect ino, i fun) setvect(ino, ifun) 17 : #define enable() en ab 厄 ( ) 18 : #define :disable() disable() 19 : #define outp (port, byte) outportb (port, byte) 20 : #def ine inp(port) inportb(port) 21 : #endif 22 : 23 : #i fdef PROTOTYPE 24 : #include "cboxprot. h" 25 : #end if 26 : 27 : void clockoff() 29 : -disable(); 30 : outp ( mPd8259 + 2 , i np ( m 8259 + 2 ) dos setvect ( 0X08 , OrgVect) : enable() : 32 : 33 : } List 4 ( 例 ) in 「 egs->h. ah 0X04 inregs->h.al (char)g 「 oup int86 ( 0X18 , inregs, outregs) ; ↓ in 「 egs. h. ah 0X04 inregs. h.al (char)g 「 oup in186 ( 0X18 , &in 「 egs, &outregs) ; アドバイスいただいた読者に対しては誌 面を借りてお礼を申し上げたい ( 実際読者か らこのようなアドバイスをいただくと , 改 めて本誌の読者層のレベルの高さを感じ る ) 。筆者としては , この全ソースを公開し た形ての「 C の道具箱」をますます充実させる とともに , 一層信頼性の高いものにしてい きたいのて , プログラムについてお気づき の点などがあれば , どしどしご指摘いただ [ 参考文献 ] [ 1 ] アスキー出版局テクライト編『 PC ー 9800 シリーズテクニカルデータブック』 , アスキー出版局 [ 2 ] スティープン R. ディビス , 岩谷宏訳 fTurbo C の技法』 , 工学社 [ 3 ] 石田秋也 , 鍋谷研一 , 酒井高行 , 高村 誠之 TMS ー C Ver. 5.1 プログラミン グ』 , ソフトバンク [ 4 ] 河西朝雄 TMicrosoft-C 初級プログラ ミング入門 ( 下 ) 」 , 技術評論社 [ 5 ] 河西朝雄「 C プログラミングノー ト』 , ナツメ社 [ 6 ] 横山直隆「 Z ー 80 , 8085 , 8086 のプログ ラミング実験による割込み技術入門』 , 技術評論社 [ 7 ] William James Hunt "The C T001 box", Addison-Wesley Publishing Company re 引 key2. c ( キー押下状態のスキャン ) 1 : #define EXTERN extern 2 : 3 : #include く std io. h> 4 : #include く dos. h> 5 : 6 : #include "regs2. h ” 7 : 8 : realkey2 (int group) 10 : inregs. h. ah = 0X04 : inregs. h. al (c ha r) group 12 : int86 ( 0X18 , &inregs, &outregs ) : 13 : return ( ( int) outregs. h. ah) 14 : } List 5 2 poke 関数 , peek 関数の変更 Fig ・ く poke> movedata((int)FP SEG(dbuff), (int)FP OFF(dbuff), dseg,doff, size) ; く peek> movedata(sseg, soff, (int)FP SEG(dbuff), (int)FP OFF(dbu 幵 ),size) ; 応用 c 言語 101

3. 月刊 C MAGAZINE 1991年7月号

#define PROTOTYPE #endif 読者からの質問 ノおよびアドバイス [ 質問 ] ' 90 年 11 月号および 12 月号のソースプログ ラムの poke. c, peek. c, chgvatr. c, dispkei. c をコンパイルすると , 警告メッセージ出る のて、すが。 [ 回答 ] poke, peek については , ' 91 年 3 月号て、も 訂正しましたが , movedata( ) のところを Fig. 2 のように変更してください また , chgvatr および dispkei については , プロトタイプ宣言されていないためのもの なのて , 以下のようにプロトタイプ宣言フ ァイルをインクルードしてください #include "cboxprot. h" [ アドバイス ] 従来筆者は , 以下の内容の dlregs. h をしば しば使用してきた。 union REGS *inregs ; union REGS *outregs ; union struct SREGS * segregs, * sregs ; しかしこの宣言ては , inregs, outregs な どについて実際に参照されるアドレスがど こに設定されるかは不確定て、 , 場合によっ ては , MS ー DOS のシステム領域やほかのル ーチンて、使用している重要な領域に書き込 みを行ってしまう場合がある。筆者は PC- 9801RA て、 , おもに MS-CVer. 5.1 を使用して いるが , このような構成の下ては今まての ところ上記の宣言による不都合は出なかっ ところが読者からのご指摘て , マシン およびコンパイラによっては , この宣言が バグの元になることがわかった。 したがって , もし読者 , とくに Turbo C を使用されている読者の中て , 独自にコン パイルして作成した実行ファイルがうまく List 2 0 0 0 0 Q) E O 9 ・ , 0 0 ・ , 0 Q) O ↑・ 0 十》 O CD CD O O O 行ーー っ 0 -4- LO ^ 0 々ー 8 01 よっ 0 っ 4 LO ー 8 0 、 1 つなっ 0 4 - -0 ー 8 9 0 、ー・つ 0 clockon. C 1 : #define EXTERN extern 2 : #include "config. ド 3 : 4 : #include く stdio. h> 5 : #include く dos. h> 6 : #include く con iO. h> 7 : #include く process. h> 8 : 9 : #include "regs2. h" 10 : #include "pldwn. h ” 11 : #include ” mytime. h ” 12 : #include ” myt imeva. h" 13 : 14 : #i fdef TURBOC 15 : #def ine _dos_getvect (ino) getvect( ino) 16 : #def ine _dos setvect (ino, i fun) setvect ( ino, ifun) 17 : #define enable() enable ( ) 18 : #define disable() disable() 19 : #def ine öutp (port, byte) ou tpor tb (por t, by te) 20 : #def ine inp(port) inportb(port) 21 : #endif 22 : 23 : #i fdef PROTOTYPE 24 : #include "cboxprot. h ” 25 : #endif 26 : 27 : void clockon() 28 : { 29 : stat ic short I ntvCount : 30 : short count; 0rgVect ー _dos_getvect ( 0X08 ) : 32 : IntvCount = 24576 ・ disable(); 33 : dOS setvect ( 0X08 , ti medate) : 34 : öutp て叩 d8253 + 6 , 0X36 ) : 35 : delayy ( 2 ) : 36 : (IntvCount & 0xFF) : 37 : coun t outp(mpd8253,count ) : 38 : delayy ( 2 ) : 39 : (I ntvCount > > 8 ) : 40 : coun t outp ( mPd8253 , count ) ; count =(inp( 叩 d8259 + 2)VTIMER) : 42 : outp ( m 8259 + 2 , count) : 43 : -enable() : 44 : List 3 100 C MAGAZINE 1991 7

4. 月刊 C MAGAZINE 1991年7月号

List SMARKN5. SUN 63 : { 71 : * * / 91 : * * / 84 List 1 209 : 208 : 207 : 201 : 200 : { 199 ・ 198 : 197 : 196 : } 195 : 194 : 193 : 192 : 191 : 190 : 189 : 188 : 187 : 186 : 185 : 184 : 183 : 182 : 181 : 180 : 179 : 178 : 177 : 176 : 174 : 173 : 172 : 170 : 169 : 168 : 167 : 166 : 165 : 164 : 163 : 162 : 161 : 160 : 159 : 158 : 157 : 156 : 155 : 154 : 153 : 152 : 150 : 149 : 148 : 146 : 145 : } 144 : 143 : 142 : 141 : 140 : 139 : 138 : 137 : 136 : 135 : 134 : 133 : 132 : 131 : 130 : 129 : 128 : 127 : 126 : 125 : 124 : 123 : 122 : 121 : 120 : 118 : 117 : 116 : 115 : 1 13 : 112 : 110 : 109 : 108 : 107 : 106 : 105 : = ⅵ ndow-create (pframe, PANEL, 0 ) : panel 3 : 8 : 12 : 22 : 23 : 27 : 29 : 33 : 34 : 35 : 36 : 37 : 38 : 40 : 43 : 44 : 47 : 48 : 49 : 50 : 59 : 60 : 62 : 64 : 65 : 68 : 69 : 74 : 75 : 80 : 82 : 84 : 85 : 86 : 87 : 88 : 89 : 90 : 92 : 93 : 94 : 95 : 96 : 99 : Wind0H ttysw; 46 : PaneI pane12: 45 : Panel pane l, Frame pframe2 : Frame pframe : 42 : static void done_proc2() : 41 : stat i c VO i d done_proc ( ) : 39 : # i ncl ude ” smarknva. h" #include く suntool/tty. h> #include く suntool/panel. h> # i ncl ude く suntoo l/canvas. h> #include く suntool/sunview. h> 32 : EXTERN short Ⅱ haba : 31 : EXT ERN short yhaba : 30 : EXTERN short xhaba : 28 : #include ” barvar. h ” #include "lipsvar. h" 26 : #include "lips. h" 25 : #include "pldwn. h" 24 : # i nc lude ” barcode2. ド #include ” dbarvar5. h ” #include "prepmini. h" 1 : #define EXTN 2 : #define EXTERN 4 : #include "config. h" 5 : #include く stdio. h> 6 : #include く fcntl.h> 7 : #include く string. h> #include く setjmp. h> 9 : #include く signal.h> 10 : #include く sys/ioctl.h> 11 : 日し E *stdprn ・ VO i d myerror ( ) : 13 : char *mids() : 15 : void , 。 t 。に 3 16 : VOid 叩 _proc() : 17 : void home_proc() : 18 : void do command() : 19 : void do-cmd2() ; 20 : void dO cmd3(); ー snum 日 num lpnum ー panel create_ i tem (pane l, PANE し _TEXT, PANEWITEM_X, ATTÜROW(OB: PANE し」 TEM Y, PANE し LABEC STRING, " 開始番号 PANE し :VALUCDI SP し AY_ し ENGTH, 55 , - pane l_create- i tem (pane l, PANE し _TEXT, ATTR_CO し (の . PANE し _ITEM_X, ATTR ROW ( 1 ), PANEL ITEM Y, PANE し :LABEC_STRING, " 終了番号 PANEL_VALUE_DI SPLAY_ し ENGTH, 55 を lkasan - panel_create-item(panel, PANEL TEXT, ATTR CO し ( の . PANE し _ITEM X, PANEL_ITEM-y, ATTÜROW ( 2 ) , PANEL_LABEC_STRING, " 増分 PANE し _VA し UE_DI SP し AY_ し ENGTH, 55 , lpsamen= pane l_create_ i tem (pane l, PANE し _TEXT, ATTÜROW ( 3 : PANE し ITEM X, PANE し -ITEM Y, PANE し :LABEC_STRING, " 同番号回数 PANE し _VALUE_DI SP し AY_ し ENGTH, 55 , : panel_create item(panel, PANEL_TEXT, PANE し _ITEM X, ATTR_CO し ( 0 ) . ATTR ROW ( 4 ) , PANE し ITEM Y, PANELZLABEC_STRING, " 印刷回数 PANE し _VA し UE_DI SP し AY_ し ENGTH, 55 , 147 : pitems2() pane l-create_ i tem (pane l. PANEL_BUTTON, PANEL_LABE し _IMAGE, panel_button_image(panel, "DONE", 5 , の . PAN E し _NOT IFY_PROC , done_proc, window fit height(panel) : window-set(pframe, WIN-SHOW. TRUE, 0 ) : Panel Panel Panel 51 : Panel 52 : Panel 53 : Panel 54 : Panel 55 : Panel 56 : Panel 57 : Panel 58 : Panel i tem i tem i tem i tem i tem i tem i tem item i tem i tem main(argc, Char int ー snum 第 Ⅱ num : lkasan; lprtdev 1 : Iprtdev2 : Iprtdev3 : Iprtdev4 : ldbfnam : lpmfnam : lpsamen : lpnum; argv) argc : **argv : Canvas contro ー i ndOW : PiXWin *pw; setjmp (Gretback の : signaI(SIGINT, sctrlc) : signal (SIGHUP. sctrlc) : signal (SIGTSTP, sctrlc) : initvars() : strcpy ( 引 prtdev, "/dev/ttya" ) : base_frame ニ window_create()U しし FRAME, FRAME_LABE し "markn WS*** MARKN WS verl . 0 * * * " , の : control w i ndow = ⅵ ndow create (base_frame, CANVAS. 引 N_EV ENT PROC, iyproc, N 』 GH ↑ . 200 , pitems() : pitems2() : ttysw = window_create(base_frame, TTY, pframe2= w i ndow-create (base_frame, FRAME, の ; panel 2 = ⅵ ndow-create (pframe2, PANE しの : lprtdev 1 ニ pane l_create_ i tem (pane , PANEL TEXT, PANE し」 TEM X, ATTR_CO し (0) . ATTR ROW( の , PANEL_ITEM Y, PANE し _LABEC_STRING, " ラリンタデバイス 1 PANE しーVAし肥ー田 SP し AY_ し ENGTH. 55 を Iprtdev2= pane l_c reate i tem (panel 2 , PANEL TEXT, ATTR_CO し (0), PANE し _ITEM_X, ATTR ROW(I), PANE し _ITEM Y, PANE し一し ABEC_STRING, " ラ・リンタデバイス 2 PANE し _VA し UE_DISP し AY_ し ENGTH. 55 , Iprtdev3= pane l-create- i ten (pane . PANE し _TEXT. ATTR_CO し (0), PANE し _ITEM_X, PANEL_ITEM Y, ATTR_ROW ( 2 ). PANE しし ABEC STRING," プリンタデパイス 3 PANEIZVALUCDISP し AY_ し ENGTH. 55. Iprtdev4= pane l_create_ i tem (pane . PANE し _TEXT, ATTR_COL ( 0 ) . PANE し _ITEM_X, ATTR ROW (3), PANEL_ITEM_Y, PANE し一し ABEL STRING. " プリンタデバイス 4 PANE し _VALUE_DISP し AY_LENGTH, 55 , ldbfnam = pane l_create_ i tem (pane , PANE し _TEXT, ATTR_CO し (0), PANE し _ITEM_X, ATTR_ROW(4), PANE し _ITEM Y, PANE し - し ABEC_STRING, " データファイル名 PANEL_VA し UE_DI SP し AY_ し ENGTH, 55 , lpmfnam = paneI_create_item(pane12. PANE し _TEXT, PANE し _ITEM_X, ATTR CO し ( 0 ). ATTÜROW(5), PANE し _ITEM Y, PANE し _LABE し STR G , " 六ラメータファイル名 : " PANE し _VALUE_-DI SP し AY_LENGTH. 55 , pane l-create i tem (panel 2 , PANEL BUTTON. PANEC_ し ABEL_IMAGE, panei_button_image(panel, "tnIE". 5.0 ). PANE し _NOTIFY_PRW, done_proc2, window fit height(pane12) : window:set(pframe2, WIN-SHOW. TRUE. の : Ⅲ N_ROWS, 20 第 Ⅲ N_VERTI CA し _SCRO しし BAR. scro Ⅱ bar_create ( の , ⅵ ndow-set (contro l_wi ndow, N_I GNORE_ 円 CK_EVENT. Ⅵ N_UP_EVENTS, の : ⅵ ndow_ma i n_100P (base_frame) : fi llt 叩 2(control_window) : ・ pitems() exit(0); 1 圓・ 101 102 : 103 : 104 : pframe= w i ndow_create (base_frame. FRAME. の : static void ・ done_proc ( ) int status; 202 : char snum 256 203 : char lnum 256 204 : char kasan[256] : 205 : char psamen [ 256 ] : 206 : char pnum [ 256 ] : strcpy(snum . (char *)panel_get_value(lsnum) strcpy(lnum . (char *)panel get_value(llnum) C MAGAZINE 1991 7

5. 月刊 C MAGAZINE 1991年7月号

いう経験がないのて , 同書の翻訳作業に伴 てしようがね。 ることを宣言しています。 というわけて , これまて、 , こういうスト それから , cout を利用して「 1 か 2 か 3 およ うプログラムの手入力 ( ディスクが付いてな び [RETURN] キーを押せ」というメッセ リーム入出力のオプジェクトを真面目に相 い ! ) およびコンパイル , テストランが , 私 ージを画面に出力します。 にとって , 実質的に C 十十事始めとなりまし 手にしなかったのてすが , ところがどっこ い ! cin, cout は , そんな単純なペット動 そして , cin を利用してキーポードから変 というのが今回のドジの 物て、はなかった , 数 keypress への入力を行います。 一筋縄ではいかない 話題てあります。 それから , switch 構文の中て , keypress CIn, cout の値によって , 「あなたは 1 を押した」などの stream. h と メッセージ表示へ分岐します。押したキー 雑誌の C 十十入門記事などには , cin とい iostream. h うオプジェクトを利用したキーポード入力 が 1 , 2 , 3 以外のときは , ラベル start: へ戻り や , cout というオプジェクトを利用したコ 同書の 3 章は「プログラムの制御」と題し ます。 ンソール出力の文が , 必ずといってよいほ て , if, while, switch.. case などのいわゆる まず , C 十十のヘッダファイルの拡張子 が . hpp て、あるのは , ZC 十十などの固有性て 制御構文が初心者レベルて、解説されていま ど登場します。 す。 TurboC 十十はヘッダファイルの拡張 す。 int X : その中の , switch 文と goto 文を説明する 子を . h に統一しています。そこて、 , cin > > int x ; 箇所のコード例に , List 1 のようなのがあり #include <stream. hpp> cout < く "This is a string*n" ます。 こては , 本に載っているコード例 の行を , に , main() や #include の枠を適当につけて #include <stream. h> といった具合に。 こういうオプジェクトは , もちろん C 十十 と書き換えます。 TurboC 十十は , 古い AT & 引用します。 まあ , 説明の必要もないと思いますが , T C 十十 1.2 とのコードの互換性を図るた の言語本体に属するものてはないし , まあ printf( ) や scanf( ) をやや便利にオプジェクト 一応 , このプログラムが行うことを簡単に めに , stream. h を提供しています。 しかし , #include < stream. h > てコンノヾ 説明しましよう。 化したものだろうぐらいに思って , これま イルしてみると , 未定義シンポルエラーが 最初に , int 型のローカル変数を 1 個使用す ての私はこういった ( cin や c 。 ut が登場する ) ること , それを kyepress という名て、参照す いくつか出ます。すなわち , どうやら Turbo コードに対して , 真剣な関心を払わずにき ました。オプジェクトの名前に最初感じた switch 文と goto 文を説明するコード例 違和感も , 頭の c 〃が *console" を意味す ることがわかれば , 解消します。 > > , < < という妙な記法も , 「 C 十十の演 算子オーバロードじゃ ! 」と , 水戸黄門の葵 の紋入り印篭を見せつけられたならば , 黙 って納得するしかない・ こういう皮肉 を書きたくなるのは , オーバロードされて も演算子の優先順序は変わらない , 現在の C 十十の規約が , 現実世界に対するわ れわれの常識的な感覚にそぐわない事態を 招来してしまう場合がときどきあるからて す。 しかし , 演算子の優先順序を , ダイナミ ックに , 文脈依存て可変にせよ , と要求し たら , コンパイラ作家は困りはててしまう とか , LiSt をりいい、リーい ) い 1 : #include く stream. hpp> 2 : 3 : ma i n ( ) 5 : int keypress; 2 or 3 and [RETURN]Yn" ・ 6 : cout くく” Press 1 , 〃これは goto 用のラベル 7 : start: 8 : cin 〉 > keypress; switch( keypress ) { 9 : case 1 : cout くく "You pressed 1Yn ・ case 2 : cout くく "You pressed 2Yn ・ case 3 : cout くく "You pressed default : goto start; 15 : } break; break; break; C 言語フォーラム 103

6. 月刊 C MAGAZINE 1991年7月号

SPARC プログラミング List 1 Li st 2 68 : 69 : 70 : 72 : 78 : 79 : 80 : 83 : 84 : 85 : 86 : 87 : 88 : 89 : 92 : 94 : 95 : 96 : 97 : 98 : 99 : 100 : 101 : 102 : 103 : 104 : 105 : 106 : } 107 : 108 : static void 109 : do_cmd2(which) 1 10 : int which; 112 : i nt status : 113 : swi tch ()h i (h) { case 0 : i f (fork ( ) = 0 ) { 115 : exec l("/usr/b i n/texted i t". i t" , Gdbfnan. の : wa i t (&status) : 116 : 117 : break : 118 : 119 : 120 : } 121 : 122 : static void 123 : do_command ()h i ch) 124 : int which; 126 : i nt status ; 127 : switch(which) { 128 : case 0 : transvar ( ) : 129 : if(Gsnum ← 0 Ⅱ引 n 礪く = 0 llGkasan く = の { 130 : myerror ( " パラメータを指定して下さい " ) : 131 : 132 : bar Iase6 ( 引 j i kan, 引 paper, 引 prtdev) : 133 : break : 134 : case 1 : pitems() : 135 : break : 136 : 137 : , 138 : } 139 : 140 : static void 141 : do_cmd3(which) 142 : int which; 143 : { 144 : i nt status : switch(which) { 145 : 146 : case 0 : 147 : case 1 : 148 : case 2 : 149 : pitems2() : 150 : break ; 151 : 152 : ー 153 : } 11 CNJ っ 0 4- ・し 4 し 4 し、 ,. cd cd ・ 0 cd cd 0 1 ーワ 0 ワ 0 . 十し十レ 4 し十 ) 0. 0. ・ 0 Q) Cn a. a. 0. 0 0. 十レ一十し十レ十し 4 し十し・ー ・ー一 CO tn Ø 十レ し 0 0 1 ーっ 0 っ 0 - -0 ^ 0 っー 8 0 、 1 ワ CO -4 : -0 cD っー 8 0 ・ワ 0 っ 0 ・ 4 ・ - -0 ー 8 ソ 0 ワ 0 っ 0 ワ 0 っ朝っ 0 ワ 0 っ 0 ワ 0 っ 0 っ 3 っ朝ワ 0 っしり乙っ乙ワ】っ乙 0 乙ワ 3 ワ 0 ワ乙っ乙 else if( boxin(xpos,ypos,&Gbox[12J) ) { mmenuset (canvas, event. Gnumrow tb l, &Gsnumrow) : else if( boxin(xpos,ypos,&Gbox[13]) ) { mmenuset (canvas, event, Gketa tb l, &Gsketa) : else if( boxin(xpos,ypos,&Gbox[14]) ) { mmenuset (canvas, event, Gup_tb し &Gsup) : else if( boxin(xpos, ypos, &Gbox[15]) ) { mmenuset (canvas, event. Gco ⅱ nt_tb l, &Gsco ⅱ (t) : else if( boxin(xpos,ms,&Gbox[16]) ) { mmenuset (canvas, event, Gmoj i row_tb I, &Gsmoj i row) : else if( boxin(xpos,ypos. &G面X[17]) ) { mmenuset (canvas, event, Gj i kan tb l, &Gsj i kan) : else if( boxin(xpos, ypos,&Gbox[18]) ) { sel ect i on=mmenusel (canvas, event, Grenpr_tb I, &Gsrenpr) : if(seIection>=0) { do-command (sel ect i (n) : else if( boxin(xpos,ypos, & G 面 x [ 19 ] ) ) { se lect i on=mmenuse l(canvas, event, Gf ⅱ epr_tb I, &Gsf ⅱ epr) : if(seIection>=0) { do_cmd2(seIection) : else if( boxin(xpos, ypos, & G x [ 20 ] ) ) { mmenuset (canvas, event, Gd i rectpr_tb l, &Gsd i rectpr) : else if( u)xin(xpos.ypos,&Gbox[21]) ) { quitproc(base_frame) : strcpy(kasan, (char * ) anel-get-value(lkasan) strcpy(psamen, char * panel_get_value(lpsamen strcpy (pnum char * panel_get-value(lpnum) (uns i gned long) atol ( snum ) : Gsnum (unsigned long)atol( lnum ) : Glnum uns i gned long) at01 ( kasan) : Gkasan Gpsamen= uns i gned char atO i ( psamen) : (unsigned char atOi ( pnum) : Gpnum i f (Gkasan Gkasan ニ 1 し : i f (Gpsamen ー Gpsamen ニ 1 if(Gpnum Gpnum window_set(pframe,WIN SHOW, FA し SE, の : List MYPROC. SUN 1 : #def i ne EXTN extern 2 : #def i ne EXTERN extern 3 : 4 : #include く setjnp. h> 5 : 6 : #include く suntool/sunview. h> 7 : #include く suntool/canvas. h> 8 : 9 : # i nc lude ” smarknva. h ” 10 : #include ” dbarvar5. h ” 11 : #include "vartype. h" 12 : 13 : void do command() : 14 : void do-cmd2() : 15 : void dO - c 3 ( ) : 16 : 17 : VOid 18 : myproc (canvas, event) 19 : Canvas canvas; 20 : Event *event : 21 : { 22 : SHORT xpos, ypos, selection; 23 : Menu my_menu : 24 : SHORT i, var; 25 : 26 : xpos=event_x (event) : ypos=event-y(event) : 28 : if(event id(event)==MS RIGHT) 29 : 30 : mmenuset (canvas, event, Gprtdev_tb l, &Gsprtdev) : 33 : if( boxin(xpos,ypos,&Gbox[I]) ) { 34 : mmenuset (canvas, event, Gprtk i nd_tb I, &Gsprtk i (d) : 35 : 36 : else if( boxin(xpos. ypos, &Gbox[2]) ) { mmenuset(canvas, event, Gbarkind_tbl, &Gsbarkind) : 38 : 39 : else if( boxin(xpos,ypos,&GboxC3]) ) { 40 : mmenuset(canvas,event, GlatElkind_tbl, &GsIabel) : 42 : else if( boxin (xpos, ypos, &Gbox[4]) ) { 43 : mmenuset (canvas, event, Gpaper_tb I, &Gspaper) : 44 : 45 : else if( boxin(xpos,ypos,&Gbox[5]) ) { 46 : selection=mmenusel(canvas, event, Gfile tbl, &Gsfile) : if(seIection>=0){ 48 : do-cmd3 (sel ect i (n) : 49 : 50 : else if( boxin(xpos, ypos, &Gbox[6]) ) { 52 : mmenuset (canvas. event, GCOI unn_tb l, &GscoI umn) : 53 : 54 : else if( ypos, & Gbox [ 7 ] ) ) { 55 : mmenuset(canvas, event, Grow tbl, &Gsrow) : 56 : 57 : else if( ) { 58 : mmenuset (canvas, event, Gba i tb l, &Gsba i) : 59 : 60 : else if( boxin(xpos, ypos, &Gbox[9]) ) { mmenuset (canvas. event, Gbhe i ght_tb l. &Gsbhe i ght) : 62 : 63 : else if( *. Y8S・&G面X[10]) ) { 64 : mmenuset(canvas, event,Gleft_tbl, &GsIeft) : 65 : 66 : else if( boxin(xpos,ypos,&Gbox[II]) ) { mmenuset (canvas, event. Gka i gyo_tb l, &Gska i gyo) : 32 : List FlLLTOP2. SUN 1 : #def i ne EXTN extern 2 : #def i ne EXTERN extern 3 : 4 : #include く setjmp. h> 5 : 6 : #include く suntool/sunview. h> 7 : #include く suntool/canvas. h> 8 : 9 : # i ncl ude ” smarknva. h ” SPARC LT プログラミング 85

7. 月刊 C MAGAZINE 1991年7月号

struct A a ; return &a のような場合てす。もちろん , pointer() 関 数からリターンしたとたんにスタックフレ ームが解放されてしまい , 不定な実体を指 すポインタを返すことになってしまいます。 参照を返す関数の場合も同じことてす。 16 : { 18 : } 24 : ) 33 : ( state. stat = InCharConst; きます。 ポインタて戻り値を返す場合 , 気をつけ なくてはいけないのは , 自動変数のアドレ スを返してしまうミスてす。たとえば , struct A { struct A * pointer( ) 76 : } 79 : { 83 : } return a ; struct A a ; しまうことになります。しかし , 不定な〃 これもやはり , 不定な実体の参照を返して うに初期化すればよいのてしようか ? のてしようか ? そして , いったいどのよ てす。これはいったい何を指すことになる うてす。 void (&function)( ) : のような宣言 文法的には , 関数への参照もありうるよ 関数への参照 ってくれるてしよう。 てあれば , 必ずコンパイルエラーとして扱 のて , よくてきた処理系 ( TurboC 十十など ) 実体への参照などというものはありえない struct A& reference( ) 関数への参照に関して厳密に規定してい プログラムの内容に入る前に , main( ) の 力するプログラムてす ( List 1 ) 。 は標準入力のタブをスペースに展開して出 -n(n = タブ数 ) のようにして , ファイルまた ルプログラムをあげてみましよう。 detab 今回まてに登場した機能を使ったサンプ d eta b 必要はありません。 の曖昧な仕様にいちいち目クジラをたてる ようてす。発展途上の言語なのて , この手 るのてはないか」という程度の意味しかない なら , 関数への参照というものも考えられ ん。現時点ては , 「関数へのポインタがある に取り扱うことのてきる処理系もありませ るドキュメントは見当たらないし , まとも LiSt 6 : 7 : 8 : 9 : 11 : 14 : 15 : 17 : 22 : 23 : 25 : 28 : 35 : 36 : 37 : 38 : 39 : 41 : 42 : 43 : 44 : 45 : 46 : 48 : 49 : 50 : 51 : 34 : 32 : void SwitchState(State& state, const char c) int ignore; Attrib stat; 27 : struct State ( 26 : enum Attrib ( 円 ain, lnString, InCharConst ) : putchar(' ' ) : for (int れ bl 囲 k = Rest(col, tabstop) : れ bl 聞 k 〉 0 : detab. cpp ( タブコンバートプログラム ) 1 : 〃 detab. cpp tab ー〉 s ce(s) converter 2 : 〃 $Log: RCS/detab.cpp 3 : 〃 revision 1.1 hirofumi 91 / 04 / 12 06 : 27 : 22 4 : 〃 lnitial revision 5 : 〃 include く stdio. h 〉 include く stdlib.h> include く string. h 〉 10 : #include く jctype. h> 12 : #define FALSE 0 13 : #define TRUE 1 inline int Rest(int C01 , int ね top ) return tabstop ー ( C01 % tabstop); 20 : void PutTab(int& C01 , const int tabstop) 十十 001 , —nblank) 52 : 53 : 55 : 62 : 63 : 64 : 65 : 69 : 75 : 77 : 80 : 82 : 66 : 68 : 56 : void DeTab(FILE* fp, int ね t 叩 , int isC) if ()p = の return : setvbuf(fp, NULL, —IOFBF, BUFSIZ * 8 ) : State state = PIain, FAISE } ; for (int c. co = 0 ・ (c = getc(fp)) ! = EOF; ) break; if (c = if ( ! isC state. stat = Plain) PutTab 81 , ね top ) : else putchar(c), C01 ← Rest(col, ね t 叩 ) : SwitchState(state, c); + + C01 : else 81 三 0 ; if (c = ) putchar(c); ) else ( 78 : li れ e int GetTab(const char* s = 0 , int min = 1 , int def ま 8 ) if (s = 0 atoi(s) く min) return atoi(s) ; 122 if (state. ignore) state. ignore = FALSE; else if (iskanji(c) Ⅱ c ー state. ignore = TRUE ・ else switch (state. Stat5 case Plain: if (c = ' state. stat = InString; else if (c = break; case lnString : if (c = state. stat = Plain; break; case InCharConst: if (c = state. stat = 円 ain; 1991 7 84 : 88 : 89 : 90 : 92 : 93 : 94 : 95 : 96 : 98 : 99 : 100 : 101 : 102 : 85 : int argc, char** argv) int ね t 叩 = GetTab(); int count = 0 : int isC = 駅囲 : while (—argc) if ( + + ar ま = ' ーっ isC = ! isC; else tabstop = GetTab(*argv); else return 0 ; DeTab(stdin, tabstop, isC) ; if (count = の DeTab(fopen(*argv, ” rt ” ), tabstop, isC), + + co t : C M AGAZI N E

8. 月刊 C MAGAZINE 1991年7月号

レジスタ変数 レジスタ変数は , 変数の領域をメモリて はなくレジスタに割り当てられた変数てあ り , 関数の引数と自動変数をレジスタ変数 とすることがてきる。レジスタ変数とする 場合は , 以下の形式によって記述する。 register データ型変数名 ただし , レジスタ変数とすることのてき る変数には , レジスタの個数の制限とレジ スタの長さの制限がある。使用てきるレジ スタの数内てあれば変数をレジスタに割り 当てるが , その数を越えたとき , 自動変数 と同様にメモリ上に割り当てられる。レジ スタの長さの制限とは , レジスタが 32 ビッ トてある場合 , 32 ビットより大きな型 ( たと えば , double) は定義てきないことになる。 レジスタ変数とすることがてきるのは , 変数てあり , 配列をレジスタ変数にはてき ない。初期化については , 自動変数と同様 てある。 関数の有効範囲 通常関数は , プログラム内てグローバル てある。したがって , 外部変数て extern 宣言 を必要としたように , 関数のプロトタイプ 宣言において , キーワード extern を指定す ることもてきる。 extern 関数の型関数名 ( 引数のリスト ) ; また , 関数に対して静的な関数を定義す ることがてきる。静的な関数とは , そのフ ァイル内てのみ使用て、きる ( 呼び出すことが てきる ) 関数となる。したがって , ほかのフ ァイルに同一名の関数が存在しても干渉さ れない スコープ ( グローバル ) 演算子 外部変数はプログラム内のすべての関数 て有効な変数て、ある。外部変数と同様の名 前の自動変数が存在した場合 , プロック内 ては自動変数が参照される (Fig. 6 ー① ) 。 のような場合 , 自動変数てはなく , プロッ ク内て外部変数を参照したい場合がててく 118 C MAGAZINE 1991 7 Fig. 6 スコープ演算子の参照 テータ型変数 1 : 関数の型関数名 1 ( 引数リスト ) テータ型 関数の型関数名 2 ( 引数リスト ) テータ型 ある。以下のように # define を記述するとプ C 十十のコメントを続けて記述しないことて 注意することは , # define を使用する場合に プリプロセッサの機能を使用する場合に 換えられる。 プロセッサによって識別子が文字列に置き ログラム内て , 識別子を使用すると , プリ の書式によって , 識別子の定義を行い , プ #define 識別子文字列 グラムに取り込むものてある。また , # define てあり , 指定されたファイルをソースプロ #include ”ファイル名 #include くファイル名 > る。したがって , #include の形式は , ある。これらは C 言語とまったく同様てあ のほかにも , #ifdef, #ifndef, # el などが り込みを行う #include, #define がある。 その代表的な機能としては , ファイルの取 てはプリプロセッサへの指示を記述する。 前に処理するものて , ソースプログラム内 サは , ソースプログラムをコンパイルする セッサの利用が可能てある。プリプロセッ C 言語と同様に C 十十においてもプリプロ プーロセッサ 外部変数を参照する (Fig. 6 ー② ) 。 ある。スコープ演算子は変数の前に置かれ , る。この解決として , スコープ演算子” : ・ " が リプロセッサは , 単純に識別子を文字列に 置換するためコンパイル時にエラーになる 恐れがある。 #define SIZE 100 / / ar ー size くプログラム > for(i=0 : i く SIZE; i 十十 ) { く置換後 > for(i=0 : i く 100 / / a 「 - size ; i 十十 ) { インライン関数は , C 言語のマクロ関数に ンライン関数 設けられた。 して , C 十十ては , 新しくインライン関数が て記述しなければならない。この解決策と は記述する際に , 置換されることを意識し このように , #define によるマクロ関数て れたりする恐れがある。 したり , 間違った処理としてコンバイルさ 際にコンパイルされる時点てエラーが発生 てある。 Fig. 8 のようなマクロ関数ては , 実 と。さらに , 処理全体をカッコて囲むこと 使用て , 引数をカッコて囲む必要があるこ いくつか注意が必要となる。まず , 引数の れる。 こて , マクロ関数を定義する際に よって置換され , 通常の処理として実行さ うに見えるが , 実際にはプリプロセッサに 呼び出して , 関数に処理を行わせているよ 7 のように , プログラムてはいかにも関数を て置換が行われるものてある ( Fig. 7)0Fig. の関数とは異なり , プリプロセッサによっ 義することがてきる。マクロ関数も , 実際 さらに , # define を用いてマクロ関数を定 とする。 const SIZE=IOO ; / / in 朸省略されている とするところを , #define SIZE 100 いる。たとえば , に本連載の第 1 回て解説した定数型をよく用 がって , C 十十ては # define を用いる代わり 時に識別子てのデバッグが行えない。した すべて文字列に置換されるため , デバッグ また , #deinfe を使用した場合 , 識別子が

9. 月刊 C MAGAZINE 1991年7月号

9 ) て、割り込みのチェーンを行っています。 この関数を呼ぶとスタックと各レジスタの 内容が最初に割り込みが起こったときの状 態に戻されて , 指定された割り込みハンド ラにジャンプします。したがって , スタッ クが深くなることはありません。 Turbo C/C 十十には chain intr 関数に相 当する関数がないらしいのて、 , 元の割り込 みハンドラをコール ( 実際はフラグをブッシ ュして far コール ) しています。そのため , TabIe 9 割り込みのチェーン chain intr 関数 ( MS-C ) # include く dos. h 〉 void chain intr ( handler ) void ( inte 「「 upt far * handler ) ( ) , sp, bp 44 C MAGAZINE 1991 7 また , MS-C< は chain intr 関数 (Table る場合には不可欠といってもよいて、しよう。 この機能は C 言語て TSR プログラムを記述す して記述されている点に注意してください いずれの割り込みも interrupt 型の関数と いため ) 。 がディレクトリの区切りとして \ を認識しな きなくなるのて注意してください ( 工デイタ おそらくエデイタのタグジャンプが利用て、 本ユーティリティといっしょに使用すると , ある方は挑戦してみてください 機能を持たせることも簡単なのて、 , 興味の どもこの割り込みを監視しています。この \ マークを \ に変更する TSR プログラムな なのて , 興味のある方は修正してください した。グラフィック VRAM への変更は簡単 るためと機種依存を避けるために省略しま すが , 今回は , プログラム自体を簡単にす どを使用すれば常駐サイズを小さくて、きま バッフアは EMS やグラフィック VRAM な 分以上のバッファリングが可能て、す。この は 1000h バイト確保していますから , 2 画面 けて、す。バッファリングのためのバッファ バッファ形式て、バッファリングしているだ AL レジスタて示される出力文字をリング 1 文字出力割り込み ( new ー 29 ) 動化も可能てす ) 。 終了てファイルをクローズする , という自 起動て、ファイル化を開始し , プログラムの ンクションを監視すれば , 外部コマンドの するといった用途が考えられます (DOS ファ 化を指示し , 終了時にファイルをクローズ たとえば , コンパイル開始前にファイル 用てきます。 の出力を自動的にファイル化する目的に使 て、 , バッファリングしている CON デバイス クション 01h ~ 0Ch 以外の使用が可能なの バックグラウンド割り込みては DOS ファン 用て , 現在は処理を何も行っていません。 バックグラウンド割り込みは将来の拡張 バックグラウンド割り込み ( new ー 28 ) の割り込みに多くの TSR プログラムが割り 込んて、いる場合には , スタックが深くな ってオーパフローする恐れがあります。 れを避けるには , ローカルスタックを設定 しなくてはなりませんが , ここては簡単に するために省略しています。ローカルスタ ックの設定については Part 2 て、説明しま す。 なお , Turbo C/C 十十て、 chain intr 関数 をインラインアセンプリ言語て、記述すると チェーンする割り込み八ンドラ 割り込み八ンドラの中から別の割り込み八ンドラ ( han 引 e 「 ) を起動する 後続の割り込み八ンドラ ( handler) を呼ぶ前にスタックと各レジスタの内容が最初に割り込 みが起こったときの状態に戻される TabIe 10 割り込みべクタの取得 dos getvect 関数 ( MS-C ) # include く dos. h 〉 void ( interrupt far * dOS getvect ( intnum ) ) ( ) , unsigned intnum 取得する割り込みべクタ intnum で指定した割り込み番号の割り込みべクタの設定値を DOS ファンクション 35h を実 行して取得する getvect 関数 ( Turbo C/C 十十 ) # include く dOS. h 〉 void interrupt ( * getvect ( intnum ) ) ( ) int intnum 取得する割り込みべクタ intnum で指定した割り込み番号の割り込みべクタの設定値を DOS ファンクション 35h を実 行して取得する void -chain-intr( void ( interrupt far *inthdl ) ( ) ) 1 : #include く d0S. h> List —chain—int 「関数 (Turbo C/C 十十 :chainint. c) 3 : 5 : 7 : 8 : 9 : ー 14 : ー 20 : ・ 21 : } asm asm asm asm asm asm asm asm asm asm asm asm asm asm POP POP mov mov POP mov xchg PO P POP POP POP POP POP POP bx, word ptr inthdl xchg [ bp + 0X10 bx, [bp + 0x0e d i S ー bp bp d i S ー ds dx CX ax,word ptr inthdl+2 / * チェーンするアドレス * / em i t ー ( 0xcb ) : / * チェーンするアドレスをスタックに積む * / / * retf * /

10. 月刊 C MAGAZINE 1991年7月号

CMAGA プログラミング添削 セミナ—J レ—L アドバイサー / 柴田望洋 第 11 回 文字列編集入力関数 プロのプログラマを目指す川原淳男さんのプログラムを題材にして , 関数設計 手法やライプラリ仕様の決定などについて解説します。 ライプラリと自作ライプラリの使い ■キーボード日 OS 分けなどを教えてほしい ( 3 ) ふたつのバージョンを作成したが , ひとつのバージョンは一部の FEP て、 川原さんのプログラムの一部を List 1 に示 動作しない。今後のアプリケーショ します。川原さんのプログラムは画面に枠 ン作成時にはどちらが適しているか ? を表示して , その中て、文字列を自由に入力 するものてす。曰 , 曰 , , 四キー とのことてす。 なお , 前号て、菊間かんなさんのプログラ などに対応しています 0MS-DOS 上ては scanf ムを題材にして解説をつづけると予告しま を使用しても四キーしか使えません。した たが , キー処理などの共通点もあることか がって , とても操作感が向上します。 ら川原さんのプログラムを取り上げました。 川原さんのプログラムはポリュームもあ ご了承ください。かんなさんは現在別のプ り , 力量を感じさせるものてす。と同時に ログラムに挑戦中とのことてす。 いくつかの点て、根本的に抜けているものが 川原さんのプログラムの一部 ■添削のポイント 今月のプログラムプロフィール 作者 : 川原淳男 ( 兵庫県川西市 ) プロのプログラマを目指す川原さんの プログラムです。 C 言語を始める以前は アセンプラをやっていたそうなので , そのプログラムには力量を感じるもの の , 根本的な欠点を内包したプログラ ムとなっています。 List 川原さんはキー入力された文字を 1 行内に 表示する関数を作成中て、す。これは曰 , 曰 , , 四キーなどに対応したものて す。わかりやすくいえば 1 行内で文字列を自 由にエディットする関数だといえます。川 原さんの質問をまとめると次のようになり ます。 ( 1 ) , キーの対処を行ってい ないがいいか ? ( 2 ) 以前アセンプラをやっていたのて , アセンプラ的発想てプログラムを組 んており , 処理系に付属のライプラ リもあまり使わない。処理系付属の 134 C MAGAZINE 1 1 7 リり叮りに一い ~ 」いいに一いい 0 い叔にいにーりりいにに」リい」ににに ( 叮い ) らいいいに一い一リりいに ( リリい ~ をー 1 : / * キー入力 & 文字表示ルーチンプログラム CPR INT 1. C 2 : コンパイラ : Turbo C 2. 0 by 川原淳男 ( 90 / 12 / 14 ) 使用機種 : PC ー 9801 RX2 3 : 5 : 6 : #include く dos. h 〉 7 : #include く string. h> 8 : #include ” Ycprint1. h ” 9 : 10 : / * 入力文字の表示 * / : カーソル位置 11 : / * cn . 最大文字数 ( 全角文字は 2 文字 ) max : T ー V R A M に転送する文字のタイプ ptype : T ー V R A M 上にある文字のタイプ 14 : gty pe 1 パイト文字 ) kanj i f lag : 漢字フラグ ()N : 2 バイト文字 , OFF : : 文字コード ( 1 バイトコード・ 2 パイトコード兼用 ) COde : 文字コード ( 2 バイトコード専用 ) * / byte 19 : vo id KeyC0deCheck ( )