极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14621|回复: 14

如何把一個庫分拆開

[复制链接]
发表于 2014-4-1 11:07:25 | 显示全部楼层 |阅读模式
本帖最后由 Super169 于 2014-4-1 11:09 编辑

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

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

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

CLASS_1.h
[pre lang="arduino" line="1" file="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
[/code]

CLASS_1.cpp
[pre lang="arduino" line="1" file="CLASS_1.cpp"]#include "CLASS_1.h"

uint16_t CLASS_1::getCount() {
        return _count;
}[/code]

CLASS_2.h
[pre lang="arduino" line="1" file="CLASS_2.h"]#include "CLASS_1.h"

uint16_t CLASS_1::getCount() {
        return _count;
}[/code]

CLASS_2.cpp
[pre lang="arduino" line="1" file="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;
}
*/[/code]

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

  1. #include "Arduino.h"
  2. #include <CLASS_1.h>
  3. #include "CLASS_2.h"


  4. CLASS_2 a;

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

  12. void loop() {
  13.   // put your main code here, to run repeatedly:
  14.   
  15. }
复制代码


就會出現 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 下同名的目錄, 以上有地方做錯了嗎?
回复

使用道具 举报

 楼主| 发表于 2014-4-1 12:08:54 | 显示全部楼层
自問自答.....攪了大半天都不成功, close Arduino 再開, 竟然就自動解決了.

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

天呀........今天早上就這樣子白白浪費了.
回复 支持 反对

使用道具 举报

发表于 2014-4-1 13:52:17 | 显示全部楼层
骚年何不试试sublime+stino,可以很方便的模块化。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-1 14:07:19 | 显示全部楼层
pathletboy 发表于 2014-4-1 13:52
骚年何不试试sublime+stino,可以很方便的模块化。

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

使用道具 举报

发表于 2014-4-1 14:09:09 | 显示全部楼层
Super169 发表于 2014-4-1 14:07
oh..要試試, 未用過, 不知有這東西.  容易用的嗎?  是否直接下載了就可以用, 有沒有什麼設定才可以配合 A ...

先下sublime然后装stino插件,装插件网上有教程,搜索下就有,很容易。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-1 14:11:37 | 显示全部楼层
本帖最后由 Super169 于 2014-4-1 14:13 编辑
pathletboy 发表于 2014-4-1 14:09
先下sublime然后装stino插件,装插件网上有教程,搜索下就有,很容易。


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

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

使用道具 举报

 楼主| 发表于 2014-4-1 15:22:21 | 显示全部楼层
pathletboy 发表于 2014-4-1 14:09
先下sublime然后装stino插件,装插件网上有教程,搜索下就有,很容易。

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

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

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

回复 支持 反对

使用道具 举报

发表于 2014-4-1 17:13:22 | 显示全部楼层
工欲善其事必先利其器{:soso_e120:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-1 17:45:49 | 显示全部楼层
pathletboy 发表于 2014-4-1 17:13
工欲善其事必先利其器

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

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

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

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


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

使用道具 举报

 楼主| 发表于 2014-4-1 18:06:16 | 显示全部楼层
今天我是活見鬼了, 忽然正常了.  剛才真的很認真改了很多次, 每次再 upload 都還是舊庫, 只有改主程式才會更新, 但也不包括庫的改動.  在 Arduino 完全沒問題.
我也試了好幾次, 在 Arduino upload 一次, 再用 sublime 開啟同一個程式再 upload 一次, 結果就是不同.


現在又一切正常了, 改好了的庫, 用 Sublime upload 也可以取得最新的......見鬼.  今天不宜做庫了.
回复 支持 反对

使用道具 举报

发表于 2014-4-1 18:09:19 | 显示全部楼层
Super169 发表于 2014-4-1 18:06
今天我是活見鬼了, 忽然正常了.  剛才真的很認真改了很多次, 每次再 upload 都還是舊庫, 只有改主程式才會更 ...

你要选中完整编译,不选完整编译的话,库文件只会在开始编译一次。
回复 支持 反对

使用道具 举报

发表于 2014-4-1 18:11:26 | 显示全部楼层
一般这种自定义库直接丢工程目录即可,不要去动arduino的官方库。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-1 18:28:03 | 显示全部楼层
本帖最后由 Super169 于 2014-4-1 18:29 编辑
pathletboy 发表于 2014-4-1 18:09
你要选中完整编译,不选完整编译的话,库文件只会在开始编译一次。


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

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

使用道具 举报

发表于 2014-4-1 19:15:20 | 显示全部楼层
Super169 发表于 2014-4-1 18:28
Full Compilation 預設已是選了, 我也有懷疑過這設定, 所以 uncheck 過 又再 check 了.  另外亦試過 改 ...

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

使用道具 举报

 楼主| 发表于 2014-4-1 19:31:26 | 显示全部楼层
pathletboy 发表于 2014-4-1 19:15
你的情况我都没碰到过。
我指的工程目录是和你.ino文件所在目录,至于要不要建立2级文件夹这个根据你自己 ...

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

現在好像都正常了, 可以安心使用, 真的非常方便.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 16:34 , Processed in 0.037822 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表