構造体
「構造体」とは、またいかめしい名前がでてきましたが、これはいったい何者なのでしょうか。
「構造」というと、なにやら哲学を連想してしまいますが(「構造主義」とか「現代社会の存立構造」とか
あったような)、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はこのままでは
正常に動作しません。