簡體   English   中英

在庫中定義數組大小,而無需為每個新用途修改它?

[英]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會執行一些技巧

  • 創建功能原型
  • 最終重新排序#include(?)

這可能會推遲您的

#define EXAMLPE 128

我認為模板解決方案最適合arduino。 僅使用2kB RAM(在UNO上)時,向量和動態內存的使用非常危險。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM