今回は別の観点でスケッチを見やすくします。
残っている謎
今回の記事では、今まで謎にしていた以下の2つのことを解き明かします。
ひとつはsetupとloopに出てくる「 { 」と「 } 」(波括弧)です。
もうひとつは、新規スケッチを作成すると、あらかじめ書かれているコメントの先頭にスペースが入っていることです。
今回の記事ではこれらの謎を解明して、前回とは違った観点でスケッチを編集していきます。
「 { 」と「 } 」
C++言語では、命令の集まりを「 { 」と「 } 」で囲みます。
例えば「setup」のところにはArduinoボードの電源を入れたあとに1回だけ実行する命令を書きましたよね。setupで実行する命令の集まりは「 { 」「 } 」で囲みます。
ちょっと不思議に思うかもしれませんが、setupで実行する命令が1つでも、さらに命令がなくても「 { 」「 } 」を書くルールになっています。命令がなくても中括弧で囲む、というのはちょっと不思議ですね。
ちょっと話はそれますが、ドーナツの穴ってあるのか、ないのか、という議論をたまにネットで見かけます。普通に考えればドーナツには穴がありますよね。というより、穴があってこそドーナツですよね。
でも「ドーナツの穴だけ持ってきて見せてください」と言われたら、その「穴だけ」って存在するのか、ちょっとわからなくなります。ドーナツの穴は実態は何もない空間ですが、「穴」単体はないのですが、実際にはドーナツには穴があるので、あるの?ないの?という議論です。
それと同じように「 { 」「 } 」の中に命令がない場合、「命令がない」という状態が「ある」、ということになります。すみません、余計な説明をしたので自分も混乱してきました…
それはそれとして、基礎編の後半では、setupやloop以外にも命令の集まりを書く場面が出てきます。その場合も命令の集まりは「 { 」「 } 」で囲みます。
setupとloopに書かれている「 { 」と「 } 」の謎については解決できました…よね?
残るは「void」と「( )」です。これらについての謎解きは基礎編パート1の終わりの方で説明します。
スペースと改行の扱い
以前の記事で説明しましたが、Arduino IDEはArduinoボードにスケッチを送るときに、スケッチに書いてある内容をそのまま送るのではなく、Arduinoボードが理解できる形式に変換しています。
Arduino IDEは、私たちが書いたスケッチを読み解いてArduinoボード用に変換するわけですが、読み解くときのルールがあります。
そのルールのひとつに「スペースと改行は無視する」というものがあります。
今まで特に説明なく、1行に1つの命令を書いていましたよね。
特に違和感はなかったと思います。
でも、よくよく考えてみると、C++言語では1行に1つの命令を書く、というルールはあるのか、という疑問があります。
実はC++言語の文法にそのようなルールはありません。Arduino IDEでは(C++言語では)、スペースと改行は無視されます。つまりスペースと改行はあってもなくても構いません。
そこで、極端な例で試してみます。
簡単なスケッチを例にして、必要のないスペースと改行を削除するとどうなるか実験してみましょう。
次のように、スペースと改行を全て削除してみました。
上のスクショの実際のスケッチは以下になります。気になる方はコピペして試してみてください。
void setup(){pinMode(12,OUTPUT);}void loop(){digitalWrite(12,HIGH);delay(1000);digitalWrite(12,LOW);delay(1000);}
この例では「void」と「setup」、 「void」と「loop」の間にスペースがありますが、このスペースは必要になります。
このスペースを取ってしまうと「voidsetup」というひとつの単語になってしまい、Arduino IDEは「voidsetup」という単語を知らないですし、スケッチに必ずあるはずの「setup」がありません。スケッチを検証するとArduino IDEはいつもの感じで怒り心頭って感じになります。
これ以外のスペースは取ってしまっても解釈はできますので問題ありません。
上のスケッチを実際に検証すると、以下のように問題なく検証が終わります。
このようにスペースと改行を取ってしまうとかなり見づらいですよね。かといって、スペースと改行は無視されるから、いくら入れても大丈夫ということで、スペースと改行を入れすぎてもおそらく読みづらくなると思います。
となるとC++のプログラミングでは一般的にはどうしてるのか、という疑問が出てきます。
このスペースと改行の入れ方は慣習があるんです。
この慣習を守らなくてもArduinoボードは問題なく動作します。でも、多くの人がこの慣習でスケッチを書いていますので、なるべくこの書き方に慣れておくことをお勧めします。
このシリーズを終えると、自分が考えたものがだんだん作れるようになってきます。そうなると自分で作ったスケッチを公開したくなるかもしれません。
公開されている大半のスケッチは同じルールで書かれていますので、今からスケッチは一般的なルールで書くようにしておくと良いと思います。
これから「改行のルール」と「スペースのルール」を見ていきます。
改行のルール
最初は改行のルールです。
1つの命令を書いたら改行するようにします。つまり、1行に1つの命令を書くようにする、というルールです。
先ほどの極端な例のように1行にいくつでも命令を書くことができますが、1行に2つ以上の命令を書くと読みづらくなります。1つの命令を書いたら改行して、1行に1つの命令を書くようにします。
ただし、1行に複数の命令を書いた方が見やすいケースもありますので、その場面が出てきたときに詳しく説明します。
また、改行は次のように処理のまとまりがわかるようにさらに改行を入れるケースもあります。
改行は命令ごとに必ず入れる必要がある、という絶対的なルールではありません。あくまでスケッチが読みやすくなるように心がけていただけると良いと思います。
スペースのルール
次はスペースのルールです。
今までに作成したスケッチで、loopは以下のようなものでした。
loopに4つの命令書きましたが、これらの命令を中括弧が囲んでいましたよね。以下は説明のために4つの命令を「命令1」から「命令4」に置き換えています。
これは特に見づらい、ということはないと思います。
実は基礎編の後半から、命令の集まりの中にさらに命令の集まりを書くケースが出てきます。今の知識では正確な理解は難しいですが、イメージを説明します。
命令の集まりの中にさらに命令の集まりを書く場合でも、その命令の集まりはこの記事で説明したように「 { 」「 } 」で囲みます。(ちょっとややこしくなってきましたね…)
例えば上のスケッチで、「命令2」と「命令3」の間に、「命令5、命令6、命令7」の3つの命令の集まりを書く場合、以下のようになります。
実は、、、さらにその中に命令の集まりが出てくることもあります。例えば、「命令5」と「命令6」の間に、「命令8、命令9」の2つの命令の集まりを書く場合、以下のようになります。
このようになりますが、なんとなく見づらくありませんか。例えば命令7は何番めの内側の波括弧の中かすぐにわからないですよね。
スケッチの例ではちょっとわかりづらい、という方もいるかもしれません。もっと身近な例で考えてみます。
例えば何泊かの旅行に行くときの持ち物リストを作ってみましょう。貴重品類、電気製品類、日用品類、その他でジャンル分けして以下のようにリストしてみました。
貴重品類
財布
現金
クレジットカード
チケット類
JR乗車券
航空券
保険証
電気製品類
携帯電話
モバイルバッテリー
日用品類
歯ブラシ
歯みがき粉
ハンカチ
ポケットティッシュ
ブラシ
衣類
アンダーウエア
くつした
洋服着替え
その他
ガイドブック
折りたたみ傘
チャック付き袋
これってなんだかわかりづらいですよね。せっかく整理して書いたはずなのに、区切りがわかりづらいです。ジャンル分けしているので最後に「類」で終わっている単語がジャンル名になりますが、どこから「日用品類」か見つけるのが大変ですよ。
そこで、項目の先頭にスペースを入れて、分類と分類の間に改行を入れてみました。
貴重品類
財布
現金
クレジットカード
チケット類
JR乗車券
航空券
保険証
電気製品類
携帯電話
モバイルバッテリー
日用品類
歯ブラシ
歯みがき粉
ハンカチ
ポケットティッシュ
ブラシ
衣類
着替え
下着
くつした
その他
ガイドブック
折りたたみ傘
チャック付き袋
すごく見やすい、ってわけではありませんが、先ほどのようにスペースも改行もない場合に比べて、全体が見やすくなっていますよね。
「見やすくなる」と書きましたが、もっと重要な観点としては「チェックリストの全体の『構造』がよくわかる」という点が挙げられます。
まず大項目として、「貴重品類」「電気製品類」「日用品類」「その他」という分類があり、さらにその下にも分類がある、というリストの構造が見た目でわかります。
たかがスペースや改行ですが、このように使うと全体構造を見た目で表現できる、という点に注目してください。
実際に、Arduinoに限らず一般的なプログラムは構造が複雑になりがちです。なるべく見やすくなるように、このようにスペースと改行が使われています。
上の持ち物リストでは、項目の前にスペースを入れました。このスペースを入れることを日本語では「字下げ」、英語では「インデント(indent)」と呼んでいます。
スケッチ(プログラム)を書くとき、内容を読みやすくして、全体の構造がわかりやすくなるようにインデントが用いられています。
なお、インデントはスペースは半角スペースです。全角のスペースを入れるとArduino IDEに怒られますので十分注意してください。
また、インデントで使用するスペースの数は多くの場合、半角スペース2個または4個です。
一般的なプログラムでは全体的に半角スペース4個の場合が多いように思います。
Arduino IDEのインデントは半角スペース2個がデフォルトです。このシリーズでは、Arduino IDEのデフォルトが半角スペース2個ですので、この設定で進めます。
次に一般的なインデントの入れ方のルールを説明します。
インデントは以下のように「 { 」と「 } 」で囲まれた命令は以下のようにインデントします。
命令の集まりの中にさらに命令の集まりがある場合も同様に、「 { 」と「 } 」で囲まれた命令をインデントします。
このようにすると、どの命令がどの階層の波括弧に属するかわかりやすくなりませんか…?なりますよね!(ちょっと圧をかけておきました)
次の図は命令1から命令8までインデントを入れたスケッチです。Arduino IDEの画面をよく見ると、インデントごとに縦の薄い線が入っていますよね。インデントするだけでもわかりやすくなりますが、Arduino IDEではさらにわかりやすくなるようにインデントの階層ごとに線を入れてくれます。
インデントの扱いは最初はわかりづらいかもしれませんが、これからスケッチを作成していくときにたくさん出てきますので、だんだん慣れていけば大丈夫です!
スケッチをさらに見やすくしよう
それでは、LEDを1秒ごとにつけたり消したりするスケッチにインデントを入れましょう。
最初に次の手順で、setupの「pinMode(12, HIGH);」にインデントを入れます。
まず「pinMode(12, HIGH);」の先頭にカーソルを持っていきます。
ここにインデントを入れるには「TAB」キーを使用します。「TAB」キーは、Windowsの場合は左上の方に「TAB」と書かれているキーがあると思います。Macの場合は次のようなマークのキーです。
それでは、「pinMode(12, HIGH);」の先頭にカーソルがある状態でTABキーを押してください。TABキーを押すと以下のように半角スペースが2個挿入されます。
次に、loopにある4つの命令もインデントしましょう。
この場合、4つの命令それぞれに対して、先頭にカーソルを持っていきTABキーを押す、というの操作を繰り返すのは面倒ですよね。このように複数行をインデントしたい場合、以下の手順で行なってください。
最初にインデントする行をすべて選択状態にします。(きっちり4行選択する必要はなく、次のように行の途中から選択しても問題ありません。インデントする行が1文字でも選択されていればOKです)
この状態ができたらTABキーを押します。
このように複数行を選択した状態でTABキーを押すと、選択した行すべてがインデントされます。
さらにそのままTABキーを押すと、押した分のインデントが追加されていきます。
また、インデントを元に戻したい場合は、Shiftキーを押しながらTABキーを押します。押すたびに1回分ずつインデントが元に戻ります。
このような機能を活用して、スケッチにインデントを入れるようにしましょう。
スケッチ完成
最後にsetupとloopの中の改行を削除しておきます。
これでようやく(見やすい)スケッチが完成しました。お疲れさまでした!
【補足】インデントのスペース数変更
Arduino IDEのインデントは半角スペース2個ですが、一般的なプログラムでは半角スペース4個の方が多く見られます。
Arduino IDEで「TAB」キーを押したときのインデントの半角スペース数の設定は変更できます。
ただし、Arduino IDEの「基本設定…」メニューから変更することはできません。Arduino IDEのバージョンごとに異なりますので、それぞれ変更方法を説明します。
Arduino IDE バージョン2(最新版)
Arduino IDEでは「ファイル」メニュー ▶︎ 「基本設定…」で設定できる項目以外にも、非常にたくさんの設定があります。そのため、ほとんどの設定は裏に隠されています。
インデントのスペース個数の設定はこの裏設定にあります。
これから、次の手順で裏設定を表示してインデントのスペースの個数を変更します。
- 設定画面を開く
- インデントの設定項目を探す
- 変更して設定を保存する
1. 設定画面を開く
キーボードの「F1」キーを押します。次のようなメニューが表示されます。(これは「コマンドパレット」と呼ばれていて、Arduino IDEに対してさまざまな指示(コマンド)を与えることができます)
このメニューの一番上にある入力欄に表示されている「 > 」は削除しないでください。
もし削除してしまったら、一度エスケープキー(ESCキー)を押してコマンドパレットを閉じて、再度F1キーを押してコマンドパレットを表示してください。
入力欄の「 > 」の後に「ユーザー設定」または「user set」と入力します。次のように「基本設定:ユーザー設定を開く」という項目が表示されますので、クリックします。
クリックすると次のような設定画面が表示されます。
2. インデントの設定項目を探す
ここで設定できる項目は非常にたくさんありますので、検索欄で検索します。
次のように検索欄に「tab size」と入力します(「tab size」は、TABキーを押した時に入れるスペースのサイズ(個数)という意味合いです)。「Editor : Tab Size」という項目がインデントのスペースです。
3. 変更して設定を保存する
現在の設定は「2」になっていますので、「4」に変更します。
変更すると、設定項目左側に青いラインが表示されます。このラインは「デフォルト設定から変更があった項目ですよ!」ということを表現しています。
ところで、変更後にやっぱりデフォルトに戻したいという場合、デフォルトの設定値を忘れてしまうこともありますよね。その場合は次のように設定項目欄をクリックして選択状態にすると、歯車アイコンが表示されます。
歯車アイコンをクリックするとメニューが表示されますので、「設定をリセット」を選択するとデフォルトの設定値に戻ります。
設定値を変更すると、自動的に変更後の設定値が保存されます。設定タブの「X」ボタンをクリックして設定画面を閉じて完了です。
Arduino IDE バージョン1.8.19
古いバージョンのArduino IDEの場合、インデントの半角スペースを4個に変更したい場合は次の手順で変更してください。
Windowsの場合は「ファイル」→「環境設定」メニューを選択します。macOSの場合は「Arduino」→「Preferences」メニューを選択します。以下のダイアログが表示されます。
このダイアログの下の方に「以下のファイルを直接編集すれば、より多くの設定を行うことができます。」と書かれていることころがあります。そのすぐに下にファイルのパスが書かれています。「……..preferences.txt」という文字で終わっています。
ここをクリックします。クリックするとWindowsの場合はエクスプローラ、macOSの場合はFinderのウインドウが開きます。
ここに「preferenences.txt」というファイルがありますので、これからこのファイルを開いて編集します。間違った場合のためにバックアップを取っておくとよいでしょう。
preferences.txtを開いたら、以下の行がありますので検索します。
editor.tabs.size=2
「=」の後の数字がインデントをするときの半角スペースの数になります。
デフォルトでは2が設定されていますので、半角スペース4個に変更したい場合は「2」を「4」に書き換えます。
書き換えたら保存して、Arduino IDEを再起動します。
更新履歴
日付 | 内容 |
---|---|
2019.7.28 | 新規投稿 |
2021.8.22 | 新サイトデザイン対応 |
2024.11.19 | Arduino IDE2の内容に変更 |
テストコメント
とてもわかりやすい説明ありがとうございます。
画面だけだとちょっとメモしたりすることができないのでプリントアウトしますが、そうするとコマンドの色分けや行番号が印刷するとなくなってしまいます。
何か方法はあるのですか?画面のイメージそのままだとわかりやすいのですが。
ご質問どうもありがとうございます。
こちらの環境では問題はありませんでしたが、IE、Firefox、Chrome、Safariのどのブラウザでも問題が発生しますでしょうか。