9 years, 1 month ago.

mbed標準で用意されているクラスを複数のファイルから使えるようにするにはどうしたらよいのでしょうか

これは、言語の基本的な事柄かと思うのですが、理解できておらず申し訳ありませんが、ずっと困っていて、周囲に質問できる人もいないため、ここで質問させていただきます。

PWMでブザーを鳴らしたい。KL25Zを使っています。

PwmOut Buzz(PTD4);
main(){
  Buzz=0.5;
  Buzz.period_ms(1);
}

これはこれでOKなのですが、このmain.cppで定義したBuzzをほかのファイルからも使えるようにするにはどうしたらよいのでしょうか。

たとえば、複数の音を鳴らすため、Buzzer関数をいくつか作って、oto.h,oto.cppに関数を作ります。 で、その関数の中で、Buzz=0.5 とかしたいのですが。

どこかで一回定義したら使えるような気がして main.cppのPwmOut の定義を削除して、oto.hにそれを書いて、main.cppからoto.hをincludeすると、二重に定義されていますとのエラーになります。(一箇所しかないのに)

Quote:

関数や計算するだけのクラスを作って、externを使うとエラーにならないんですが、同じことを、PwmOutやDigitalInなどでやるとエラーを出してくれるんです。

なるほど。コードを見ないと何とも言えないんですが、extern 宣言の方はインスタンス名だけ宣言されていますか?定義の方と全く同じように記述してしまうと、コンストラクタを呼ぶコードになってしまって、多重定義のエラーが出ると思います。

例えば、定義側のコードが以下のようになっているとすると:

PwmOut Buzz(PTD4);
main(){
  Buzz=0.5;
  Buzz.period_ms(1);
}

別ソースのextern宣言を使ったコードは、以下のように記述します。

extern PwmOut Buzz;
void test(){
  Buzz=0.2;
}
posted by Toyomasa Watarai 03 Mar 2015

おお!、ありがとうございます!おっしゃるとおりです。 とおりました。 mbedを使い始めてから、1年以上たつんですが、なんでできないんかわからず、 いつもmain.cppの中に、全部の記述を書いてました。見づらくて見づらくて。 これでまたたくさん遊べそうです。

posted by Imayan chan 03 Mar 2015

1 Answer

9 years, 1 month ago.

こんばんは。

こちらが参考になるのではないでしょうか? http://d.hatena.ne.jp/saitodevel01/20110321/1300685958

ヘッダファイルではなく、ひとつのソースファイルに定義を書いて、別のソースから参照する場合は extern 宣言を使う方法です。共通のヘッダファイルに extern 宣言しても良いと思います。

ありがとうございます。読みましたが、 ぼく、いろんなページを見てやってみてるんですが、どれもエラーになるんです。 関数や計算するだけのクラスを作って、externを使うとエラーにならないんですが、同じことを、PwmOutやDigitalInなどでやるとエラーを出してくれるんです。

posted by Imayan chan 03 Mar 2015