在库中定义数组大小,而不必为每次新使用进行修改

Define array size in library without modifying it for every new use?

本文关键字:新使用 修改 不必 定义 数组      更新时间:2023-10-16

示例:类(库)使用默认固定大小的数组。比方说64字节。然而,在程序中,您可能需要更大的大小,比如128字节。如果你不想每次都重写库,最好的方法是什么?

我试图通过以下错误代码(使用#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时为什么会出现编译错误EXAMPLE was not declared in this scope吗#头中的endif行?它不应该是独立于范围的吗?

编译时间

如果您的大小是在编译时定义的,那么您可以使用一个以大小为模板参数的模板类。

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
};

为什么不用数组代替向量,并定义操作向量最大大小的方法。所以类似于:

#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
      }
  }
}

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>();

Arduino IDE在将.ino文件转换为单个.cpp文件时会有一些技巧

  • 创建函数原型
  • 最终重新排序#include(?)

这可能会推迟

#define EXAMLPE 128

我认为模板解决方案最适合arduino。矢量和动态内存使用仅使用2kB RAM(在UNO上)是非常危险的。