【问题标题】:C++ / Arduino: dynamic int arrayC++ / Arduino:动态整数数组
【发布时间】:2010-12-05 13:15:58
【问题描述】:

我正在为 Arduino 编写课程。到目前为止一切顺利,但我现在有点卡住了......

我已经在我的班级中声明了一个 int 数组

class myClass
{
  public: MyClass(int size);
  private:
    int _intArray[];
};

当我初始化类 MyClass myClass1(5) 时,我需要数组看起来像这样 {0,0,0,0,0}。

我的问题:我需要做什么才能使数组包含“大小”数量的零?

MyClass::MyClass(int size)
{
    //what goes here to dynamically initialize the array
    for(int i=0; i < size; i++) _intArray[i] = 0;
}

编辑:跟进下面的各种回复,Arduino 不包含标准库,所以很遗憾std::vector 不是一个选项

【问题讨论】:

    标签: c++ arrays class integer arduino


    【解决方案1】:

    我正在写的代码:

    class myClass
    {
      public: MyClass(int size);
      private:
        int _intArray[];
    };
    

    _intArray 的声明无效 C++:原始数组需要在编译时指定大小。

    您可以改为使用std::vector

    class myClass
    {
    public:
        MyClass( int size )
            : intArray_( size )    // Vector of given size with zero-valued elements.
        {}
    
    private:
        std::vector<int> intArray_;
    };
    

    注意 1:一些编译器可能允许您的原始代码作为语言扩展,以支持“struct hack”(这是 C++ 中不需要的 C 技术)。

    注意 2:我已经更改了您成员的名称。通常,名称开头的下划线可能会产生问题,因为它们可能与 C++ 实现中的名称冲突。

    干杯,

    【讨论】:

    • 我收到一条错误消息:“ISO C++ 禁止声明没有类型的 'vector'” ledLib.h:40: 错误:ISO C++ 禁止声明没有类型 MyClass.h:40 的 'vector' : 错误:'::' MyClass.h:40 的使用无效:错误:预期的';'在'
    • @JNK:你是否包含&lt;vector&gt; 标头?
    • 我(现在)包含了它,但它并没有改变任何东西......:(
    • 我找到了一种解决方法,只需将数组传递给类并稍后使用指针......虽然不完美,但它可以工作
    • @JNK:使用原始数组对新手来说有很多问题。如果您想追求那条线,请阅读“三法则”。最简单的方法是让std::vector 工作——这应该不是问题(它适用于其他所有人)。
    【解决方案2】:

    您应该使用 std::vector。

    class myCLass {
    public:
        myClass(int size)
            : intarray(size) {
        for(int i = 0; i < size; i++) intarray[i] = 0;
        }
    private:
        std::vector<int> intarray;
    };
    

    【讨论】:

    • 为什么不 ": intarray(size,0) {" ?
    • @Oxsnarder:嗯,不是很精通向量的构造函数。
    • 不需要归零循环:std::vector 保证将这些元素归零。
    【解决方案3】:

    你真的应该像其他人建议的那样使用向量。一种解决方法可能如图所示(如果您不想使用 memcpy 或循环)。

    如果你有一个非常大的数组,这将很有用。请注意,它会添加一个间接级别来访问数组。

    class myClass 
    { 
    public: 
       myClass(){
          mt = T();    // value initialize.
       }
    private:
       struct T{
          int _intArray[10]; 
       } mt;
    };
    
    int main(){
       myClass m;
    }
    

    【讨论】:

      【解决方案4】:

      我会尝试以下方法:

      class myClass
      {
        public: 
          MyClass(int size);
          ~MyClass();
        private:
          int* _intArray;
      };
      
      MyClass::MyClass(int size) {
        _intArray = new int[size];
        for (int i=0; i<size; ++i) _intArray[i] =0; // or use memset ...
      }
      
      MyClass::~MyClass() {
        delete[] _intArray;
      }
      

      或者,更好的是,改用 STL vector ...

      【讨论】:

        猜你喜欢
        • 2017-07-06
        • 2023-01-24
        • 2022-10-07
        • 2019-06-20
        • 2012-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多