Arduino C++ Class 類別 傳遞 研究
門禁系統越寫越大,加上指紋識別
雖然 Arduino IDE 可以新增另一個檔案放分類的 Function,也算好分類
但是考慮以後寫到其他系統也需要用到差不多的功能
也差不多該包起來,變成一個Class 類別
所以就研究一下類別寫法
用 Arduino for Visual Studio
是最方便的
在 Arduino for VS的專案:"方案總管"內按滑鼠右鍵選"加入" 就會讓你挑
等我自以為的將所有功能分類
共分成 RFC522 , WebServer , EPRom ...幾個Class 加完後
麻煩的事來了
Arduino for VS 顯示沒錯誤....但編譯就是記憶體錯誤
拿 Arduino IDE 來開這專案 再編譯
Arduino IDE 就跑出一堆錯誤...
所以編寫程式 好用是 Arduino for VS
問題查不出來時再用 Arduino IDE 來看
*************************************************
但在用簡單的Class 測試除錯過程時 Arduino for VS 又都表現很好
我猜是因錯誤太多了Arduino for VS 懶得Show 呵!呵!
**********************************************
錯誤太多的問題在於 RFC522 會用到 EPROM 存取資料
WebServer 也會用到,各個類別 用來用去的
之前大家混在一起都是一家人 你用我的 我用你的 沒問題
分開成Class 之後就分得很清楚 不一樣了
所以不是 在主程式一開頭有宣告就好
Arduino for VS 認為是OK 只是編譯不會過
但問題是怎麼將 A 類別 丟到 B類別內 用 (不是Copy 一份)
這就到了我對C 最感冒的"指標" 時間
******************************************
先開2個Class MyC1 MyC2
目的是 將 C1 丟給 C2 處理
測試搞清楚 * & . -> 用法
MyC1.h
MyC2.cpp
所以還是用 Arduino C++ 就直接用Mini D1試
可能用久熟了 比用 C++專案測方便多了
就這樣搞清楚 類別參數 傳遞的方式.
雖然 Arduino IDE 可以新增另一個檔案放分類的 Function,也算好分類
但是考慮以後寫到其他系統也需要用到差不多的功能
也差不多該包起來,變成一個Class 類別
所以就研究一下類別寫法
用 Arduino for Visual Studio
是最方便的
在 Arduino for VS的專案:"方案總管"內按滑鼠右鍵選"加入" 就會讓你挑
等我自以為的將所有功能分類
共分成 RFC522 , WebServer , EPRom ...幾個Class 加完後
麻煩的事來了
Arduino for VS 顯示沒錯誤....但編譯就是記憶體錯誤
拿 Arduino IDE 來開這專案 再編譯
Arduino IDE 就跑出一堆錯誤...
所以編寫程式 好用是 Arduino for VS
問題查不出來時再用 Arduino IDE 來看
*************************************************
但在用簡單的Class 測試除錯過程時 Arduino for VS 又都表現很好
我猜是因錯誤太多了Arduino for VS 懶得Show 呵!呵!
**********************************************
錯誤太多的問題在於 RFC522 會用到 EPROM 存取資料
WebServer 也會用到,各個類別 用來用去的
之前大家混在一起都是一家人 你用我的 我用你的 沒問題
分開成Class 之後就分得很清楚 不一樣了
所以不是 在主程式一開頭有宣告就好
Arduino for VS 認為是OK 只是編譯不會過
但問題是怎麼將 A 類別 丟到 B類別內 用 (不是Copy 一份)
這就到了我對C 最感冒的"指標" 時間
******************************************
先開2個Class MyC1 MyC2
目的是 將 C1 丟給 C2 處理
測試搞清楚 * & . -> 用法
MyC1.h
#ifndef _MYC1_h #define _MYC1_h #if defined(ARDUINO) && ARDUINO >= 100 #include "arduino.h" #else #include "WProgram.h" #endif class MyC1Class { protected: public: int A = 0;//這邊設一個變數 A void init(); }; extern MyC1Class MyC1; #endifMyC1.cpp
#include "MyC1.h" void MyC1Class::init() { } MyC1Class MyC1;MyC2.h
#ifndef _MYC2_h #define _MYC2_h #if defined(ARDUINO) && ARDUINO >= 100 #include "arduino.h" #else #include "WProgram.h" #endif #include "MyC1.h" //要用到 C1 class MyC2Class { protected: public: int A = 0;//這邊也設一個變數 A MyC1Class *C3;//這邊設一個指標*接 讓所有這類別內 所有函式 都可處理 void init(); void Test(MyC1Class& C1); void TTT(); }; extern MyC2Class MyC2; #endif
#include "MyC2.h" void MyC2Class::TTT() { C3->A++; A = C3->A;//指標用裏頭東西是 -> 不能用 . } void MyC2Class::init() { } void MyC2Class::Test(MyC1Class& C1) { C3 = &C1;//將收到 C1 引用 給 C3 TTT(); }主程式:
#include "MyC2.h" #include "MyC1.h" MyC1Class C1;//這邊跟C#觀念不同 一經宣告就佔有實體 MyC2Class C2; MyC1Class *C3;//這邊跟C#還沒New 只是給個位址 指標 void setup() { Serial.begin(115200); Serial.println("*************"); Serial.println("*************"); C3 = &C1;//將C1實體 "&引用" 給 C3 讓C3跟C1是相同位址 C1.A = 10;//給 C1.A 一個值 Serial.println(C1.A); //10 C2.Test( C1 );//C1 丟給C2 處理 C3->A = 20;//指標用裏頭東西是 -> 不能用 . Serial.println("*************"); Serial.println(C1.A);//20 Serial.println("*************"); Serial.println(C2.A);//11 } void loop() { /* add main program code here */ }本想用 VS2017 開個 C++專案測試這問題, 但本人不是專門寫 C++ 不熟卡卡的...
所以還是用 Arduino C++ 就直接用Mini D1試
可能用久熟了 比用 C++專案測方便多了
就這樣搞清楚 類別參數 傳遞的方式.
留言
張貼留言