変数 - みる会図書館


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

1. 月刊 C MAGAZINE 1992年5月号

ーシステム・ワン lnformation from Compiler Makers 13 : } : Power C Ver. 2.0. J Power Ctrace す。 構造化されたテータを扱う プログラムの 効果的なテパッグ C の変数には , 通常の変数 ( 単純 変数 ) のほかに構造化された変数 ( 構造化変数 ) があります。構造化 変数としては , 配列 , 構造体 , ポ インタ , そしてそれらを組み合わ せたものがあります。 これらの構造化変数は , 外部か ら見れば単純変数と同様に扱えま すが , 内部に立ち入った場合には 個々の要素に対応しなければなり ません。 Power Ctrace を使用すれば , 変 数ウインドウにより使用中の変数 についての情報を詳細に得ること 変数の表示と属性 が可能てす。 以下に示す 6 個の項目カ俵示されま するものて , 変数ウインドウては 選択されているウインドウに関連 この右側に表示される情報は , ウが選択されていることを示して しており , [var] は変数ウインド は選択されているウインドウを表 ンとなっています。 [ ] 内の 3 文字 画面の最上部はステータスライ 応じて自動的に表示されます。 いる変数の情報が , その変数型に 変数ウインドウては現在使用して ている値が表示されます。なお , 示され , 右側には変数に格納され 画面の左側には変数の名前が表 た場合の画面てす。 起動して変数ウインドウを選択し ンパイルした後 , Power Ctrace を Fig. 1 は List 1 のプログラムをコ Fig. 1 変数ウインドウでの表示 展開レベル 0 ( 初期状態 ) 1. 変数の記憶クラス 2. 変数の符号つき / なし 3. 変数のデータ型 4. 変数のサイズ 5. 変数のアドレス 6. 表示の拡張レベル として表示されます。画面のほば 純変数と同様に 1 行にひとつの変数 初期画面ては , 構造化変数も単 表示レベルの展開 / 収縮 ついて得ることが可能てす。 することにより , すべての変数に , ロキーによりカーソルを移動 報てす。この変数情報は , 囮キ ルがある位置の変数に関係した情 このうち最初の 5 項目は , カーソ pointer struct array 中央に表示されている , となっています。 なお , 展開は 15 レベルまて可能 はありません。 数 c, i, 1 は , 単純変数なのて変化 されています。これに対して , 変 造体 , そのメンバという順に展開 例題ては , 変数 table が配列 , 構 態が表示されていきます。 とに 1 レベルずっ展開され , 内部状 使用します。曰キーを押下するご その内部状態を見るには曰キーを そこて構造化変数を展開して , て代表しています。 合は , その構造化変数のアドレス 示すことはてきないのて , この場 ています。構造化変数の値を 1 行て 造体 , ポインタてあることを示し などは , 変数がそれぞれ配列 , 構 0 main 展開レベル 1 : .0 main table 0 main 展開レベル 2 table [ 3 ] table [ 2 ] table [ 1 ] table 工 0 」 table [ 3 ]. st 「 ing table [ 3 ]. value table [ 2 ]. string table [ 2 ]. value table [ 1 ]. st 「 ing table [1]. value table [ 0 ]. string table [ 0 ]. value 16 827d ar 「 a ↓ tvarr 部 tQ ↓ Stru Ct St 「 uct Struct struct jrvarJ 270 名 27d 1 2 autO 0 ー signed poi nter pointer poi nter poi nter int 2 123 @0X827d 123456 123 @0X8289 @0X8285 @0X8281 ⑥ 0X827d 123456 123 ” VWXYZ ” 4 ” OPQR ” 3 2 ” AB ” 1 123456 2 : 3 : 5 : 6 : 9 : 14 : 15 : 11 : TABLE 10 : long i nt 8 : char VOid 構造化された変数を使用した例 List 1 4 : } TABLE : char *string i nt value 1 : struct { main( ) = 123 ; 1 = 123456 ・ tableC ] { 4 , ” VWXYZ ” ) / * 操作部分のプログラムは省略してある。 return lnformation from Compiler Makers 159

2. 月刊 C MAGAZINE 1992年5月号

な , ある人の身長を保存するためのものな さて , あと集めるものはないて、しようか ? 平均の計算方法は知っていますね ? 全 のて、す。 員分の値を合計して , 人数て割る。たとえ 関連のあるもの , まとめて扱ったほうがい ば 3 人の身長をそれぞれ a, b, c とすると , 平 いもの , 離しておいてはいけないものはあ 配リを使って集める ・・・ありました。「名前」て、 りませんか ? 均の身長は , ( a 十 b 十 c ) + 3 となります。 3 人 す。「太郎」 , 「花子」 , 「三郎」という名前と , の身長の数字を標準入力から取るとすると , 変数 height [ 0 ] , height [ 1 ] , height [ 2 ] 関連したものを集めると便利て、すから , プログラムは List 1 のようになります。整数 この三つの変数を集めてやることにします。 の範囲て、計算していますから , 平均 172.3 の は深い関連があります。わかりますね。変 C 言語には変数を集める機構が備わってお 数 height [ 0 ] にはほかの誰て、もない「太郎」 ところが 172 になりしますが , よしとしまし り , そのひとつが配列て、す。配列を使って くんの身長が入ります。「太郎」という名前 と変数 heightC0] ( 正確にはその添字の 0 ) は さて ,List 1 はこれていいのて、すが , どう 問題 1 を解いてみましよう。 いっしょに扱ってしかるべきて、す。だって もやばったい感じがします。そのひとつは , それが List 2 になります。先ほどの三つの 名前と身長は共通のひとりについての情報 変数はなくなり , それをまとめたひとつの 三つの変数 , なのて、すから。 配列 , taro height height [ ] こて 3 名の添字として , hanako height が登場しました。この配列は人の身長を集 #define TARO 0 saburo height にあるような気がします。今は太郎 , 花子 , めたもの , つまりこの配列の要素はすべて #define HANAKO 1 人の身長て、すから , この変数名は妥当て、す 三郎の 3 名の身長が関連するのだから , 三つ #define SABURO 2 として , heightCTARO ID] などとしては の変数を用意するのは自然て、す。けれども ね。太郎やら花子といった個人名は消え , し問題が太郎 , 花子 , 三郎の 3 名だけてな 身長 (height) という共通部分だけが配列変 ダメて、す。これて、は taro height とまったく 数名に反映されているわけて、す。ふむふむ。 変わらなくなってしまうからてす。これて く , 四郎 , 五郎 , 六郎・・・・・と多くの人のデ ータを処理するようになったとしたらどう 身長の平均を求める て、しよう。そのつど , siro height go 「 0 height rokuro height と変数を追加していくのて、しようか ? れはいかにもまずそうて、す。 いまの三つの変数の名前をよく見てくだ さい。すべて height を共通に持っていま す oheight とは英語て、身長のことてす ( ヘイ トてはなくハイトと読んて、ください ) 。この 名前は , 三つの変数がすべて身長を表すこ とを , プログラムを読む人にわかるように つけたものてす。 ん ? いま何かたいせつなことをいった ような気が・・・・。「三つの変数がすべて身長 を表すものてある」 ? そう , そうて、す。 つの変数 taro height, hanako height, sab uro height は , まったく関連のないバラバラ な情報を保存するものて、はありません。み List 1 : #include く stdio. h 〉 2 : #include く stdlib. h> 4 : int taro_height : 5 : i nt hanako—he i ght : 6 : int saburo_height ; 7 : int average_height; 8 : 9 : main() 10 : { 11 : #define BUFFER 256 buffer[BUFFER] ; 12 : Char puts ( ”太郎の身長を入力してください。 14 : gets(buffer) ; taro—height = atOi (buffer) ; puts ( ”花子の身長を入力してください。 18 : gets (buffer) ; 19 : hanako—height = at0i (buffer) : 20 : puts ( " 三郎の身長を入力してください。 22 : gets (buffer) ; 23 : saburo—height = atOi (buffer) : 24 : 25 : (taro—height + hanako—height + saburo—height) / 3 ; 26 : average_he i gh t printf(" 平均身長は Xd です。 }n", average_height) : 28 : } 64 C MAGAZINE 1 2 5

3. 月刊 C MAGAZINE 1992年5月号

LlSt 3 ある人の身長を表示したいときには , プロ グラマがわざわざ , printf("%d", 名前 height) ; と書かなければならないのて、す。全員の身 長を扱いたいときには , 全員分の 名前 height を書かなくてはいけません。誰が書くのて、 しよう ? もちろんプログラマが書きます。 プログラマが直接プログラムを書く必要 があることに注意してください。コンパイ ラやコンパイルされてて、きたプログラムは , " 名前 height " という変数名の " 名前 " の部分 が人の名前を表すなんてことは知らないの 0 1 よりムっ 0 一 4- LD れ 0 ロー 8 00 00 00 っ 0 00 00 っ 0 り 0 sum = 0 ; for (i = 0 ; i く MAX_PERSON; i + + ) { sum + = person[i]. height; average_height ニ sum / MAX_PERSON ; printf(" 平均身長は Xd です。 *n", average_height) ; List 配列のような構造体 1 : typedef struct { 2 : int taro; int hanako; 3 : int saburo; 4 : int siro; 5 : 6 : int goro; int rokuro; 8 : } HEIGHT; 9 : 10 : typedef struct { int height0 ; 11 : int heightl; 12 : int height2 ; int height3; 14 : int height4; 15 : int height5; 17 : } HIDOI; 添で管理する List 2 て、は各人の身長は , 配列 height [ 人の番号 ] に格納されていました。配列は添字で管理 するのて、 , ひとりひとりに番号がつけられ ことになります。 ある特定の人の身長を扱いたいときには , やはりプログラマがその人の ( 名前て、はなく ) ムは heightCi] と書かれていれば , i 番目の す。そう , メモリは壮大な配列というわけ 番号を知っていていなくてはなりません。 て、す。 C て、は Ci] と書かずに * i と書きま 身長を扱ってくれるのて、す。これは単純な 花子さんが 1 番だとすれば , 花子さんの身長 す。このときの i はポインタと呼ばれます。 変数を使うより確かに進歩しています。 を表示するためには , ちょっと道草をします ( 誤解の恐れがある メバ名で管理する のて、この段落は C 言語初心者は読んて、はいけ printf ("%d", height [ 1 ] ) ; ません ) 。配列変数も単純変数と同じく名前 と書かなくてはなりません。 List 3 て、は , 各人の身長は , 変数 を持っています。つまり , 単に CiJ と書く 配列を使っていて助かるのは , 全員分の person [ 人の番号 ]. height のて、はなく , height [i] と書いています。 身長を扱うときて、す。先ほどのように , プ に格納されています。この例て、は構造体の これはなぜて、しよう。 ログラマがいちいち書かなくても , 繰り返 配列が使われているのて、 , 添字が登場しま 簡単なことて、す。配列はプログラム中に しの構文を使って , すが , 構造体のところに目をとめると , ひとつだけて、はなく , 複数個ある可能性が for (i 0 ; i く MAX PERSON 人を表す変数 . height あるからて、す。だからそれらを区別するた i 十十 ) { に身長が格納されていることになります。 height [i] を使った計算 めに変数名がついているわけて、す。おっと , もちろん名前は , これはテーマ「分ける」の予告編て、すね , お 楽しみに 人を表す変数 . name とすればいいからて、す。配列の要素は番号 て、すね。 て、管理されているのて、 , その番号を 0 , 1 , 2 , もっとも , C て、は文法違反て、すが単純に [ i ] 今度は , 名前さえもプログラムが扱うこ ・・と変化させてやればよく , それはプロ と書きたくなるときもあります。このとき とがて、きるようになっています。名前が " 花 グラムにもて、きることなのて、す。プログラ の i は添字て、はなく , アドレスと呼ばれま 66 C M AGAZINE 1 的 2 5

4. 月刊 C MAGAZINE 1992年5月号

ea e で s , 録の djgcc が必要なのて、すが , 1 月号 っかりとバグ取りしてから使って として環境変数で必要な分の環境 ☆現役 発売の時点てすてに 10 月号は在庫 くださいね。 用のメモリを開放します。 3 月号の増田さん。うちでも古い P 切れの状態て , 入手は困難になっ たとえば , 環境変数で、、 ENV= ☆「環境用のメモリ」っいて ていたようてす。 C マガジンの購入 C ー 9801E は , ほかの機種とともに現 ABCD" と設定する必要があるプロ 役でがんばっています。その理由 グラム PROGRAM というアプリケ はお早めに願いますにつ。 3 月号の「環境用のメモリ」の質問に は , ①歴代 PC ー 9801 シリーズ ( 無印 ついてですが , MS-DOS の COMM ーションを実行するバッチファイ ☆心、太 から DA まで ) の中で「電源容量」が ANDO.COM にも ,/E : オプション ルは次のようになります。 ベスト 3 に入る ( →大容量のポード あのお・・・・・・十三里半はわかったん があります。設定の方法は , CON SET DUMMYI= に対して安全 ) 。② FDD が前面にな ですけど「心太」ってなんですかあ ? FIG. SYS 中で , SET ENV=ABCD いので逆向きに置くと拡張スロッ 十三里半って九里四里うまい・・・・・ SHELL= COMMAND.COM PROGRAM ト ( 6 スロット ) がユーサ側に置ける ですよねえ。でも地方によっては , /E く size> 子プロセスを終了すると , 子プロ ( スロット型リムーハプル HDD を使 と指定すれば指定した環境用メモ 九里に足りないんで八里っていう セスの環境変数などはすべてクリ うと PC ー 9801FA のように HDD を抜 ところもありますよオ・・・ リが確保されます。しかし , 村上 アされますが AUTOEXEC. BAT で き差しできる ) 。③スピードが遅い 小池英之 ( 岐阜県 ) さんの質問だと FD から起動されて 設定した環境変数は , そのまま残 のでアセンプラでのデバッグに便 小池さん以外にも , 「十三里半 いるようなので少し工夫が必要で っているので環境変数をわざわざ 利 ( 何をしているかわかりやすい ) 。 ( サツマイモのこと ) 」はわかっ す。 CONFIG. SYS の SHELL 文で , 元に戻す必要はありません。ただ 佐伯俊也 ( 京都市 ) /E : 512 と設定し AUTOEXEC. BA たけど「心太 ( トコロテン ) 」はわか し , ーっ難点があって環境変数を T で環境変数 DUMMY を仮に設定 最新機種てなくても十分な場 らないという方がかなりいらっし 設定する BAT ファイルには必ず 合はけっこうありますからね。 する方法です ( Fig. 1 ) 。 Fig. 1 中の トコロテンは地方に やいました。 SET DUMMYn= という一文を追加しなければなり 大切に使ってやってください。し よって食べかたも違うようて、すし , 、、 # ″の個数が 116 個というのは MS ひょっとして「心太』という表記 かし , PC ー 9801E を使用する理由の ー DOS のコマンドラインに入力でき ません。 Ke-yu (NIFTY-Serve) ② , ③は普通はデメリットに入る る文字数が 127 文字のためです。子 は全国て、通用するものて、はないの ' 91 年 3 月号本コーナー村上敦 項目てすが , 使い方と目的によっ プロセスを起動するときに環境変 彦さんの質問に対する回答は かな ? 暑いときには , よく冷え てはメリットになるのてすね。 たトコロテンが最高て、すよね。 数はそのまま引き継がれますから Ke ー yu さんのほかにも , たくさんの 子プロセスで環境変数が必要にな 方からいただきました。ありがと ☆毎月買います ! ☆やさしい先生 ったときには , うございます。代表として Ke-yu さ 今までは目次や特集を見て買って 私の研究室の先生は , 解析用のプ んからの回答を紹介させていただ SET DUMMYI= いましたが , 最近バックナンバー ログラムができあがるまでは「まだ きました。村上さん , ぜひお試し (SET DUMMY2=) がほしくなり , しかも手に入らな できないの ? 」というのに , 版が (SET DUMMY3=) いことが多い。「あの時買っていれ できあがって Bug ー Fix をしていると Fig. 1 環境用メモリを確保するための CON 日 G. SYS と AUTOEXEC. BAT 例 ば・・・・司なんて思ったりして。そこ 「コンピュータばかりさわっていな CONFIG. SYS で , これからは毎月買うことにし いで実験しろ ! 」というやさしい人 SHELL:A : .COM/AND.COM A : \ /P /E : 512 ました。だから , 付録ディスクに です。こんな私って・・・ FlLES:25 BUFFERS=20 もよいソフトを入れてください ( わ 先生に恵まれた学生 ( 京都府 ) がままやなあ ) 。 プログラムのバグによる誤動 AUTOEXEC. BAT ECHO OFF Marbow ( 大阪府 ) 作はこわいて、すよね。まして , PROMPT $P$G PATH=A : \ : B : \ 解析用のプログラムとなると見か 弊誌のバックナンバーは , 意 SET DUMMYI : # # # # # #.. SET DUMMY2:######.. けだけは正常に動作しているよう 外に早く在庫切れになるよう SET DUMMY3=######.. に見えても出力データの信頼性は てす。たとえば , ' 92 年 1 月号付録の SET DUMMYn:######.. 無に等しくなってしまいます。し djgpp の実行には , ' 91 年 10 月号収 160 C MAGAZINE 1992 5 個個個 ( 0 6 6

5. 月刊 C MAGAZINE 1992年5月号

lA>Icc listl . c lld @link.i A>list1@ 半径 ? 6.8 半径 6.8 の円の面積は 145.267 です。 A>Iist10 半径 ? 123 固 実数の種類と LSI C ー 86 での有効桁数 ラによって違います。 版での精度 ( 有効桁数 ) で , これはコンバイ この表の右欄は , 4 月号付録の LSI C ー 86 試食 C 言語には次の 3 種類の実数があります。 実数の種類と有効桁数 コラム 半径 123 の円の面積は 47529.2 です。 float 型 ( 単精度 ) doub 厄型 ( 倍精度 ) long double 型 ( 長精度 ) Fig. 1 listl. c のコンバイルから実行まで 実践 C プログラミング入門 101 6 桁 桁 円桁 この最後の long double は , 新しい C 規格 (ANSI C ) で追加された型で , 従来の UN Ⅸ 1 cc にはありません。 6.8 と尋ねてきます。半径をたとえば main ( ) の次の中力ッコ { ・・・・・ } の中身 ( 5 についてはあとて、詳しく述べます。 は , 以下て使う円周率 PI の定義てす。これ #define 円 3.141592653589793 て、始まっています。 2 行目の #include く stdiO. h > の準備のオマジナイ List 1 のプログラムは , 例によって入出力 行が終了します。 のように打ち込むと , 面積が出力され , 実 ・・・ⅱ stl . c をコンノヾイル (LSI C ー 86 の場合 ) ・・・うまくコンバイルできた ・••listl . exe を実行 ・・・半径の入力 ・・・・出力 もう一度実行してみる ・・・今度は小数点以下のない数 ・・・ちゃんと計算できている コラム scanf の入力指定 ( とりあえず ) つを覚えてください。 scanf の入力指定では , とりあえず次の四 scanf の入力指定 doub 厄型 ( 実数 ) float 型 ( 実数 ) long 型 ( 整数 ) int 型 ( 整数 ) 行目から 11 行目 ) がプログラムの本体てす。 です。 「 %旧は long float( 長い float 型 ) が語源 ちなみに , 「 % d 」は decimal ( 進法 ) , 実数にも何種類かあり , これは doub 厄型の 命令 doub 厄を使っています。詳しくいうと , 使いましたが , ここては実数の変数を作る 前回は整数 ( int 型 ) の変数を作る命令 int を ね。 値を仮に保管しておくために使うのて、した とは電卓のメモリ機能のようなものて , 数 ふたつの変数 r , area を作る命令て、す。変数 とありますが , これは実数を入れるための double r, area , 5 行目に 践 C プログラミング は 7 行目の て、非常に大きな値や小さな値を出力すると printf ("%g", なお , う合図てす。 はプログラムの実行が正常に終了したとい return 0 , 最後 ( 11 行目 ) の g> にします ( コラム printf の出力指定参照 ) 。 ( int 型 ) て、は < % d > て、したが , 実数て、はく % 号て、したね。数値を埋め込む部分は , 整数 て、出力します。く \ n > は改行するという記 ( 2 か所 ) にそれぞれ r , area の値を埋め込ん というメッセージの中の <%g> のところ 半径 % g の円の面積は % g です。 *n printf(" 半径 %g の円の・・・・・・ ) ; 10 行目の したね。 算の記号はく x > て、なく < * > とするのて、 の変数に入れます。コンヒ。ュータて、は掛け の計算をして , 結果をく area > という名前 3.14 X r X r 9 行目て、 ( コラム scanf の入力指定参照 ) 。 % げの部分は変数の型によって変わります 名に & をつけるのを忘れないて、ください は , そのまま覚えるしかありません。変数 scanf("%lf", & 変数名 ) ; この入力命令 てキーを押すと , 6.8 が変数 r に入ります。 ボ、一ドから何か数値 , たとえば 6.8 を入力し す。キー入力待ちの状態になるのて、 , キー は , r の値をキーボ、一ドから入力する命令て、 scanf("%lf", (r) ; 8 行目の と出力する命令て、す。 半径 ? は , 画面に printf(" 半径 ? " ) ; 種類と有効桁数参照 ) 。 実数の変数を作る命令てす ( コラム実数の 指数表示になります。 たとえば 3 .14159e 十 06

6. 月刊 C MAGAZINE 1992年5月号

Fig. 6 typedef の内部表現 Cha 「 256 typedef String typed ef 配列 Cha 「 256 (b) typedef char Cha 「 256 [ 256 ] : (a) typedef char * String : この b の置換に注目してください。変数 b ろが , ANSI 規格て、は typedef 名を変数名や は「 t 型のパラメータ t を受け取る t 型を返す関 の型は「配列へのポインタ」になります。カ 関数名として使用することが許されていま 数 t 」てす。 ッコによって * のほうが先に b と結合するた す。つまり , もちろん , typedef 名自身の宣言と , type め , b はポインタになるのて、す。もしもカッ def 名と同名の変数や関数の宣言が同じスコ typedef int t ; コがなければ char *b [ 256 ] となって「ポ という typedef 宣言があるときに ープにあってはいけません。それは再定義 インタの配列」になってしまいます。ここて t t ; / * int 型の変数 t の宣言 * / 工ラーになります。したがって , typedef 名 ひとつ注意しなければならないことがあり を再定義するときには List 2 のように内側の あるいは , char t ; / * char 型の変数 t の宣言 * / プロックてしなければなりません。 ます。それは const ( または volatile) をつけて , このように名前が現れる場所によってそ のようにして変数 t を宣言することがてきる const String x ; としたときの解釈てす。これは const char のてす。 れが typedef 名なのか識別子なのかが決定さ *x, つまり「定数の ( 変更て、きない )char へ これはどういうことかというと , 宣言の れるというのては , コンパイラは名前の種 のポインタ」のように見えるかもしれません 中て、型指定子が現れた時点て、 , typedef 名は 類を決定するのに苦労します。 yacc< はち が , 実は違います。 String によってすてに ふつうの識別子として扱われるようになる ゃんと定義てきないんじゃなかろうカ 「 const て、ない ( 変更可能な ) char へのポイン のてす。 ブップッ ( というわけて , 某社の C コンパイ タ」て、あることが決定されています。 t t ; の場合 , 最初の t は typedef 名てすか ラては typedef 名の再定義は実装されていま したがって , x が const てあることになり , ら型指定子て、す。これが現れた時点て , も せん。以上 , いい訳てした x の型は「 char への定数の ( 変更てきない ) ポ はやほかの型指定子は現れることはてきま この t t ; という宣言時に t が typedef て、は インタ」になります。 List 1 のプログラムを せん ( 現れたらエラーてす ) 。 なく , コンパイルすると 13 行目てエラーが報告さ したがって , 次の t は型指定子てはなくて #define t int 変数名となります。 char t の場合も同様て というふうに定義されていたらどうなるて れるはずてす。 す。 しようか。プリプロセッサはプログラム中 typedef 名の再定義 もっとヘンな例は , のすべての t を int に置き換えようとするの て , t t ; は int int ; と変換されてしまい typedef された名前は型指定子てす。とこ て、す。どういう宣言かわかります力 答 ェラーになります。 98 C MAGAZINE 1 2 5 靄

7. 月刊 C MAGAZINE 1992年5月号

typedef 名 C 言語雑学講座 ☆回 乗松保智 前回はコンバイラ内部における型情報の表現について説明しました が , 少々説明不足の部分がありました。とくに typedef に関してで す。そこで今回は typedef についてより詳しく説明します。 Fig. 1 変数・関数の宣言 typedef を使った宣言 typedef 名とは , その名のとおり , キーワ ード typedef を使って宣言された識別子のこ とて、す。 C 言語ては , 一般的には Fig. 1 のよ うにして変数や関数を宣言しますが , 記憶 クラス指定子として typedef を使ったときに はそれは型の宣言となります。 Fig. 2 は typedef による型の宣言の例て、 す。 char は 1 バイト , short は 2 バイトと仮定 すると , それぞれ BYTE は 1 バイトのデータ 型を , WORD は 2 バイトのデータ型を示すこ とになります。この typedef 宣言以降 , BY TE と WORD は型指定子として使用すること がて、きるようになります。 typedef 名を使った宣言の例を Fig. 3 にあ げます。このような宣言としてみなさんが もっとも見慣れているのは , FILE *fp , という宣言て、しよう。 FILE 型はファイルを 表現するための構造体て、 , ヘッダファイル < stdio. h> の中て、 typedef 宣言されています ( 実装によっては # define されている場合もあ ります ) 。 short int x; / * 静的変数 * / static / * 外部変数 * / char *p ; extern void f00 ( ) ; / * 外部関数 * / extern Fig. 2 typedef による型の宣言 typedef uns igned char BYTE; typedef uns igned short WORD; / * BYTE 型の宣言 * / / * WORD 型の宣言 * / Fig. 3 typedef 名を使った宣言 BYTE b; BYTE *bp ; WORD foo(BYTE x) ; / * BYTE 型の変数 b の宣言 * / / * BYTE 型データへのポインタ変数 bp の宣言 * / / * WORD を返し、 BYTE 型のパラメータを * / / * ひとっ取る関数 f00 の宣言 Fig. 4 日 LE 型の宣言の例 (a) #define による宣言 struct file ( int fd; Char *base; / * file descriptor / * location of buffer / * その他 #define FILE struct file (b) typedef による宣言 typedef struct { int fd; Char *base; FILE; typedef と #define 先ほど , FILE 型は実装によっては #defin e されていると書きました。つまり Fig. 4 (a) 96 C MAGAZINE 1992 5 / * file descriptor / * location Of buffer / * その他

8. 月刊 C MAGAZINE 1992年5月号

Fig. 8 旧 M ー PC 互換機の場合の設定値 2 7 6 5 バ ストッ 0 0 0 1 10 偶 数 リ ヒット長 0 0 1 150 0 1 0 300 リ イ ァ あ 0 1 1 600 1 2 1 0 0 1200 1 0 1 2400 1 1 0 4800 1 9600 例 -sff : 9600 ホー , 8 ビット , 偶数バリティ , 2 ストップビット -se7 : 9600 ボー , 8 ピット , ノヾリティなし , 2 ストップビット ー S83 : 1200 ボー , 8 ビット , バリティなし , 1 ストップビット ー S43 : 300 ボー , 8 ヒット , バリティなし , 1 ストップビット ートに追従しようとするモードて、す。 PC ー 9801 シリーズて、は , 逆スクロール機能 が無効の場合は 38400 ポーまて追従しま す。逆スクロール機能が有効の場合は 19 200 ボーまて、追従します。 Fig. 7 PC ー 9801 シリーズの場合の設定値 76 32 ストップ 偶 ノヾ テータ 数 リ ピット長 ビット長 リ イ ぁ 1 0 7 1 0 1 .5 ァ 1 例ー sfc : 8 ピット , 偶数パリティ , 2 ストップピット ー scc : 8 ビット , バリティなし , 2 ストップビット ー s4c : 8 ビット , バリティなし , 1 ストップビット ビット長 1 0 7 0 X 制御有効 半ニ重 ( 12 ) = P くバターン > 次の環境変数にセットされたエデイタを 大文字の一 P て、はくパターン > て、指定され 起動します。 た文字列を送信し , 送信後最大 60 秒間受信 ED 灯工デイタファイル名 ( デフォルト : SET EDIT=MIFES. EXE) 待ちを行います。 EDOPT 工デイタオプション ( 13 ) ターミナルモードー = ( デフォルト : SET EDOPT=) ファイル名を指定しない場合 , ターミナ COMMAND.COM を起動します。 ルモードに移行します。ターミナルモード は基本的に筆者が通信関係のテストを行う ポーレートを変更します。 ログファイル ON / OFF を切り換えます。 ために作成したモードて、す。 ログファイルは受信中のデータを格納す したがって , 機能はあまり豊富て、はあり PC ー 9801 シリーズて、 SWITCH コマンドを るファイルて、す。 ません。 実行します。 ffh, 75h の 2 バイトを受信すると , 次の環 逆スクロールバッフアをファイル化しま 境変数て、指定されたコマンドを起動します。 ファイルを XMODEM て、送信します。 TEXEC 外部コマンドファイル名 す。 SHIFT 十囮 TEXSW 外部コマンドオプション ファイルを XMODÉM て、受信します。 外部コマンド終了時に再初期化を行います。 RS ー 232C のモデムラインをモニタする機 能て、す。 ( 14 ) ターミナルモードのファンクション ファイルを YMODEM て、送信します。 高速ターミナルモードに移行します。通 ファイルを YMODEM て、受信します。 常のターミナルモードて、は 19200 ボ、一以上 工コーバック ON/OFF と CR/LF モード のポーレートては表示が追いつかないた ()R を CR 十 LF とみなすモード ) ON / OFF ファイルを無手順て、送信します。 め , そのうちに受信バッフアが溢れてし を切り換えます。 まいます。高速ターミナルモードは表示 ファイルを無手順て受信します。 に制限 ( たとえば , ESC シーケンスを処理 送信プロックサイズ ( 128 1024 ) を切り換 ・ (End) しない ) をつけて 19200 ポー以上のポーレ えます。 56 C M AGAZINE 1992 5 ターミナルモードを終了して , DOS プロ ンプトに戻ります。

9. 月刊 C MAGAZINE 1992年5月号

日本語 C システム「 JJ 」 プログラムとドキュメントの整合匪を取る。 これは意外と困難な作業です。しかし , プロ グラム自体がドキュメントを兼ねれば , 保守 管理は向上します。ここでは日本で記述する C システム「 JJ 」を紹介します。 一三ロ JJ のサンプルプログラム 双曲線正弦関数を求める 1 このプログラムは双曲線正弦関数を計算するもので、日本語 C システムで書かれている。 2 双曲線正弦関数は次のように定義される。 s i Ⅱ h ( x ) この式を直接計算してもよいのだが、 こでは指数関数がないも のとして、テイラー展開を用いて計算する。双曲線正弦関数のティ ラー展開の式を以下に示す。 s i れ h ( x ) = x 十 3 双曲線関数の関数名は s i れ h とする。この関数は実数型の変 数 x を入力とし、実数型の値を返すものとする。処理はテイラー展 開の部分のみである。 ※《双曲線正弦関数のプログラム※》 = # 取り込み <jjstdio. h> # 取り込み <jjmath. h> ※《ヘッダー※》 ※ ( 実数型 sinh( 実数型 x) ※ ) ※《変数の設定をする※》 ※《テイラー展開の処理※》 変数を設定をするでは「答え」という実数型の変数を 0 . 0 で初 期化して用意する。この部分は s i n h の中に展開される。 ※《変数の設定をする※》 * 実数型答えは 0.0 とする。 4 テイラー展開の式はそのままの形で計算することにする。式 [ 2 ] を書き直すと、 本語 C システム「 " C 言語はたいへん使いやすいプログラム言 語てすが , 英語圏て、開発され , 発展してき たプログラミング言語て、す。したがって , 英圏てない日本人には多少不便なところ があります。 プログラミングとは , 元来 , 人間が考え , 行う行為て、す。日本人の場合 , 日常は日本 語て思考しているのて , プログラミングも 日本語て行うほうが自然て , 効率もよいは ずだと考え , C 言語の日本語化を試みまし た。また , 日本語のドキュメントに近づけ ることも試みました。 日本語 C システム「 JJ 」はプログラムとドキ ュメントをひとつのファイルに記述てきる ツールてす。日本語のファイルから C 言語の ソースプログラムを作成するプリプロセッ サとして働きます。 具体的には ,JJ は JCS と JCL というふたっ の下請けプログラムから構成されています。 JCS は日本語のテキストファイルからプログ ラム部分を生成するプログラムてす。 JCL は List 122 C MAGAZINE 1992 5

10. 月刊 C MAGAZINE 1992年5月号

『品磊皿 9 SSeme 0 身長の平均を求める [ 配列編 ] List は話が逆行してしまいます。じゃあ , どう したらいいて、しようか ? 0 構垣体を使って集める いま集めようとしているふたつの情報は 名前と身長て、す。ひとりの名前と身長を近 くにまとめておきたいのて、す。ここて、は C 言 語に備わっているもうひとつの「集める」機 構を使いましよう。そう , 構造体て、す。名 前と身長を集めたひとつの構造体を作りま List 3 をご覧ください。 List 1 に比べたら すいぶん複雑になってしまいましたが , 注 意深く読んて、いただければわかると思いま 、す。身長の配列 height [ ] は姿を消し , 新 たに登場したのが , 配列 person [ ] て、す。 List 3 て、は , 「身長の集まり」を考えるのて、は なく , 「人の集まり」を考えているからて、す。 こて、いう「人」とはなんて、しよ それて、は , う ? それは「名前」と「身長」というふたっ の情報の集まりて、す。これは構造体 PERSO N として表現されています。 集たものを管理する C 言語の配列と構造体を「集める」という観 ところて、 , 「集める」か 点て、見てきました。 らには当然集めたものを管理することが必 要になります。 1 : #include く stdio. h> 2 : #include く stdlib. h> 3 : 4 : #define MAX—PERSON 3 5 : 6 : int height[MAX_PERSON] ; int average—height; 7 : 8 : 9 : main() 10 : { 11 : #define BUFFER 256 buffer[BUFFER] ; 12 : Char 13 : puts ( " 太郎の身長を入力してください。 14 : gets (buffer) ; 15 : heightC0] = atoi (buffer) ; 16 : 17 : puts ( " 花子の身長を入力してください。 18 : gets (buffer) : 19 : height[l] = atoi(buffer) ; 20 : 21 : puts ( " 三郎の身長を入力してください。 22 : gets(buffer) ; 23 : heightC2] ニ atoi (buffer) ; 24 : 25 : average—height = (heightC0] + height[l] + heightC2]) / MAX_PERSON : 26 : printf ( ”平均身長は Xd です。 *n", average_height) ; 28 : } 身長の平均を求める [ 構造体編 ] 1 : #include く stdio. h> 2 : #include く stdlib. h 〉 3 : 4 : #define MAX—PERSON 3 5 : 6 : typedef struct { 7 : Char *name : 8 : int height; 9 : } PERSON ; : 10 : 、 11 : PERSON personCMAX_PERSON] : 12 : ー 13 : : 14 : ・ 15 : ) ; int average—height; ー 17 : : 18 : ー 19 : main() ー 21 : #define BUFFER 256 buffer[BUFFER] ; : 22 : Char : 23 : int i; ー 24 : int sum; : 25 : for (i ニ 0 ; i く MAX_PERSON; i + + ) { ー 26 : printf ( " % s の身長を入力してください。 person[i]. name) ; : 27 : gets(buffer) ; ー 28 : person[i]. height = atoi (buffer) ; ー 29 : List 変名で管理する List 1 て、は各人の身長は , 変数 名前 height に格納されていました。各人の名前と身長 は , C 言語のプログラムの変数名に反映され ていたわけてす。するとどうなるてしよう か。ある人の身長を扱いたいときには , プ ログラマがその人の名前を基にプログラム を書かなければならないことになります。 プログラミングの工ッセンス 65