×

らずらいと姫の挑戦日記~第35回~C言語の配列を学ぶ~

2017-01-31

13

配列とは

まず、コンピュータが理解できるのは、0と1だけです。
ディスプレイに表示されているアルファベットや数字は、実際は0と1を組み合わせて出来ているんです。

その0と1はひとつずつ箱の中に入っています。その箱のことを『bit』とよんでいます。8bitなら箱は8個、16bitなら16個、32bitなら32個とbitが大きくなれば、より多くの0と1を格納することができます。そして、8bit=1byteでアルファベットや数字1字を表すことが出来ます。

5

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枚のままでは、扱うのが困難ですし、順番が変わったら意味が変わってしまうので、まとめて扱ったほうが便利です。紙はホチキスで留めておきたいですよね。
コンピューターで、データをまとめて扱えるようにしたのが『配列』になります。

配列の使い方

8

データの型名は第12回で説明しましたね。

配列を使ったサンプルプログラム

配列を使った文字列のサンプルプログラムを作成してみました。


#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:

}

サンプルプログラムの解説

この部分で、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は、ここで文字が終わりですよ、という意味で使われます。

サンプルプログラムの実行結果

11

一番最後の行を見てみると、”LAZURITE”のみで8番目以降の表示がありませんね。if内の処理の部分では、8番目以降のアルファベットも表示されていますが、消去する手間をはぶいているために残っているだけです。ちなみに、文字を扱う上で、0の設定がないとコンピュータはこの文字がいつ終わるのか判断できず、暴走してしますそうです。要するに、64バイトの配列では、NULLコードの分として1バイトを残しておく必要があるため、最大で63文字が扱える、ということになります。

配列を使わないサンプルプログラム

頑張って配列を使わないプログラムを作ってみました。


#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:

}

12

結果は同じですが、配列を使わないと1字ずつ設定する手間がかかってしまい、大変なんです。

今回は、文字列は配列を使ってまとめて扱うといいうことがわかりました!!

Laz-princess_footer