【Arduino】「’xxx’ was not declared in this scope 」エラーが出る時の対処法(C言語/C++)

Arduino IDE

※この記事の所要時間は1分です。

原因

関数内で使用している変数や関数名(’xxx’)が使える形で定義されていない。

下記の例でいえば、gyro_xなどの変数が全て別のローカルスコープ内に存在しており、参照することが出来ない状態。

  M5.IMU.getGyroData(&gyro_x, &gyro_y, &gyro_z);   M5.IMU.getAccelData(&acc_x, &acc_y, &acc_z);   imu.Update(kSamplingFrequency, gyro_x, gyro_y, gyro_z, acc_x, acc_y, acc_z);   imu.GetAHRSData(&pitch, &roll, &yaw);   M5.IMU.getTempData(&temp);

スコープについては、こちらの記事で分かりやすく解説されている。詳しく知りたい人は是非。

解決法

簡単で、関数内で使用している変数名を定義してやればよい。
やり方は以下の二通り。

ローカル変数として定義する

loop関数内でしか使わない変数であれば、こちらのやり方がオススメ。

このように、適切な型を頭に付けて必要な変数などを全て定義する。

   float gyro_x, gyro_y, gyro_z, acc_x, acc_y, acc_z;   float pitch, roll, yaw;   float temp;

同じ変数をこの関数外でも使う場合は、引き続き同じエラーが出るので注意

その場合は次のグローバルスコープに定義する形を取ろう。

グローバル変数として定義する

こちらは、ぐぐーっと場所が変わり、全ての関数の外で定義する。
今回は、わざと分かりやすくプログラムの先頭に書いた。

此方で問題なく動くようになるが、「じゃあ全ての変数をグローバルスコープにしたらいいじゃん」としてしまうと、数千~数万行のソースコードを書く時にとんでもないことになるので注意。

まとめ

必要な定義は必要な範囲の中でだけ、という思想設計で挑むことで、同じ挙動でもプログラムの可読性は桁違いに変わる。

数百行程度の小規模なソースコードを一人で書く分には多少雑に宣言しても問題ないが、最初のうちから「この変数はどこで定義すれば綺麗か」とスコープを意識して書くだけでかなり見栄えが変わるという点だけは留意しておこう。

まる。

Python歴5年のフルスタックエンジニア&ヨギー。
大学は心理学、趣味はヘルスケア全般。

最近は自作脳波デバイスとそれを使ったインタラクティブアートのチューニングに勤しみ中。
お仕事の依頼はDMもしくはメールにて。

↓アートとかの趣味アカ。よかったらみてね。٩(๑❛ᴗ❛๑)
Insta:@malmal0v0

まる。をフォローする
その他の記事はこちら
【4K60fpsキャプチャソフト】EaseUS RecExperts Pro版の機能を使ってレビューしてみた。(Windows/Mac対応)
【C++/Arduino】文字列をシンプルに結合する方法
【C++】追加の変数宣言・格納なしに効率良く文字列を追加させる方法
【C/C++】could not convert ‘xxx’ from ‘std::__cxx11::string’ {aka ‘std::__cxx11::basic_string‘} to ‘String’と出る時の解決法
【格安SIM】povo2.0にてテザリングができない時の解決法(Android)

タイトルとURLをコピーしました