2016年6月18日土曜日

Arduino:関数への構造体渡しで大ハマリ

■訂正訂正訂正■

またまた電子工作部で教えていただきました。ダメなのは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をコメントアウトするとビルド通ります。

なんじゃそりゃあああ

■答え■

Arduino言語ではスケッチ中で関数の引数として構造体を渡すことはできない

そうです(出典:Arduino(4) ブロック崩しを作ってみる(1))。

今まで知りませんでした…。ヘッダなどで定義してC言語としてコンパイルすれば通りますが、うーん、dependencyが…。

しかし…どーしよう。上のソースは28行しかないけど、久しぶりに気合入れてコーディングしちゃったです。300行ぐらい…構造体渡し使いまくりで…。void *で渡してキャストすればいいけど、事故の元だしなぁ…。でもglobalでベターっと書くよりマシかなぁ…。

どーしましょw

スケッチではstructのtypedefを関数の引数として構造体に渡すことができない

仕様だそうです。上記の定義を以下のように書き換えるとコンパイル通ります。

struct DneData_t {
  float temperature;
  float humidity;
  float pressure;
  float airQuality;
};

void func(struct OneData_t *inData) {

}

良かった良かった。でも、書いてたコードはもうtypedef渡しではなくGlobal仕様に書き換えちゃったんですよね…まぁ動いてるからいいけど…今後は気をつけます。

今週はやることなすことうまくいかない。

ちゃんと勉強してから使えって話なんですけどねorz

1 件のコメント:

  1. お疲れ様です。

    struct _D_neData_t {

    void func(struct _O_neData_t *inData)

    返信削除

注: コメントを投稿できるのは、このブログのメンバーだけです。