質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.53%

【Arduino】XXX was not declared in this scopeというコンパイルエラー

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 33K+
退会済みユーザー

退会済みユーザー

PCからAuduinoを通して,Roombaを自由に操作するプログラムを作成しています.

参考にしているサイトはこちらです.
ArduinoからRoombaをSoftware Serialで動かす 

ArduinoとRoomba間のシリアル通信プログラムを作成し,次にPC(C++)とArduino間のシリアル通信プログラムを作成しました.
実行させたところ問題なく動いています.

しかし,いつも作業しているPCから,別のPCにArduinoのスケッチファイルを持ってくると,

XXX was not declared in this scope

というコンパイルエラーが発生します.(XXXは関数名)

実行させているソースは以下です.

#include <SoftwareSerial.h>
SoftwareSerial device(10, 11);

void setup(){
  Serial.begin(9600);
  device.begin(115200);
}

void loop(){
  if(Serial.available() > 0){
    int cmd = Serial.read();
    switch(cmd){
      case 244: motor (-64,-64);break;
      case 255: motor( 0, 0); break;

      default: motor(  0,   0); break; 
    }
  }
}

void motor(int l, int r){
  byte buffer[] = {
    byte(128), // Start
    byte(132), // FULL
    byte(146), // Drive PWM
    byte(r>>8),
    byte(r),
    byte(l>>8),
    byte(l)
  };
  device.write(buffer, 7);
}

片方のPCでは全く問題なくコンパイルが通るのに,もう1つの別のPCでコンパイルを通そうとすると,

'motor' was not declared in this scope

というコンパイルエラーがでてしまいます.

自分で調べてみた結果,どうやら関数を見つけれていないみたいなのですが,修正方法が分かりません.
どのようにしたら直るのでしょうか.

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2016/11/22 14:38

    Arduinoではよくあることなのでしょうか.

    キャンセル

  • ikedas

    2016/11/22 15:23

    というか、「関数の宣言はその関数の呼び出しがあるよりも前にすませておく」というほうが普通です。ヘッダファイルのインクルードはソースファイルの最初でやるでしょう? それと同じ。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/11/22 15:48

    初めて勉強した言語がC言語だったため,それのプロトタイプ宣言の癖があるから後ろに書いてしまっていました.今後はできるだけ前のほうに書くようにしてみます.

    キャンセル

回答 1

checkベストアンサー

0

arduino IDEなので設定とか無いし、バージョンが同じという事なので、非常に難解な問題と認識しています。
以前、似たような現象の時は、コンパイラの仕様かと思い、'void loop'の前にエラーになった関数を移動したら動いたという経験があります。
一度、’void motor’を移動して試してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/22 13:41

    'void motor'を'void loop'の前に移動させたところ,無事コンパイルが通りました.
    根本的な原因がわからないのですが,Arduinoではよくあることなのでしょうか.

    もしこのようなことについて記述しているサイト等があれば教えていただきたいです.

    キャンセル

  • 2016/11/22 15:07

    arduinoはC++もどきで、基本的には関数のプロトタイピングは不要なのですが。気になったのは#includeの後に’SoftwareSerial device(10, 11);’としているのをsetup()の中に書かれた方が良いと思います。これは先ほどのプロトタイピングに少しだけ関係するのですが、arduinoの特有の癖でプロトタイピングを#defineとかの直後にすると間違えることがある。今回は関数を呼ぶソースの前に関数を定義しているので、コンパイラは関数の素性を分かってコンパイルしているのが元ソースと異なる部分です。でもマシンが違うだけでエラーになったりならなかったりはちょっと説明にはなりませんが。

    キャンセル

  • 2016/11/23 15:31

    参考までに-評価を頂きました。後学の為、どの部分が誤りかのご指摘を頂ければ幸いです。

    キャンセル

  • 2016/11/23 16:44

    m1kanch0rさん。
    本題とは少し外れますが、arduinoでのコーディングについて、参考になるページがありました。
    http://qiita.com/loonaifactory/items/1ddf0ec394ed42285b1b

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる