構造体
「構造体」とは、またいかめしい名前がでてきましたが、これはいったい何者なのでしょうか。
「構造」というと、なにやら哲学を連想してしまいますが(「構造主義」とか「現代社会の存立構造」とか
あったような)、C言語の構造体も、なかなか複雑なもののようです。
一昔前のプログラムの本(手続き型の旧BASIC全盛期のころの本)では、構造体はポインタと並んで
もっともCらしい機能のひとつで・・・・といった解説がよくなされていましたが、旧BASICにはない機能の
ひとつです。
もっとも、最近のプログラム言語には、みな構造体がありますが。
1 構造体
構造体は、複数のデータ型をひとつにまとめて、あたかもひとつの変数のように扱えるようにしたものです。
構造体の説明で必ず引き合いにだされる例が、「住所録」ですが、おじさんはちょっと趣向を変えて、「星」
を題材に構造体を考えてみます。(住所録じゃつまんないもん)
「星」には属性データとして、位置(ここはコンピューター上だから、X座標、Y座標)、そして色をもたせる
ことにします。それでは「星」(Star)をC言語の構造体として定義してみましょう。
構造体の定義は以下の書式で行います。
struct 構造体タグ {
メンバーの宣言;
メンバーの宣言;
} 変数名;
/*starの構造体定義*/ struct star { 構造体タグ(名前) int x; メンバー1 X座標 int y; メンバー2 Y座標 int c; メンバー3 星の色 } st; 構造体変数名 |
それぞれのメンバーへは、 「構造体変数名.メンバー 」
という書式で参照ができます。
starのメンバーは、それぞれ
st.x 「星」のX座標
st.y 「星」のY座標
st.c 「星」の色
をあらわすことになります。
構造体のメンバーは、通常の変数のように扱うことができますので、例えば、「星」のX座標を20にしたければ
st.x = 20;
とすればO.K.です。
構造体変数名に配列を使うこともできます。
構造体の基本的なところは、こんなところでしょうか
2 プログラム例
それでは、画面上に色とりどりの「星」が降ってくるプログラムを作成してみましょう
実行画面イメージ
* * * * * * * * * * * * * * * |
プログラムとしては
(1) Y座標(st[ ].y)の数値で星の画面への表示、非表示を分ける。
Y座標=0の時は、非表示
(2) 非表示の星は、乱数を使い、9%の確率で表示に変更。画面の一番上(Y座標=1
の位置)に表示
(3) 星は少しづつ画面下まで移動し、Y座標が20になると非表示に戻す(Y座標=0にする)
というシンプルな流れのものです。
ソースコードはPC/AT互換機
コンパイラLSIC用のものです。(TurboCでもそのままコンパイル可のはず)
/*STAR 構造体のサンプル用プログラム */ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <dos.h> #include <conio.h> #define num 30 #define delay 12000 #define dosvcol 30 /*DOS/Vでの文字色設定のエスケープシーケンス 30黒*/ void locate(int,int); void color(int); int wait(int,int); main(){ struct star { /*starの構造体定義*/ int x; int y; int c; } st[num]; int i,dx,dc; long nowt,t; printf("\x01b[2J"); /*画面クリア*/ printf("\x01b[>5h"); t= time(&nowt); srand(nowt%3600); /*乱数初期化*/ /*変数の初期化*/ for (i=1;i<num; i++){ st[i].x=0; st[i].y=0; st[i].c=0;} while(!kbhit()){ for( i=1 ;i<num;i++){ if (st[i].y==0 && rand()>30000){ dx= 32767/78; dc=32767/7; st[i].x=rand()/dx+1; st[i].y=1; st[i].c=rand()/dc+dosvcol; } if (st[i].y == 0) continue; locate(st[i].x,st[i].y); putch(' '); st[i].y=st[i].y+1; if (st[i].y>19){st[i].y=0; continue;} color(st[i].c); locate(st[i].x,st[i].y); putch('*'); wait(0,delay); }} printf("\x01b[>5l"); } void locate (int tx,int ty) { printf("\x1b[%d;%dH" ,ty,tx); } void color(int col) {printf("\x01b[%dm",col);} int wait(int time1, int time2) { union REGS regs; regs.h.ah=0x86; regs.x.cx=time1; regs.x.dx=time2; int86(0x15,®s,®s); return (regs.x.cflag);} |
Star構造体の定義 構造体変数は配列にした X、Y座標、色を初期化 Y座標(st[ ].y)が0の時は、画面に表示 しないことにする。 何かキーが押されたら終了 Y座標=0(非表示時) 確率9%で、 表示状態に 変更する(Y座標=1) Y座標=0ならcontinue(何もせず、 for ループの 先頭に戻る) 星の移動 Y座標が20以上になったら非表示に変更 カーソル位置移動 色設定 ウェイトをかける BIOSのディレイルーチンのコール |
【 補足】
locate,color 関数については、Short
Program(もぐらたたき)を参照して下さい。
wait はBIOSをコールしています。これはPC/AT互換機のBIOSの場合です。PC-98はこのままでは
正常に動作しません。