2016年10月9日日曜日

ArduinoIDEでコンパイルエラー ”****”was not declared in this scope

久々にArduinoを引っ張り出してきて遊んでいたら、
ArduinoIDEでそれまで問題なくコンパイルできていたコードで突然コンパイルエラーが発生。

エラーメッセージは
”****”was not declared in this scope ※****は変数名

これは"****"に記載されている変数や関数名が宣言されてないぞいっていうエラーなんですが、
エラーの原因とされている変数はもちろん宣言していますし、
いくらコードを見ても表記の誤りは見当たらない。

というか、
エラーの原因となっている変数の初期値を変えるとエラーが出たり出なかったりするので
これはもうソースコードの問題ではないかと。

開発環境の問題が疑われたのでIDEの設定がおかしいのかとも思いましたが、
AndroidIDEはシンプルな開発を売りにしているので複雑な環境設定はなく、
変なところは見当たらない。

いろいろいじってみた結果、IDEの"ツール"にある"エンコーディングを修正"を実行すると
コンパイルが通るようになりました。
しかし、代わりにソースコード内のコメントが全て文字化けしました。
これではプログラムを読み返す際に面倒なことになるのでなんとかしたい。

ググってみると、現行のArduinoIDE(現時点ではv1.6.12)では文字コードにUTF-8を使用しているとのこと。
過去のArduinoIDEで作成したコードなどは他の文字コードを使用しているようで、
これを現行のArduinoIDEで使用する際に文字コードを変換する機能として
上で示した"エンコーディングを修正"機能があるようです。
別の文字コードでは文字化けするだけでなくコンパイルエラーも発生するらしいです。

現行のArduinoIDEでゼロからソースコードを書いた場合ははじめからUTF-8で保存されるため
本来は"エンコーディングを修正"を実行する必要はないのですが、
すでに文字コードがUTF-8で書かれているものを更に文字コード変換を実行したため
文字化けしてしまったというわけです。

しかし、なぜゼロから書いてUTF-8で作成されているはずのソースコードのコンパイルが
通らなかったのだろうか。
別のエディタを使用して文字コードUTF-8に設定し、これをArduinoIDEにコピペしても
コンパイルエラーが発生します。

コメントを少しずつ消して試してみたところ、原因はコメント内で使用していた
"―(全角ハイフン)"であることがわかりました。
全角ハイフンをすべて消したところ、"エンコーディングを修正"を実行しなくても
コンパイルが通るようになり、コメントの文字化けも回避できました。

全角記号は文字コードの扱いが少し異なるようで
ArduinoIDEでは使用しないほうが良さそうです。

0 件のコメント:

コメントを投稿