Super169 发表于 2014-4-1 11:07:25

如何把一個庫分拆開

本帖最后由 Super169 于 2014-4-1 11:09 编辑

做了一個比較複雜的庫, 當中有很多針對不同硬件的檢測.
現在想把它分拆開對應不同的硬件, 先做一個基本共用的庫, 再繼承這個庫而做出針對不同硬件的庫.

如果把所有檔案放在同一目錄下, 已基本上成功.但問題出現了, 基本的庫是共用的, 不應該放在任何一個繼承的庫內.
當我把它抽出來, 放內自己的目錄下, 就不能被繼承了.

把程序不斷簡化後, 發覺一個簡單的庫也不行: (CLASS_1 是基本的, CLASS_2 繼承 CLASS_1 )

CLASS_1.h
#ifndef _CLASS_1_H_
#define _CLASS_1_H_

#include "Arduino.h"

class CLASS_1 {
        public:
                virtual void setCount(uint16_t cnt);
                uint16_t getCount();
               
        protected:
                int _count;
               
        private:
};
#endif


CLASS_1.cpp
#include "CLASS_1.h"

uint16_t CLASS_1::getCount() {
        return _count;
}

CLASS_2.h
#include "CLASS_1.h"

uint16_t CLASS_1::getCount() {
        return _count;
}

CLASS_2.cpp
#include "CLASS_1.h"
#include "CLASS_2.h"

CLASS_2::CLASS_2() {
}

void CLASS_2::setCount(uint16_t cnt) {
        _count = cnt;
}

/*
uint16_t CLASS_2::getCount() {
        return _count;
}
*/

如果全都放入 libraries\CLASS_2 的目錄下, 是完全可以正常執行的.但由於 CLASS_1 還要被其他庫繼承來用, 不可能放到 CLASS_2 內.但當我把 CLASS_1.h 及 CLASS_1.cpp 抽出來, 放到 libraries\CLASS_1 之下時 (這才是正確放置 CLASS_1 的地方), 再 compile 以下測試碼時,

#include "Arduino.h"
#include <CLASS_1.h>
#include "CLASS_2.h"


CLASS_2 a;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
delay(100);
a.setCount(10);
Serial.println(a.getCount());
}

void loop() {
// put your main code here, to run repeatedly:

}

就會出現 error:

In file included from CLASS_Tester.ino:3:
E:\my.Files\Arduino\sketchbook\libraries\CLASS_2/CLASS_2.h:7: error: expected class-name before '{' token
CLASS_Tester.ino: In function 'void setup()':
CLASS_Tester:13: error: 'class CLASS_2' has no member named 'getCount'


請問如果要把 CLASS_1 及 CLASS_2 分開放入 libraries 下同名的目錄, 以上有地方做錯了嗎?

Super169 发表于 2014-4-1 12:08:54

自問自答.....攪了大半天都不成功, close Arduino 再開, 竟然就自動解決了.

可能 libraries 中某些東西是在開啟 arduino 時便記下了, 我在中途把 CLASS_1 的檔案由 CLASS_2 目錄搬到 CLASS_1 目錄後, 不能即時認出來.要重啟一次才可以用.

天呀........今天早上就這樣子白白浪費了. :'( :'( :'(

pathletboy 发表于 2014-4-1 13:52:17

骚年何不试试sublime+stino,可以很方便的模块化。

Super169 发表于 2014-4-1 14:07:19

pathletboy 发表于 2014-4-1 13:52 static/image/common/back.gif
骚年何不试试sublime+stino,可以很方便的模块化。

oh..要試試, 未用過, 不知有這東西.容易用的嗎?是否直接下載了就可以用, 有沒有什麼設定才可以配合 Arduino?

pathletboy 发表于 2014-4-1 14:09:09

Super169 发表于 2014-4-1 14:07 static/image/common/back.gif
oh..要試試, 未用過, 不知有這東西.容易用的嗎?是否直接下載了就可以用, 有沒有什麼設定才可以配合 A ...

先下sublime然后装stino插件,装插件网上有教程,搜索下就有,很容易。

Super169 发表于 2014-4-1 14:11:37

本帖最后由 Super169 于 2014-4-1 14:13 编辑

pathletboy 发表于 2014-4-1 14:09 static/image/common/back.gif
先下sublime然后装stino插件,装插件网上有教程,搜索下就有,很容易。

謝謝, 回家後要試試.看到你的畫面, 感覺好像比現在的好得多, 一定要試試.

請問是否可以直接上傳到 arduino 板子上, 還是只有 editor 功能, 最後要經 arduino 程式 upload?

Super169 发表于 2014-4-1 15:22:21

pathletboy 发表于 2014-4-1 14:09 static/image/common/back.gif
先下sublime然后装stino插件,装插件网上有教程,搜索下就有,很容易。

感謝 ching, 剛剛下載試了, 真係好正, 好正, 非常正!{:soso_e179:} {:soso_e179:} {:soso_e179:}

終於有個像樣的 IDE 可以用了, 唔再需要經常開 header file 找尋有關 method, 已經方便很多了.

雖然今日浪費了一個上午在一個無意義的問題上, 但因為這個問題開了這個 post, 得到一個非常有用的 IDE, 總算有價值.

pathletboy 发表于 2014-4-1 17:13:22

工欲善其事必先利其器{:soso_e120:}

Super169 发表于 2014-4-1 17:45:49

pathletboy 发表于 2014-4-1 17:13 static/image/common/back.gif
工欲善其事必先利其器

剛剛碰到一個好怪既問題....用 sublime 跟 arduino 執行既結果不同.

因為我正在編寫一個庫, 不斷修改庫的內容, 我發覺 sublime 是會對新的庫檔案進行 verify (我故意加入錯誤, 會被指出來), 但執行的時候, 還是在用一個舊版本....那應該是我剛安裝完 sublime 時的一個. 它好像收藏了一個 backup 似的, 不論怎樣改庫的程式, 執行時都是當初的舊版本.我甚至把庫中一些 除蟲句子改了 (例如原來是 "123" 改成 "abc"), 再 upload 一次, 沒有錯誤, 但印出來的還是 "123".

但這問題只出現在修改庫的內容, 如果是修改主程式, 每次都可以用到最新的, 但就是配合一個已不存在的庫.真是奇怪得很.

真的難以理解, 我甚至找到了有關的 Arduino_Build folder, 把所有內容清空, 結果它還是可以用一個舊版本的庫做出程式.


請問 ching 有類似情況嗎?現在只好用 sublime develop, verify, 但 upload 就用回 arduino.
要把問題的原因攪清楚, 不想浪費了一件好工具.

Super169 发表于 2014-4-1 18:06:16

今天我是活見鬼了, 忽然正常了.剛才真的很認真改了很多次, 每次再 upload 都還是舊庫, 只有改主程式才會更新, 但也不包括庫的改動.在 Arduino 完全沒問題.
我也試了好幾次, 在 Arduino upload 一次, 再用 sublime 開啟同一個程式再 upload 一次, 結果就是不同.


現在又一切正常了, 改好了的庫, 用 Sublime upload 也可以取得最新的......見鬼.今天不宜做庫了. :funk:

pathletboy 发表于 2014-4-1 18:09:19

Super169 发表于 2014-4-1 18:06 static/image/common/back.gif
今天我是活見鬼了, 忽然正常了.剛才真的很認真改了很多次, 每次再 upload 都還是舊庫, 只有改主程式才會更 ...

你要选中完整编译,不选完整编译的话,库文件只会在开始编译一次。

pathletboy 发表于 2014-4-1 18:11:26

一般这种自定义库直接丢工程目录即可,不要去动arduino的官方库。

Super169 发表于 2014-4-1 18:28:03

本帖最后由 Super169 于 2014-4-1 18:29 编辑

pathletboy 发表于 2014-4-1 18:09 static/image/common/back.gif
你要选中完整编译,不选完整编译的话,库文件只会在开始编译一次。

Full Compilation 預設已是選了, 我也有懷疑過這設定, 所以 uncheck 過 又再 check 了.另外亦試過 改變 Global Settings (只是 uncheck 了再 check 回).也許是因為變動過才生效?最重要是現在一切正常了.

請問 工程目錄 是否就是 sketchbook 目錄下的 libraries 目錄?我一直都是放這裡, 跟其他下載的庫一樣.
至於 arduino 程式下的 libraries, 只是抄了一些檔案到別處研究, 並沒有修改它們.

pathletboy 发表于 2014-4-1 19:15:20

Super169 发表于 2014-4-1 18:28 static/image/common/back.gif
Full Compilation 預設已是選了, 我也有懷疑過這設定, 所以 uncheck 過 又再 check 了.另外亦試過 改 ...

你的情况我都没碰到过。
我指的工程目录是和你.ino文件所在目录,至于要不要建立2级文件夹这个根据你自己需求来。
你可以设置这个目录下%USERPROFILE%\AppData\Roaming\Sublime Text 2\Packages\Arduino-like IDE的stino.settings这个文件。其中build_folder建议设置为"build_folder": ".", ,也就是.ino当前目录。

Super169 发表于 2014-4-1 19:31:26

pathletboy 发表于 2014-4-1 19:15 static/image/common/back.gif
你的情况我都没碰到过。
我指的工程目录是和你.ino文件所在目录,至于要不要建立2级文件夹这个根据你自己 ...

謝謝你的資料.
為了方便管理, 我把 build path 設定在 sketchbook 之下的 Build 目錄, 跟 libraries 及 sketches (我用來放置 ino 的地方) 平排.

現在好像都正常了, 可以安心使用, 真的非常方便.
页: [1]
查看完整版本: 如何把一個庫分拆開