見出し画像

【C言語プログラミング4】ルフィを描く!解説1

前回、C言語でルフィを描くプログラムを作りました。今回からそのソースコードの解説をして行きます。このプログラムでやっていることは、簡単に言うと”☐”(白い四角)と”■”(黒い四角)を決められた順に表示しているだけです。結果として、それがルフィに見えるわけ。

”☐”や”■”を点と考えて、それを並べて絵にしたものをドット絵と言います。ファミコンのキャラクター(マリオとか)はこれで描かれています。マリオはカラーですが、今回やったルフィは単純に白黒で表現しました。

画像1

ルフィ描画プログラムの全体構成

ルフィ描画プログラムは以下3つの関数で成り立っています。
1)main関数
2)DecompressLuffyData関数
3)PrintLuffy関数

main関数からDecompressLuffy関数とPrintLuffy関数を順に呼び出して終了です。ソースコードの冒頭に大量の16進数データがありますが、これがルフィのドット情報になります。つまり、”☐”と”■”の並びを定義した情報です。ルフィ描画プログラムはこのドット情報を解読して、コンソールに”☐”か”■”を表示します。では、main関数から順番に見て行きましょう。

main関数

main関数はこれまでずっと登場して来ましたが、main関数自体の説明はしていませんでしたね。main関数は特別な関数で、プログラムの起点になる関数です。プログラムは必ずmain関数から始まります。なので必ず最初に書かないといけません。今回のmain関数には引数も戻り値も必要ないので型はvoidにしています。(引数あり、戻り値ありにすることも出来ます)

void main(void)
{
}

このように書くと{ }の中は何も処理がありませんので、何もしないプログラムになります。今回のルフィ描画プログラムのmain関数は以下のようになっています。

void main(void)
{
    DecompressLuffyData();		/*	ルフィの画像データを解凍	*/
	PrintLuffy();				/*	ルフィを表示する		*/
}

たったの2行ですね。DecompressLuffyData関数とPrintLuffy関数を順番に呼び出しているだけです。この2つの関数は自分で新しく作りました。関数の後ろに/**/こんなマークで囲まれている部分がありますが、これはコメントと言ってプログラムに注釈を付けられます。

DecompressLuffyData関数はルフィの画像データを解凍し、PrintLuffy関数でルフィを表示します。main関数は以上!シンプルですね。問題は自作関数の中身です。ここからが本番。

DecompressLuffyData関数

この関数がルフィ描画プログラムの心臓で、ソースコード冒頭のルフィのドット情報を解凍して、”☐”と”■”の並び順に変換します。この関数のソースコード行数はたったの16行ですが、この16行を理解するためには、結構な量のC言語知識が必要です。一つずつ理解して行きましょう。

一次元配列

一次元配列は単純に配列と言ったりしますが変数の一種です。変数については理解している前提で話を進めます。変数の宣言をする時は以下のように記述しますよね?

char sample;

これでchar型のsampleと言う名前の変数がメモリ上に配置されます。ここまでは大丈夫ですね。仮にchar型の変数が2個以上欲しい場合は、

char sample1;
char sample2;
char sample3;
・・
・

とすることも出来ますが。これが10000個とかになったらやってられませんね。そんな場合に配列を使います。

char sample[10];

こう記述すると、char型のsampleという名前の変数が10個ズラッ並びます。メモリ上のイメージは以下の通りです。

無題

配列を扱う時の注意点として、先頭が0番から始まると言うことです。1からではありません。char sample[10];とするとメモリイメージの通り10個並ぶんですが、最後の番号は9です。配列の何番目かを表す番号のことを添え字と言います。例えば配列の先頭から3番目に100を入れたい場合、

sample[2] = 100;

とします。添え字2は先頭から3番目になります。また、配列の最後のつもりで誤って、

sample[10] = 100;

なんてことをすると、配列の最後を超えたメモリへのアクセスになりますので、大変なことになります。

暴走

最悪プログラムが暴走します。気を付けて下さい。

一次元配列の初期化

通常変数と同様に配列も宣言と同時に値を入れることができます。配列の宣言時に入れる値のことを初期値と言い、初期値を入れることを初期化と言います。初期値は{ }の中にカンマ区切りで指定します。配列を初期化する場合は、添え字を省略することができます。3行目のsampleは自動的にsample[5]となります。

char sample[10];                            /* 配列を宣言しただけ */
char sample[10] = {1,2,3,4,5,6,7,8,9,10};   /* 宣言と同時に値をセット */
char sample[] = {1,2,3,4,5};                /* 宣言と同時に値をセット */

ルフィ描画プログラムにおける一次元配列の利用

ルフィ描画プログラムでは、一次元配列をルフィのドット情報の入れ物として使っています。実際のソースコードを抜粋します。

unsigned char gucImageData[1250] = {
	0x00,0x00,0x00,0x41,0x08,0x07,0x00,0x00,・・・
    0x00,0x40,0x58,0x3d,0x00,0x00,0x00,0x00,・・・
    ・・・
};

このコードではunsigned char型のgucImageDataという名前の配列を宣言し、宣言と同時に16進数のデータを全部で1250個入れています。このデータがなぜルフィになるのでしょうかね。今回はこの辺で。次は二次元配列に入ります。

この記事が気に入ったらサポートをしてみませんか?