らずらいと姫の挑戦日記~第35回~C言語の配列を学ぶ~
2017-01-31
配列とは
まず、コンピュータが理解できるのは、0と1だけです。
ディスプレイに表示されているアルファベットや数字は、実際は0と1を組み合わせて出来ているんです。
その0と1はひとつずつ箱の中に入っています。その箱のことを『bit』とよんでいます。8bitなら箱は8個、16bitなら16個、32bitなら32個とbitが大きくなれば、より多くの0と1を格納することができます。そして、8bit=1byteでアルファベットや数字1字を表すことが出来ます。
8bitだと0と1の組み合わせで0~255まで、または-128~127までを表現することができます。16bitだと65536通り、32bitだと4,294,967,296通り、とbitが大きくなると、扱う事が出来るデータがとてつもなく大きくなります。
さて、コンピューターで文字を使うとき、0~255の数値に文字を割り当てて使用しています。ASCIIコードというのがあり、その中で文字と数字の関連付けが決められているので、コンピュータやマイコンで文字化けせずに使用することができる、というわけです。
ところで、文字は1バイト分(1文字)だけあっても、ほとんど意味を成しませんよね。何文字か集まって意味を持ちます。1バイトが1枚の紙とすると、その紙1枚にアルファベット1字ずつ書くことができるということになります。その紙に、”L”、”A”、”Z”、”U”、”R”、”I”、”T”、”E” と書いて、合計8枚の紙があるとします。バラバラの8枚のままでは、扱うのが困難ですし、順番が変わったら意味が変わってしまうので、まとめて扱ったほうが便利です。紙はホチキスで留めておきたいですよね。
コンピューターで、データをまとめて扱えるようにしたのが『配列』になります。
配列の使い方
データの型名は第12回で説明しましたね。
配列を使ったサンプルプログラム
配列を使った文字列のサンプルプログラムを作成してみました。
[c]
#include "array_sample_ide.h" // Additional Header
char name[64] = {"Lazurite Hime desu!!"};
void setup() {
// put your setup code here, to run once:
int i;
Serial.begin(115200);
for(i=0;i<sizeof(name);i++)
{
Serial.print_long(i,DEC);
Serial.print(",");
Serial.write_byte(name[i]);
Serial.print(",");
Serial.println_long(name[i],DEC);
}
Serial.println("");
Serial.println(name);
name[8] = NULL;
for(i=0;i<sizeof(name);i++)
{
Serial.print_long(i,DEC);
Serial.print(",");
Serial.write_byte(name[i]);
Serial.print(",");
Serial.println_long(name[i],DEC);
}
Serial.println("");
Serial.println(name);
}
void loop() {
// put your main code here, to run repeatedly:
}
[/c]
サンプルプログラムの解説
この部分で、nameという64バイトの配列を準備し、”Lazurite Hime desu”という文字列を代入しています。
char name[64]={“Lazurite Hime desu!!”}
この5行は、文字の番号、文字、文字のASCIIコードを順番に出力しています。
Serial.print_long(i,DEC);
Serial.print(“,”);
Serial.write_byte(name[i]);
Serial.print(“,”);
Serial.println_long(name[i],DEC);
次の1行では、文字列の終わりを示すNULLコード(数値は0)を、8番目の文字に代入しています。
name[8]=NULL
NULL=0は、ここで文字が終わりですよ、という意味で使われます。
サンプルプログラムの実行結果
一番最後の行を見てみると、”LAZURITE”のみで8番目以降の表示がありませんね。if内の処理の部分では、8番目以降のアルファベットも表示されていますが、消去する手間をはぶいているために残っているだけです。ちなみに、文字を扱う上で、0の設定がないとコンピュータはこの文字がいつ終わるのか判断できず、暴走してしますそうです。要するに、64バイトの配列では、NULLコードの分として1バイトを残しておく必要があるため、最大で63文字が扱える、ということになります。
配列を使わないサンプルプログラム
頑張って配列を使わないプログラムを作ってみました。
[c]
#include "noarray_ide.h" // Additional Header
char name1 = ‘L’;
char name2 = ‘a’;
char name3 = ‘z’;
char name4 = ‘u’;
char name5 = ‘r’;
char name6 = ‘i’;
char name7 = ‘t’;
void setup() {
// put your setup code here, to run once:
int i;
Serial.begin(115200);
Serial.write_byte(name1);
Serial.write_byte(name2);
Serial.write_byte(name3);
Serial.write_byte(name4);
Serial.write_byte(name5);
Serial.write_byte(name6);
Serial.write_byte(name7);
Serial.write_byte(‘\r’);
Serial.write_byte(‘\n’);
}
void loop() {
// put your main code here, to run repeatedly:
}
[/c]
結果は同じですが、配列を使わないと1字ずつ設定する手間がかかってしまい、大変なんです。
今回は、文字列は配列を使ってまとめて扱うといいうことがわかりました!!