[英]Define array size in library without modifying it for every new use?
示例:類(庫)使用默認固定大小的數組。 假設是64個字節。 但是,在程序中,您可能需要更大的大小,例如128個字節。 如果您不想每次都重寫庫,最好的方法是什么?
我試圖通過遵循WRONG代碼(使用#ifndef
#define
)進行演示:
// myClass.h *****************************************
#ifndef myClass_h
#define myClass_h
#ifndef EXAMLPE
#define EXAMLPE 64
#endif
class myClass{
...
private:
byte myArray[EXAMLPE]; // Use EXAMLPE to allocate array
}
#endif
// Program.ino ***************************************
// Override the default value without modifying the library
#define EXAMLPE 128
#include "myClass.h"
// this does not work because of different scope, says compiler
編輯:我想制作固定大小的數組,因為它很容易,並且在2kb RAM平台上被認為是好的做法
編輯2:我不理解評論中的所有爭論以及為什么我的問題被降級。 我當然不是一個優秀的程序員,我對向量或模板一無所知,這就是為什么我在這里尋求幫助。
我正在尋找一種方法,如何在編譯時從主代碼中設置庫中固定大小的數組。
最后:有人知道為什么我從標題中刪除#ifndef EXAMPLE ... #endif行時EXAMPLE was not declared in this scope
EXAMPLE嗎? 它不是應該獨立於范圍嗎?
編譯時
如果您的大小是在編譯時定義的,則可以使用模板類,並且將大小作為模板參數。
template<int EXAMPLE>
class myClass{
...
private:
byte myArray[EXAMPLE];
};
或者您可以使用std::array
容器。
與運行時間
但是固定大小的數組不是很靈活。 因此,我強烈建議改用向量 。 您不僅可以為向量設置默認大小,而且可以動態調整此大小,而不必擔心內存管理,復制構造函數,賦值運算符等。
class myClass {
public:
myClass(int mysize=64) : myVector(mysize) {}
private:
std::vector<byte> myVector; // no size needed here
};
C ++不支持運行時大小的數組。 因此,如果您在編譯時不知道需要多大的內存,則該數組將是錯誤的工具。 相反,我建議讓您的對象僅包含一個指針,然后使用new根據某個運行時值動態分配數據塊。
請注意,以下代碼僅用於演示上面表達的思想,未經測試,並且可能無法編譯。
class myClass {
private:
byte *myData;
public:
myClass(std::size_t dataSize) :
myData(new byte[dataSize])
{}
myClass(const myClass&) = delete;
myClass(myClass&&) = delete;
myClass& operator=(const myClass&) = delete;
myClass& operator=(myClass&&) = delete;
~myClass()
{
delete[] myData;
}
};
另一方面,如果在編譯時知道大小,但是您不希望每次需要更改大小時都可以編輯頭文件,而可以使用模板類,它們允許用戶在使用時提供編譯時參數。班級。 例如:
template<size_t dataSize>
class myClass {
private:
byte myArray[dataSize];
};
然后可以使用在編譯時已知的自定義大小來創建該類,如下所示:
auto foo = myClass<128>();
為什么不使用數組代替向量並定義方法來控制向量的最大大小。 所以像這樣:
#include <vector>
myClass{
private:
vector<int> v;
int maxSize
public:
myClass(int size){
v.reSize(size);
maxSize = size;
}
void add(int byte){
if(v.size()<maxSize){
v.push_back
}
}
}
將.ino文件轉換為單個.cpp文件時,Arduino IDE會執行一些技巧
這可能會推遲您的
#define EXAMLPE 128
我認為模板解決方案最適合arduino。 僅使用2kB RAM(在UNO上)時,向量和動態內存的使用非常危險。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.