我正在为动态大小的二维数组寻找一个简单的解决方法作为参数,从字面上可以轻松使用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]}'
提前感谢您的提示和帮助。
答案 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,但由于你不能使用矢量而更喜欢避免模板,它可能是一个基本的骨架...