C ++动态大小的多维数组的变通方法

时间:2018-05-31 14:24:01

标签: c++ arrays dynamic parameters arduino-ide

我正在为动态大小的二维数组寻找一个简单的解决方法作为参数,从字面上可以轻松使用5年级的学生。我目前正在为一个微控制器研讨会编写一个库,希望它尽可能简单易用,而不必解释指针,模板等等,因为现在还没有时间去做。

我有以下类,名为LEDBitmap,由于另一个库中的约束,其最大宽度为8,并表示LED矩阵的1和0位图:

标题文件:

#ifndef LEDBITMAP_H
#define LEDBITMAP_H

#include <Arduino.h>

class LEDBitmap
{

  public:
    LEDBitmap(uint8_t width, uint8_t height, uint8_t data[][8]);
    LEDBitmap(uint8_t width, uint8_t height);
    virtual ~LEDBitmap() {
      delete [] _data;
    };

  public: //methods
    uint8_t* getBitmap();
    uint8_t getPixelValue(uint8_t x, uint8_t y) {
      return _data[y][x];
    };

    void setPixelValue(uint8_t x, uint8_t y, uint8_t value) {
      _data[y][x] = value;
    };

    uint8_t getHeight() {
      return _height;
    };

    uint8_t getWidth() {
      return _width;
    };

    uint8_t getSize() {
      return _width * _height;
    };

    void clear();

  private: //members
    uint8_t _width;
    uint8_t _height;
    uint8_t _data[][8];


};

#endif

和cpp文件:

#include "LEDBitmap.h"

LEDBitmap::LEDBitmap(uint8_t width, uint8_t height) {
  _width = width;
  _height = height;
  _data = new uint8_t[width][height];
  clear();
}

LEDBitmap::LEDBitmap(uint8_t width, uint8_t height, uint8_t data[][8]) {
  _width = width;
  _height = height;
  _data = data;
}

uint8_t* LEDBitmap::getBitmap() {
  uint8_t result[_height];
  for (uint8_t h = 0; h < _height; h++) {
    uint8_t binary = 0;
    for (uint8_t w = 0; w < _width; w++) {
      binary |= _data[h][w] << (_width - w+1);
    }
    result[h] = binary;
  }
  return result;
}

void LEDBitmap::clear() {
  for (uint8_t h = 0; h < _height; h++) {
    for (uint8_t w = 0; w < _width; w++) {
      _data[h][w] = 0;
    }
  }
}

我的问题是第一个构造函数,其中参数uint8_t data[][8]应该是一个任意高度的数组,最大宽度为8但可能更小。

我尝试过使用模板,但意识到这会导致代码的其他部分出现更大的问题。如果我要使用模板,那么它们只能在构造函数中使用而不必执行LEDBitmap<5, 5> image = ...之类的操作,而只需使用LEDBitmap image = LEDBitmap<5, 5>(...)

无法使用向量,因为它们不是用C语言编写的Arduino IDE的一部分。我在C ++中有我的库,因为我使用的是其他一些C ++中的库最初想要使用不同的平台,但由于一些问题,我最近不得不切换到Arduino。

我目前得到的错误是:no known conversion for argument 3 from 'uint8_t [3][3] {aka unsigned char [3][3]}' to 'uint8_t (*)[8] {aka unsigned char (*)[8]}'

提前感谢您的提示和帮助。

1 个答案:

答案 0 :(得分:1)

C ++不喜欢可变长度数组(即使在某些实现中支持,也从未在标准中定义),也不喜欢原始2D数组。如果您不需要真正的class Array2D { size_t width, height; uint8_t *data; public: Array2D(size_t width, size_t height): width(width), height(height() { data = new uint8_t[width * height]; } ~Arrayt2D() { delete[] data; } // copy/move ctor-assignment operator omitted for brievety but REQUIRED (law of three/five) uint8_t getVal(size_t i, size_t j) const { return data[i + j * width]; } uint8_t setVal(uint8_t val, size_t i, size_t j) { data[i + j * width] = val; } /* alternatively to use arr.val(i, j) = value : uint8_t& val(size_t i, size_t j) { return data[i + j * width]; } */ // other accessors (height, width) omitted but probably useful... }; 运营商支持,我的建议是使用访问者功能:

Base table or view not found: 1146 Table 'database1.thread_connections'

而不是C-ish,但由于你不能使用矢量而更喜欢避免模板,它可能是一个基本的骨架...