如何解决如何适当地调用构造函数并传递对象?
我有以下代码,但是出了点问题。它可以编译,但是NeoPixel矩阵上没有任何反应。我已经加载了一个链测试,以验证硬件是否正常运行。通过一些手动调试,我发现包含PixelArt art = PixelArt(matrix);
的行触发了该问题。如果我将其注释掉,我会从预期的光矩阵中看到一组橙色的光。将其放回去只会导致黑暗。
包括那一行引起问题怎么办?我是C ++的新手,这使我无所适从。
对于某些代码上下文,我计划包括更多模式,每个模式都有一系列子模式。 PixelArt将展示不同的像素艺术图片作为其子模式。其他模式将包括不同的动画模式。不同的模式都应该共享对同一矩阵对象的引用。
#include <Adafruit_NeoMatrix.h>
#include <gamma.h>
#define MODE_PIN 2
#define SUB_MODE_PIN 3
#define MATRIX_PIN 9
#define MATRIX_COLUMNS 16
#define MATRIX_ROWS 16
#define MATRIX_NUM_PIXELS (MATRIX_COLUMNS * MATRIX_ROWS)
class Mode {
public:
Mode(Adafruit_NeoMatrix &neomatrix) : matrix{&neomatrix} {}
virtual void toggleSubMode() = 0;
virtual void update(uint64_t timestamp) = 0;
protected:
Adafruit_NeoMatrix * const matrix;
};
class PixelArt : public Mode {
public:
PixelArt(Adafruit_NeoMatrix &neomatrix):Mode(neomatrix) {}
void toggleSubMode();
void update(uint64_t timestamp);
};
void PixelArt::toggleSubMode() {
// Stubbed.
}
// Green: 0x80c000
// Brown: 0xc04000
// Tan: 0xffa040
uint32_t link[16][16] = { [REDACTED FOR BREVITY] };
void PixelArt::update(uint64_t timestamp) {
matrix->clear();
for (uint16_t row = 0; row < 16; row++) {
for (uint16_t column = 0; column < 16; column++) {
matrix->setPassThruColor(link[row][column]);
matrix->drawPixel(column,row,0);
matrix->setPassThruColor();
}
}
matrix->show();
}
//
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(
MATRIX_COLUMNS,MATRIX_ROWS,MATRIX_PIN,NEO_MATRIX_TOP | NEO_MATRIX_LEFT | NEO_MATRIX_COLUMNS | NEO_MATRIX_ZIGZAG,NEO_GRB | NEO_KHZ800
);
PixelArt art = PixelArt(matrix);
void setup() {
matrix.begin();
matrix.show();
matrix.setBrightness(30); // Max ~80
}
uint8_t mode = 0;
void loop() {
// art.update(millis());
matrix.fillScreen(matrix.Color(255,127,0));
matrix.show();
}
解决方法
我的建议是,因为代码在微控制器上运行,所以可能会耗尽内存。特别是如果目标板是具有较小动态内存的Arduino Uno或类似产品。编译后,将对编译时变量进行内存使用率计算。运行时变量和函数调用可能会超出可用内存。
针对Arduino Uno进行编译,编译器使用PixelArt
对象计算出1204字节(58%)的动态内存使用量。如果没有它,则为168个字节(8%)。
尝试降低继承和函数调用级别。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。