第24回 インスタンスの配列

第21回の記事で作成した言い訳キーボードのスケッチを改良するための準備をします。

目次

第21回のスケッチの問題点

言い訳キーボードのスイッチを押すと、あらかじめ用意しておいた3種類の文字列の中からひとつ選ぶ、という動作をプログラミングしました。

例えば左側のスイッチが押された場合、乱数を発生させてその結果に応じてswitch文を使って文字列を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に送信しますが、その送信する文字列はスケッチの中に分散して書かれています。とは言っても、この程度のスケッチの量でしたらそれほど問題は感じないと思います。

それでは、このスケッチの行数がもっと多くなった場合を想像してみてください。

スケッチの行数が増えると、スイッチを押したときにPCに文字列を送る処理の部分はもっともっと下の方に行ってしまうかもしれません。そのようなスケッチで、文字列を変更したい場合、スケッチの中から変更する行を探すのってちょっと大変になりそうですよね。

このような問題を解決するには、PCに送る文字列をスケッチの先頭の方にまとめて書くことができれば、スケッチを修正するのが楽になりますよね。

ということで、今回はこの問題を解決する方法を検討します。

インスタンスの配列

最初に、この問題の解決方法を説明します。

基礎編パート1の第38回で「配列」という概念を説明したのを覚えているでしょうか。第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"};

先ほどの変数の配列と比較してみてください。uint16_t型の配列宣言と同じように宣言できることが分かりますよね。

ところで、鋭い方は疑問に思ったかもしれません。

前回の記事でコンストラクタについて説明しました。クラスからインスタンスを生成する書き方として、以下のような書き方を習得しましたよね。

String moji = String("文字列");

でもインスタンスの配列宣言では、コンストラクタが書かれていません。実は先ほどの書き方はコンストラクタを省略した書き方なんです。

Stringクラスのインスタンス配列宣言を省略しないで書くと以下のようになります。

String moji[3] = {String("文字列0"), String("文字列1"), String("文字列2")};

これでStringクラスのインスタンスを配列として扱えるようになりました。

以下のスケッチは今回の内容の確認用スケッチになります。

このスケッチが何をしているのか、じっくり読み解いて、実際にArduino Microで動作させてシリアルモニタで結果を確認してみてください。

/*
 * Stringクラスのインスタンス配列の例
 */

// Stringクラスのインスタンス配列を準備
String moji[3] = {"文字列0", "文字列1", "文字列2"};


void setup() {
  
  // シリアルモニタ初期化
  Serial.begin(9600);
  while( !Serial ){
  }

  // シリアルモニタに文字列表示
  Serial.println(moji[0]);
  Serial.println(moji[1]);
  Serial.println(moji[2]);

}


void loop() {

}

次回は、Stringクラスのインスタンス配列を使って、言い訳キーボードのスケッチを読みやすくして完成させます。

更新履歴

日付 内容
2021.12.27 新規投稿
通知の設定
通知タイミング
guest
0 コメント
本文中にフィードバック
全てのコメントを見る
目次