■訂正訂正訂正■
またまた電子工作部で教えていただきました。ダメなのはstruct typedefです。typedefをやめてstructなら問題ありません。誤った情報を流してしまい申し訳ありませんでした。
出典のブログ主さんにもコメント欄から訂正をお願いしました。
Arduino(4) ブロック崩しを作ってみる(1)
記事より引用:
しかし残念なことに、「構造体を引数とする関数」はスケッチの中では定義できません。
これを行うには、構造体を別ファイルで定義する必要があるようです。
「原典に当たる」という基本を疎かにしたため、誤報を流布してしまいましたことをお詫び申し上げます。
■typedef渡しでエラー■
このコードをコンパイルしてみてくださひ。ESPの人はそのまま、Arduinoなら最初の3行をコメントアウトして。extern "C" {
#include "user_interface.h"
}
typedef struct {
float temperature;
float humidity;
float pressure;
float airQuality;
} OneData;
void func(OneData *inData) {
}
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
そうすると…
Arduino:
Arduino_Function_Sample.ino:7:11: error: variable or field 'func' declared void
Arduino_Function_Sample.ino:7:11: error: 'OneData' was not declared in this scope
Arduino_Function_Sample.ino:7:20: error: 'inData' was not declared in this scope
variable or field 'func' declared void
ESP-WROOM-02:
Arduino_Function_Sample.ino:2:11: error: variable or field 'func' declared void
Arduino_Function_Sample.ino:2:11: error: 'OneData' was not declared in this scope
Arduino_Function_Sample.ino:2:20: error: 'inData' was not declared in this scope
variable or field 'func' declared void
こんなエラーが出ます。
で、どちらでもエラーとして表示されていないLine 14-16のvoid funcをコメントアウトするとビルド通ります。
なんじゃそりゃあああ
■答え■
スケッチではstructのtypedefを関数の引数として構造体に渡すことができない
仕様だそうです。上記の定義を以下のように書き換えるとコンパイル通ります。
struct DneData_t {
float temperature;
float humidity;
float pressure;
float airQuality;
};
void func(struct OneData_t *inData) {
}
良かった良かった。でも、書いてたコードはもうtypedef渡しではなくGlobal仕様に書き換えちゃったんですよね…まぁ動いてるからいいけど…今後は気をつけます。
今週はやることなすことうまくいかない。
ちゃんと勉強してから使えって話なんですけどねorz
お疲れ様です。
返信削除struct _D_neData_t {
void func(struct _O_neData_t *inData)