エラーメッセージを取得する
今回はエラーが発生した場合のエラーメッセージの取得方法について書いてみました。
コーディングを終了すると、いよいよ次工程の”コンパイル&書き込み”に入ります、無事に完了することを祈りながらも思わず遭遇するのがエラーです。
エラーが発生するとArduinoIDE画面の下部のステータスエリアの背景がグリーンからオレンジに変わります。
そして、その下の部分にエラーメッセージと共にエラー発生時の詳細情報が表示されます。
今回はここに表示されるメッセージの内容の見方について書いていこうと思います。
目 次
【重要】説明に入る前に…
実際にエラーログは処理の途中経過をすべて記載しているのですごい長文です、そしてこれから説明するのはこのとても長いログの取得方法を説明していくのです。
でも、実際にエラー発生時の対処として必要なログはその中の1行~2行程度です。
なので通常のエラー発生時対処法ではメッセージエリアをちょこっとスクロールさせるだけで済んでしまいます。
この方法については記事後半の「エラー発生個所のログはどれか?」に記載しますので先をお急ぎの方はそちらをご一読ください。
エラーログの取得方法
まずはメッセージには何が書かれているなのですが、このメッセージエリアに表示されるのはエラー情報だけでなく、コンパイル開始から書き込み終了までの間の処理の経過が一部始終記載されます。
従って、すごい長文です(コンパイルエラー発生時で30数行)
そしてこのログ全部を見ようと思ったら①メッセージエリアの上下幅を拡げてスクロールして見るか②他のアプリにデータをコピーしてそのアプリ上で観察するという方法しかありません。
スクロールして観察
下図の様に上下に幅を拡大して、更にスクロールバーを併用してみれば全文を観察することができます。
他のアプリで観察
先程も書いたようにとても長文です、なので上の例の様にArduinoIDE上で読むにはとても骨が折れます。
通常はテキスト・エディター上で読みます。
コピーボタンをクリック
方法は、まずは「エラーメッセージをコピーする」ボタンをクリックします、これでログすべてがWindows のクリップボード上にコピーされます。
メモ帳でペースト
次にテキスト・エディター(Winsowsではメモ帳がこれに相当)を起動します、そして画面上に何もないことを確認してからペースト(貼り付け)を実行します。
注)MSワードなどの文書作成ソフトは使わないこと、ログデータは1行当たりの文字数が多いのでこれらアプリにペーストすると行数が異様に増えます。
サンプルファイルをこのリンク先に格納“ErrorLog1.txt”
ログの中味
取得したデータはエラーだけの情報ではなくて一連の処理内容がすべて記録されます。
以下にサンプルログを記載しました。(一行の文字数が長いため途中カットしてます)
注)行当たりの文字数が多く横に長いので下図画面下部の横スクロールバーを使って見てください。
Arduino:1.8.5 (Windows 10), ボード:"Arduino Nano, ATmega328P" C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware (文字数大のため以降行末まで省略) C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware (文字数大のため以降行末まで省略) Using board 'nano' from platform in folder: C:\Users\makmame\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.21 Using core 'arduino' from platform in folder: C:\Users\makmame\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.21 Detecting libraries used... "C:\Users\makmame\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.4-arduino2/bin/avr-g++" (文字数大のため以降行末まで省略) "C:\Users\makmame\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.4-arduino2/bin/avr-g++" (文字数大のため以降行末まで省略) "C:\Users\makmame\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.4-arduino2/bin/avr-g++" (文字数大のため以降行末まで省略) "C:\Users\makmame\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.4-arduino2/bin/avr-g++" (文字数大のため以降行末まで省略) "C:\Users\makmame\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.4-arduino2/bin/avr-g++" (文字数大のため以降行末まで省略) "C:\Users\makmame\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.4-arduino2/bin/avr-g++" (文字数大のため以降行末まで省略) "C:\Users\makmame\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.4-arduino2/bin/avr-g++" (文字数大のため以降行末まで省略) Generating function prototypes... "C:\Users\makmame\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.4-arduino2/bin/avr-g++" (文字数大のため以降行末まで省略) "C:\Program Files (x86)\Arduino\tools-builder\ctags\5.8-arduino11/ctags" -u --language-force=c++ -f - (文字数大のため以降行末まで省略) スケッチをコンパイルしています... "C:\Users\makmame\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\4.9.2-atmel3.5.4-arduino2/bin/avr-g++" (文字数大のため以降行末まで省略) C:\Users\makmame\Documents\Arduino\TemperatureMeasure_7seg_LM61_AVG_DP\TemperatureMeasure_7seg_LM61_AVG_DP.ino: In function 'void setup()': TemperatureMeasure_7seg_LM61_AVG_DP:12: error: expected ';' before 'mag' mag = pow(10, dp); ^ 次のフォルダのライブラリSevenSegment_BW428を使用中:C:\Users\makmame\Documents\Arduino\libraries\SevenSegment_BW428 (legacy) 次のフォルダのライブラリSevSeg-masterバージョン3.3.0を使用中:C:\Users\makmame\Documents\Arduino\libraries\SevSeg-master 次のフォルダのライブラリMovingAverageを使用中:C:\Users\makmame\Documents\Arduino\libraries\MovingAverage (legacy) exit status 1 expected ';' before 'mag'
エラー発生個所のログはどれか?
上のログファイルの中でエラーログはたった2行だけです、22行目と24行目です以下に抜き書きしました。
TemperatureMeasure_7seg_LM61_AVG_DP:12: error: expected ';' before 'mag' mag = pow(10, dp);
このエラーの内容は「セミコロン”;”がmagの前に有るはずです」
ということでソースコード(下図)の11行目の
sevsegBW428.init()の末尾に有るべきはずのセミk論”;”が有りませんのでコンパイルエラーになりました。
実際のエラー発生のタイミングは次の12行目のmag = pow(10,dp);になります、なぜならばセミコロンが無いのはこの行までコンパイルが進まないと判明しなからです。
#include <SevenSegment_BW428.h> SevenSegment_BW428 sevsegBW428; #include <MovingAverage.h> MovingAverage movingAverage(100); const int dp = 1; //小数点以下桁数の指定 int mag; int calValue; int calTemperature; void setup() { sevsegBW428.init() //セミコロン";"が無い mag = pow(10, dp); calValue = 2; } void loop() { int analogIn , temperature , sensorVout , aveTemperature ; analogIn = analogRead(0) ; // アナログ0番ピンからセンサー値を読込む sensorVout = map(analogIn, 0, 1023, 0, 4600) ; // センサー値(デジタル)を電圧に変換する temperature = map(sensorVout, 350, 1450, -25 * mag, 85 * mag) ; // センサー電圧を温度に変換する calTemperature = temperature - calValue * mag; movingAverage.writein(calTemperature); aveTemperature = movingAverage.readout(); sevsegBW428.disp(aveTemperature, dp); sevsegBW428.refresh(); }
次回以降に具体的なコンパイルエラー例と対策を記載した記事を書いていく予定です。