Динамически создавать объект библиотеки внутри в конструкторе класса - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь создать объект для светодиодной матрицы, который может иметь различный размер в течение времени выполнения программы. Для этого я пытаюсь динамически создать объект из библиотеки OctoWS2811 и определить его размер в конструкторе класса отображения. Как бы я сделал это правильно? Это возможно? Спасибо

Вот обычный способ создания объекта OctoWS2811:

const int ledsPerPin = 120 * (32 / 8);

DMAMEM int displayMemory[ledsPerPin * 6];
int drawingMemory[ledsPerPin * 6];
const int config = WS2811_GRB | WS2811_800kHz;
OctoWS2811 leds(ledsPerPin, displayMemory, drawingMemory, config);

А вот пример того, что я пытаюсь сделать:

#include <Arduino.h>
#include <OctoWS2811.h>

class Display
{
  OctoWS2811 *leds; // Dynamically allocated
  DMAMEM int *displayMemory;
  int *drawingMemory;
  const int config = WS2811_GRB | WS2811_800kHz;
  int width, height;

public:
  Display(int w, int h);
  void Draw();
};

Display::Display(int w, int h)
{
  width = w;
  height = h; //Must be multiple of 8
  int ledsPerPin = (height / 8) * width;
  displayMemory = new DMAMEM int[ledsPerPin * 6];
  drawingMemory = new int[ledsPerPin * 6];

  OctoWS2811 temp(ledsPerPin, displayMemory, drawingMemory, config);

  *leds = temp; //How do I do this properly?
}

void Display::Draw() {
  // Draw stuff with the object
  leds.setPixel(56, 0xFF0000);
}

void setup()
{
  Display Test(120, 32);
  // put your setup code here, to run once:
}

void loop()
{
  // put your main code here, to run repeatedly:
}

1 Ответ

0 голосов
/ 24 марта 2020

Для того, чтобы это работало, мне нужно использовать адресацию, как сказано в посте: C ++ указатель на объекты

неправильный способ сделать это будет выглядеть так:

Редактировать: это плохая идея, которую я выучил. Это «работает», но ведет к неопределенному поведению.

#include <Arduino.h>
#include <OctoWS2811.h>

class Display
{
  OctoWS2811 *leds; // Dynamically allocated
  DMAMEM int *displayMemory;
  int *drawingMemory;
  const int config = WS2811_GRB | WS2811_800kHz;
  int width, height;

public:
  Display(int w, int h);
  void Draw();
};

Display::Display(int w, int h)
{
  width = w;
  height = h; //Must be multiple of 8
  int ledsPerPin = (height / 8) * width;
  displayMemory = new DMAMEM int[ledsPerPin * 6];
  drawingMemory = new int[ledsPerPin * 6];

  OctoWS2811 temp(ledsPerPin, displayMemory, drawingMemory, config);

  leds = &temp; //Use an & symbol here
}

void Display::Draw() {
  // Draw stuff with the object
  leds->setPixel(56, 0xFF0000);   //Use an -> here
}

void setup()
{
  Display Test(120, 32);
  // put your setup code here, to run once:
}

void loop()
{
  // put your main code here, to run repeatedly:
}
...