第21回の記事で作成した言い訳キーボードのスケッチを改良するための準備をします。
作成したスケッチの問題点
第21回の記事で、言い訳キーボードのスイッチを押すと、あらかじめ用意しておいた3種類の文字列の中からひとつ選ぶ、というスケッチを作成しました。
例えば左側のスイッチを押した場合、乱数を発生させ、その結果に応じて文字列をPCに送る、というスケッチにしました。
この部分は以下のようになっていました。
// 左側スイッチが押されたら、主部を適当に選んでPCに送信
if( hidariSwitch.pushed() ){
// 0〜2の乱数を生成して、数字に応じて文字列をPCに送る
switch(random(3)){
case 0:
Keyboard.print("okitara \n");
break;
case 1:
Keyboard.print("toirega \n");
break;
case 2:
Keyboard.print("kaiinuga \n");
break;
}
}
ところで、このスケッチは動作上はまったく問題ありません。
ただし、スケッチの規模が大きくなってくると「修正しづらい」という問題点が出てくるんです。
次のスケッチは第21回で作成したもので、全体を表示しています。文字が非常に小さいですがスケッチの内容自体はそれほど問題ではありませんので、全体の構造を見てみてください。

このスケッチでは、それぞれのスイッチが押されたときに送信する文字列は、スケッチの中に分散して書かれています。
この程度のスケッチの量でしたらそれほど問題は感じないと思います。
でも、スケッチの行数が増えてくると、PCに文字列を送る処理の部分はもっともっと下の方に行ってしまうかもしれませんし、そもそも送信する文字列はswitch
の中に埋もれてしまっています。
そのようなスケッチで、文字列を変更したい場合、スケッチの中から変更する行を探すのってちょっと大変になりそうですよね。
このような問題を解決するには、PCに送る文字列をスケッチの先頭の方にまとめて書くことができれば、スケッチを修正するのが楽になりそうです。
そこで、今回はこの問題を解決する方法を検討します。
インスタンスの配列
最初に、この問題の解決方法を説明します。
基礎編パート1の第38回で「配列」という仕組みを習得しました。
その記事では、スケッチのはじめの方でアラームメロディーの音程データを配列で宣言してスケッチで扱いやすくしました。
ところで、配列はプログラミングが初めての人にとってちょっと理解しづらいところがありますよね。
でも、C++言語に限らずPythonやJavaScriptなど、配列をサポートしていないプログラミング言語はないといっていいほど重要な仕組みですので、ぜひ慣れていただければと思います。
今回もこの配列の考え方を使って、Stringクラスで文字列の配列を扱おう、というわけです。
なんだか急に難しそうな雰囲気になってきましたので、まずは基礎編パート1第38回で扱った変数の配列について簡単に復習しておきましょう!
キッチンタイマーでは、次のようにメロディーの音程の周波数をuint16_t
型の配列に代入しました。
uint16_t onkai[3] = {440, 880, 1760};
このように宣言すると、配列の要素に次のような値が代入されます。
配列 | 値 |
onkai[0] | 440 |
onkai[1] | 880 |
onkai[2] | 1760 |
Stringクラスから生成したインスタンスでも、これと同じように配列で扱うこことができます。
要するに、上の「変数の配列」に対して、今回の記事では「インスタンスの配列」を扱うことになります。
Stringクラスのインスタンスの配列を扱うために、最初にサンプルスケッチを確認してみましょう。
次のスケッチは、Stringクラスのインスタンスを3個の配列として宣言するものです。
String moji[3] = {"文字列0", "文字列1", "文字列2"};
先ほどの変数の配列と比較してみると、インスタンスの配列宣言は変数の配列宣言と対応しています。
ところで、もしかしたらこの書き方に疑問に思った方がいるかもしれません。
前回の記事では「コンストラクタ」について説明しました。
クラスからインスタンスを生成する書き方として、次のようにコンストラクタを使った方法を習得しました。
String moji = String("文字列");
でも、先ほどのインスタンスの配列宣言では、コンストラクタが書かれていません。
実は先ほどの書き方はコンストラクタを省略した書き方で、Stringクラスではこのような書き方ができるようになっています。
Stringクラスのインスタンス配列宣言を、コンストラクタを省略しないで書くと次のようになります。
String moji[3] = {String("文字列0"), String("文字列1"), String("文字列2")};
Stringクラスでインスタンスの配列を扱う場合、コンストラクタがない方がすっきりします。そこで言い訳キーボードはコンストラクタなしの書き方で進めることにします。
動作確認
これでStringクラスのインスタンスを配列として扱えるようになりました。
次のスケッチは、インスタンスの配列を扱う方法の確認用スケッチになります。
/*
* Stringクラスのインスタンス配列の例
*/
// Stringクラスのインスタンス配列を準備
String moji[3] = {"文字列0", "文字列1", "文字列2"};
void setup() {
// シリアルモニタ初期化
Serial.begin(9600);
while( !Serial ){
}
// シリアルモニタに文字列表示
for(int i=0; i<3; i++) {
Serial.println( moji[i] );
}
}
void loop() {
}
このスケッチをArduino Microで動作させてみると、シリアルモニタには次のように文字が表示されます。
文字列0
文字列1
文字列2
インスタンス配列の使い方のイメージをつかんでいただければと思います。
次回は、Stringクラスのインスタンス配列を使って、言い訳キーボードのスケッチを読みやすくして完成させます。
更新履歴
日付 | 内容 |
---|---|
2021.12.27 | 新規投稿 |
2025.2.19 | Arduino IDE2対応 説明補足 |