c++ arduino官网 - 在Arduino草圖中包含.cpp和.h文件的正確方法





library教學 include (2)


它不起作用的原因是你需要在你的ah或a.cpp文件中包含一些東西。

試試這個在你的啊文件,然後一切都應該工作。

#ifndef H_A
#define H_A

#include <Arduino.h> //needed for Serial.println
#include <string.h> //needed for memcpy

...

原因是你可以想像編譯器分別編譯每個cpp文件。 #include實際上只是一個自動複製粘貼。 當編譯器來編譯a.cpp時,它不知道Serial.println()是否存在,因為它沒有在ah中定義,這是唯一出現在a.cpp中的其他文本。 把它放在標題中的原因是你的主cpp文件中包含了Arduino.h,所以一旦這些#includes被複製粘貼了,就好像你只是在那裡寫代碼一樣第一個地方。

你可以把所有的代碼寫在頭文件中,但是由於各種原因,包括編譯時的效率,這是不可取的(但是由於arduino程序只能是32k,所以我認為編譯時間不會太長!)

一,問題:

主草圖文件:

char foo;            // required to clean up some other problems
#include <Arduino.h> // tried it in desperation, no help
#include "a.h"

void setup(){
  Serial.begin(9600);
  Serial.println("\nTest begins");
  for (int num = -1; num < 1; num++){
    Serial.print(num);
    if (isNegative(num)){
      Serial.println(" is negative");
    } else {
      Serial.println(" is NOT negative");
    }
  }
}

void loop(){}

//啊

#ifndef H_A
#define H_A

boolean isNegative(int x);                  // Err#1
int anotherOdity();

#endif // H_A

// a.cpp

#include "a.h"

int isNegative(int x){
  Serial.println("I can't print this from inside my INCLUDE FILE"); //Err#2
  if (x<0) return true;
  return false;
}

int anotherOdity(){
  char ch[5];
  memcpy(ch,"1",1);  //doesn't work, memcpy not declared      // Err#3
}

以上是,不編譯,這是我得到的錯誤:

In file included from a.cpp:1:
a.h:4: error: 'boolean' does not name a type
a.cpp: In function 'int isNegative(int)':
a.cpp:4: error: 'Serial' was not declared in this scope
a.cpp: In function 'int anotherOdity()':
a.cpp:11: error: 'memcpy' was not declared in this scope

第一個問題是布爾類型,似乎受到Arduino環境中的一些名稱的干擾,但通常由char foo; 在主文件中。 在某些情況下,它是。 但是在.cpp文件中使用該類型會生成此錯誤。

我可以看到錯誤2和錯誤3是相關的,但是我怎樣才能得到這些錯誤呢? 我意識到問題的一部分可能是#include本身(也許),因為Serialmemcpy尚未定義/聲明? 我嘗試了包括Arduino.h庫,但是沒有幫助。 實際上,它確實幫助了布爾問題,但是只有在將所有內容放在.h文件中的情況下(我將在下面進一步討論),這對上面的例子沒有幫助。

如果我把三個文件放在一起,並且在主草圖( .ino )文件中包含所有內容,那麼它就像它應該那樣工作。 但這裡的想法是我想打破一些代碼,使我的素描更可讀。

我找到了最接近的解決方案: http : //liudr.wordpress.com/2011/02/16/using-tabs-in-arduino-ide/在運行我自己的測試後,我確定如果我把所有東西放在一個.h文件,它的工作原理!

例如,將主草圖文件保持不變,如果我刪除a.cpp並創建只是ah (如下)它的作品!

#ifndef H_A
#define H_A

boolean isNegative(int x){
  Serial.println("I can't print this from inside my INCLUDE FILE");
  if (x<0) return true;
  return false;
}

int anotherOdity(){
  char ch[5];
  memcpy(ch,"1",1);  //doesn't work, memcpy not declared
}

#endif // H_A

這修正了布爾問題(好吧....我仍然需要Arduino.hchar foo; ),它修復範圍問題。

但它只是感覺不對。

這不是要創建一個我可以在各種草圖中使用的標準函數庫,而是將我的代碼分解成更小的(可讀的)塊,並將它們全部放在項目文件夾中。 我想以最正確的方式做到這一點,它似乎是我受IDE的限制。 我確定我對如何把頭文件和關聯的.cpp文件放在一起(我希望我沒有弄錯那部分)有一個合適的理解。

我完全自學了一切C / C ++,並且最近才真正進入編程微軟。

我已經通過谷歌的深度研究了這一點,我只是不斷地做出來。

不要訴諸hacks並保持像我這樣的民眾簡單,我怎麼能最好的把上面的例子,以便Arduino的IDE /海灣合作委員會編譯它呢?

編輯:我以為我會包括一些我已經打開的標籤顯示,我真的已經做了一些研究!

http://arduino.cc/en/Reference/Include

http://arduino.cc/en/Hacking/LibraryTutorial

http://forum.arduino.cc/index.php/topic,124904.msg938861.html#msg938861

http://forum.arduino.cc/index.php?topic=84412.0 (這是我找到char foo;解決方案)

http://liudr.wordpress.com/2011/02/16/using-tabs-in-arduino-ide/

包括.cpp文件

將所有庫保存在Arduino草圖目錄中

C ++頭和CPP包括




我想你一般都回答了你自己的問題,但是,這個:

不像樹一樣緊湊。 (出於實際目的,載荷因子永遠不會是1)

不一定是真的。 對於類型T ,樹的每個節點(我們假設它是紅黑樹)利用等於至少2 * pointer_size + sizeof(T) + sizeof(bool) 。 這可能是3 * pointer size具體取決於樹是否包含每個樹節點的parent指針。

將其與散列映射進行比較:由於load factor < 1因為您已經說過,每個散列映射都會浪費數組空間。 但是,假設哈希映射使用單鍊錶進行鏈接(實際上,沒有真正的理由不這樣做),插入的每個元素只佔用sizeof(T) + pointer size

請注意,此分析忽略了可能來自對齊使用的額外空間的任何開銷。

對於具有小尺寸的任何元素T (因此,任何基本類型),指針的大小和其他開銷占主導地位。 在加載因子> 0.5 (例如)時, std::unordered_set實際上可能比等效的std::set使用更少的內存。

另一個重要的std::set是,基於給定的比較函數,迭代通過std::set保證產生從最小到最大的排序,而迭代通過std::unordered_set將返回“隨機”中的值“訂單。





c++ include arduino header-files arduino-ide