第14回 インデント

今回は別の観点でスケッチを見やすくします。

残っている謎

今回の記事では、今まで謎にしていた以下の2つのことを解き明かします。

ひとつはsetupとloopに出てくる「{」と「}」(中括弧)です。

setupとloopの{}

もうひとつは、前回の記事で削除してしまいましたが、あらかじめ書かれていたコメント文の先頭にスペースが入っていたことです。

コメント先頭のスペース

今回の記事ではこれらの謎を解明して、前回とは違った観点でスケッチを見やすくします。

 

「{」と「}」

C/C++言語では、命令の集まりを「{」と「}」で囲みます。

例えば「setup」のところにはArduinoボードの電源を入れたあとに1回だけ実行する命令を書きましたよね。setupで実行する命令の集まりは「{」「}」で囲みます。

ちょっと不思議に思うかもしれませんが、setupで実行する命令が1つでも、さらに命令がなくても「{」「}」を書くルールになっています。命令がなくても中括弧で囲む、というのはちょっと不思議ですね。

ちょっと話はそれますが、ドーナツの穴ってあるのでしょうか、ないのでしょうか。普通に考えればドーナツには穴がありますよね。というより、穴があってこそドーナツですよね。

でも「ドーナツの穴だけ持ってきて見せてください」と言われたら、その「穴だけ」って存在するのでしょうか。ドーナツの穴は実態(じったい)はただの空間です。ただの空間なのにドーナツには穴が「ある」わけです。

それと同じように「{」「}」の中に命令がない場合、「命令がない」という状態が「ある」、ということになります。「{」と「}」がドーナツ本体で、その中の何もないところがドーナツの穴、というわけです。すみません、説明している私も混乱してしまいました。

ドーナツの穴のことも含めて、loopについても同様です。

さらに基礎編の後半では、setupやloop以外にも命令の集まりを書く場面が出てきます。その場合も命令の集まりは「{」「}」で囲みます。

ということで、「{」と「}」の謎を解決したのはいいですが、新たにドーナツの穴問題が出てきてしまいました。とりあえず「{」「}」は命令の集まりを表す、と覚えておきましょう。

setupとloopの「{」と「}」の謎については解決できました。残るは「void」と「( )」です。これらについての謎解きは基礎編パート1の終わりの方で説明します。

 

スペースと改行の扱い

以前の記事で説明しましたが、Arduino IDEはArduinoボードにスケッチを送るときに、スケッチに書いてある内容をそのまま送るのではなく、形式を変換しています。

Arduino IDEは私たちが書いたスケッチを読み解いて、Arduinoボード用に変換するわけですが、読み解くときのルールがあります。

そのルールのひとつに「スペースと改行は無視する」というものがあります。

今まで特に説明なく、1行に1つの命令を書いていましたよね。

1行に1つの命令の書き方

特に違和感(いわかん)はなかったと思いますが、よくよく考えてみると、C/C++言語では1行に1つの命令を書く、というルールはあるのか、という疑問があります。

実はC/C++言語の文法にそのようなルールはありません。Arduino IDEでは(C/C++言語では)、スペースと改行は無視されます。つまりスペースと改行はあってもなくても構いません。

そこで、極端な例を示します。

最初にArduino IDEの動作確認をしたときのスケッチを例にして、必要のないスペースと改行を削除するとどうなるか実験してみます。

以下のように、スペースと改行を全て削除してみました。

スペースと改行を削除したスケッチ

スクショの実際のスケッチは以下になります。

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/C++のプログラミングでは一般的にはどうしてるのか、という疑問が出てきますよね。

スペースと改行の入れ方は慣習があります。(「慣習」→ かんしゅう/長い時間をかけて多くの人に認められるようになって、そうする決まりとなっていること)

この書き方を守らなくてもArduino動作上は全く問題ありませんが、やはり先人が長い時間かけて作ってきたものですので、最初はルールを意識してスケッチを書くようにしてください。

このシリーズを終えると、自分が考えたものがだんだん作れるようになってきます。そうなると自分で作ったスケッチを公開したくなるかもしれません。公開されている大半のスケッチは同じルールで書かれていますので、今からスケッチは一般的なルールで書くようにしましょう。

 

改行のルール

最初は改行のルールです。

1つの命令を書いたら改行するようにします。つまり、1行に1つの命令を書くようにしましょう。

改行のルール

先ほどの極端な例のように1行にいくつでも命令を書くことができますが、1行に2つ以上の命令を書くと読みづらくなります。1つの命令を書いたら改行して、1行に1つの命令を書くようにします。

ただし、1行に複数の命令を書いた方が見やすいケースもありますので、その場面が出てきたときに詳しく説明します。この改行のルールはすでに作成したスケッチで、1行に1つの命令を書いていますので、それほど違和感はないですよね。

 

スペースのルール

次は一番重要なルールです。

今までに作成したスケッチで、loopは以下のようなものでした。loopに4つの命令書きましたが、これらの命令を中括弧が囲んでいましたよね。以下は説明のために4つの命令を「命令1」から「命令4」に置き換えています。

loop関数1階層

これは特に見づらい、ということはないと思います。

でも、基礎編の後半から、loopの中にさらに命令の集まりを書くケースが出てきます。今の知識では正確な理解は難しいですが、イメージを説明します。

さらに複雑な動作をする場合、このloopの命令の集まりの中にさらに命令の集まりを書くケースが出てきます。命令の集まりはこの記事で説明したように「{」「}」で囲みます。

例えば、命令2と命令3の間に、「命令5、命令6、命令7」の3つの命令の集まりを書く場合、以下のようになります。

loop関数2階層

実は、、、さらにその中に命令の集まりが出てくることもあります。例えば、命令5と命令6の間に、「命令8、命令9」の2つの命令の集まりを書く場合、以下のようになります。

loop関数3階層

このようになりますが、なんとなく見づらくありませんか。例えば命令7は何番めの中括弧の中かすぐにわからないですよね。

スケッチの例ではちょっとわかりづらい、という人もいるかもしれません。もっと身近な例で考えてみます。

例えば何泊かの旅行に行くときの持ち物リストを作ってみましょう。貴重品類、電気製品類、日用品類、その他でジャンル分けして以下のようにリストしてみました。

貴重品類
財布
現金
クレジットカード
チケット類
JR乗車券
航空券
保険証
電気製品類
携帯電話
モバイルバッテリー
日用品類
歯ブラシ
歯みがき粉
ハンカチ
ポケットティッシュ
ブラシ
衣類
アンダーウエア
くつした
洋服着替え
その他
ガイドブック
折りたたみ傘
チャック付き袋

これってなんだかわかりづらいですよね。リストにはなっていますが、読みづらいんですよね。

そこで、項目の先頭にスペースを入れて、分類と分類の間に改行を入れてみました。

貴重品類
 財布
  現金
  クレジットカード
 チケット類
 JR乗車券
 航空券
 保険証

電気製品類
 携帯電話
 モバイルバッテリー

日用品類
 歯ブラシ
 歯みがき粉
 ハンカチ
 ポケットティッシュ
 ブラシ

衣類
 洋服着替え
 下着
 くつした

その他
 ガイドブック
 折りたたみ傘
 チャック付き袋

すごく見やすい、ってわけではありませんが、先ほどのようにスペースも改行もない場合に比べて、全体が見やすくなっていますよね。「見やすくなる」という以外にとても重要なことがあります。それは、このチェックリストの全体の「構造」がよくわかる、という点です。

まず大項目として、「貴重品類」「電気製品類」「日用品類」「その他」という分類があり、さらにその下にも分類がある、というリストの構造が見た目でわかります。

たかがスペースや改行ですが、このように使うと全体構造を見た目で表現できる、という点に注目してください。

上の持ち物リストでは、項目の前にスペースを入れました。このスペースを入れることを日本語では「字下げ」、英語では「インデント(indent)」と呼んでいます。

スケッチ(プログラム)を書くときも、内容を読みやすくして、全体の構造がわかりやすくなるようにインデントが用いられています。なおインデントする場合、スペースは半角スペースです。全角のスペースを入れるとArduino IDEに怒られますので十分注意してください。

また、インデントで使用するスペースの数は多くの場合、半角スペース4個または2個です。全体的に半角スペース4個の場合が多いように思います。なお、Arduino IDEのインデントは半角スペース2個がデフォルトです。このシリーズでは、Arduino IDEのデフォルトが半角スペース2個ですので、この設定で進めます。

次に一般的なインデントの入れ方のルールを説明します。

インデントは以下のように「{」と「}」で囲まれた命令は以下のようにインデントします。

インデント1階層

命令の集まりの中にさらに命令の集まりがある場合も同様に、「{」と「}」で囲まれた命令をインデントします。

インデント2階層

最初はわかりづらいかもしれませんが、これからスケッチを作成していくときにインデントがたくさん出てきますので、だんだん慣れていけば大丈夫です。

 

スケッチをさらに見やすくしよう

それでは、LEDを1秒ごとにつけたり消したりするスケッチにインデントを入れましょう。「LED_blink」を開いてください。

最初に以下の手順で、setupの「pinMode(12, HIGH);」にインデントを入れます。

まず「pinMode(12, HIGH);」の先頭にカーソルを持っていきます。

インデント1

ここにインデントを入れるには「TAB」キーを使用します。「TAB」キーは、Windowsの場合は左上の方に「TAB」と書かれているキーがあると思います。Macの場合は「tab」と書かれている場合もありますが、以下のようなマークのついたキーの場合もあります。

Macのタブキー

それでは、「pinMode(12, HIGH);」の先頭にカーソルがある状態でTABキーを押してください。TABキーを押すと以下のように半角スペースが2個挿入されます。

インデント2

次に、loopにある4つの命令もインデントしましょう。

でも命令の先頭にカーソルを持っていきTABキーを押す、というの操作を4回も繰り返すのは面倒ですよね。このように複数の命令をインデントしたい場合、以下の手順で行なってください。

最初にインデントする行をすべて選択状態にします。

インデント3

この状態ができたらTABキーを押します。

インデント4

このように複数行を選択した状態でTABキーを押すと、選択した行すべてがインデントされます。複数行が選択された状態で、さらにTABキーを押すと、どんどんインデントが追加されていきます。

また、インデントを元に戻したい場合は、Shiftキーを押しながらTABキーを押します。

このような機能を活用して、スケッチにインデントを入れるようにしましょう。

 

スケッチ完成

最後にsetupとloopの中の改行を削除しておきます。

関数内の改行の削除

この改行、つまり「{」の直後と「}」の直前の改行は人によっては入れることもありますが、Arduinoのサンプルコードでは改行を入れていませんので、慣習に従って削除することにします。

これでようやくスケッチが完成しました。お疲れさまでした!

 

補足

Arduino IDEではインデントは半角スペース2個ですが、一般的には半角スペース4個の方が多いようです。

Arduino IDEで「TAB」キーを押したときのインデントの半角スペース数の設定は変更できます。ただし、アプリケーションの環境設定ダイアログでは設定できず、設定ファイルを編集することになります。

「TAB」キーを押したときのインデントの半角スペースを4個に変更したい場合は以下の手順で変更してください。

Windowsの場合は「ファイル」→「環境設定」メニューを選択します。macOSの場合は「Arduino」→「Preferences」メニューを選択します。以下のダイアログが表示されます。

環境設定ダイアログ

このダイアログの下の方に「以下のファイルを直接編集すれば、より多くの設定を行うことができます。」と書かれていることころがあります。そのすぐに下にファイルのパスが書かれています。「……..preferences.txt」という文字で終わっています。

ここをクリックします。クリックするとWindowsの場合はエクスプローラ、macOSの場合はFinderのウインドウが開きます。

preferences.txtファイルの場所

ここに「preferenences.txt」というファイルがありますので、これからこのファイルを開いて編集します。間違った場合のためにバックアップを取っておくとよいでしょう。

preferences.txtを開いたら、以下の行がありますので検索します。

editor.tabs.size=2

この数字がインデントをするときの半角スペースの数になります。デフォルトでは2が設定されていますので、半角スペース4個に変更したい場合は「2」を「4」に書き換えます。書き換えたら保存して、Arduino IDEを再起動するとTABキーを押したときの半角スペースが4個になります。

 

 

更新履歴

日付 内容
2019.7.28 新規投稿