我如何适当地调用构造函数并传递对象?
How do I appropriately call constructors and pass objects around?
我有以下代码,但它有问题。它编译,但在 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 或类似的,具有小的动态内存。编译后,对 compile-time 个变量进行内存使用计算。 run-time 变量和函数调用可能超出可用内存。
为 Arduino Uno 编译,编译器使用 PixelArt
对象计算 1204 字节 (58%) 的动态内存使用情况。没有它是 168 字节 (8%)。
尝试减少继承和函数调用级别。
我有以下代码,但它有问题。它编译,但在 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 或类似的,具有小的动态内存。编译后,对 compile-time 个变量进行内存使用计算。 run-time 变量和函数调用可能超出可用内存。
为 Arduino Uno 编译,编译器使用 PixelArt
对象计算 1204 字节 (58%) 的动态内存使用情况。没有它是 168 字节 (8%)。
尝试减少继承和函数调用级别。