Arduino C++ Class 類別 奮鬥史

將原本程式 改成 Class(類別)的方式 重寫
進行到一半....就覺得自己拿石頭砸自己腳
原本分成各類  .ino 檔存 function 也算好用
就得這樣搞自己...但已到一半不甘心
終於 編譯成功了....
Arduino for VS 真的是錯太多就給2個 out of memory 錯誤
所以真的除錯還是靠 Arduino IDE,錯誤訊息比較詳細

最近 Arduino for VS 改版後 好像修正這問題
錯誤訊息跟 Arduino IDE 同步了...還是我錯誤比較少了?

******************************************
第一個就犯的錯誤也是最後解決的錯誤
就是出現  multiple define 
後來發現 是因為在建立Class 時 他就幫你先宣告起來等了
例如:建立 MyDog Class
會產生
MyDog.h
class MyDogClass
{
......
};
extern MyDogClass MyDog;

MyDog.c
#include "MyDog.h"
......
MyDogClass MyDog;

這樣就已經宣告 了  MyDog
而我又習慣在主程式 開始時才宣告建立 他們來用
所以就產生了重複宣告的問題
把那兩行紅色宣告 拿掉改在主程式宣告
MyDogClass MyDogObj(Soft_RST_PIN, DogWsec);

就沒問題了
一開始沒注意是 因他宣告躲在最底下 一方面還不熟 一方面也沒啥注意
以為改名就好
這下好了 有了2個  MyDogObj 跟 MyDog 同時存在
試因為 debug 時 發現明明已經變更 MyDogObj 內的值
怎麼 MyDog 讀出來卻沒變 仔細看才發現這問題
害我一直 以為 改成 Class 好像是錯誤方向
原來是自己功力不夠 沒發現這問題

原因滿白癡的
一開始建 Class 時例如叫 MyDog
會產生 MyDog.cpp MyDog.h
主程式宣告時
MyDogClass MyDog
這樣就錯了 Class 內就叫 MyDog
這邊再用 MyDog 就會 multiple define
所以改個名字就好了
******************************************
宣告建立 Class 時想傳參數進去 又想裏頭fun都能用
class MyDogClass
{
 protected:
 public:
   MFRC522 * mfrc522;
   volatile int Dog_count=0;
   volatile int Wait_sec = 10;
   int Rst_pin=D2;
MyDogClass();//一定要有個空的 MyDogClass(int pin);//宣告同名就可用 傳入
   void init(int pin);
   void Soft_Rest();
   void WDog_Feed();
};
extern MyDogClass MyDog;
後來覺得 太麻煩 轉來轉去
乾脆 MyDogClass MyDogObj;
 MyDogClass . Rst_pin=D2;
這樣要臨時加入不須去改太多地方

剛剛才知道 宣告時帶入參數的好處
雖然麻煩,但是保證你會記得該傳的有那些 沒傳會有錯誤
用外加方法雖然方便 但 方便過頭
只要漏掉一個 Debug 就有你煩的

******************************************
函數指標
在 ESP8266WebServer  server(80)
有個 CallBack 的用法
 server.on("/", MyRoot);  一開始進來網站 就會 Call function MyRoot()
這個寫在主程式是沒問題
但是 我建立個 Class MyWebServerClass
void MyWebServerClass::MyRoot()
問題是 怎麼 Call 裏頭的 MyRoot()
MyWebServerClass MyWebServerObj;
 server.on("/", MyWebServerObj.MyRoot); 這樣是過不了
在 Class 內 Call
 server->on("/",MyRoot); 這樣也是過不了
找很久 終於看到 有人問 也有人回答

server->on("/", std::bind(&MyWebServerClass::MyRoot, this));

要這樣才 Call 得到 自己 內部的 function
********************************************
Class 如果是用 * 接的話  取用 符號 就用  ->
例如 MyRFC522Class* _MyRFC;
_MyRFC->MyEPRom.SSID_W();
-> 接過來之後內部還是用 . 取用
*********************************
C++是宣告就已經建立了 除非是指標式 * 宣告
不像 C# 是要 new 才算建立實體
*********************************
本來是滿多要寫的...但過了幾天才又回來看 忘了要寫啥了?
有想到再補










留言

熱門文章