Массив указателей, указывающих на растровые изображения в прогме - PullRequest
0 голосов
/ 30 марта 2020

Я в процессе рисования растровых изображений на OLED-экране. Каждое изображение отформатировано как

`const stati c unsigned char waddle_dee_0 [] PROGMEM = { bits };

В настоящее время я пытаюсь добавить анимацию и очистить код. Для этого я создал класс «Bitmap».

Этот класс будет хранить такие вещи, как размер, ширина и массив, содержащий указатель на каждый кадр изображения, например

const static unsigned char* const waddle_table[] PROGMEM = {
  waddle_dee_0,
  waddle_dee_1,
  waddle_dee_2,
  waddle_dee_3,
  waddle_dee_4,
  waddle_dee_5
};

В Bitmap. cpp у меня есть конструктор и функция

#include "bitmaps.h"

Bitmap::Bitmap(double w, double h, uint8_t f, size_t s, const unsigned char* const b){
    setWidth(w);
    setHeight(h);
    setFrames(f);
    setSize(s);
    setAllFrames(b);
}

void Bitmap::drawFrames(){

size_t currSize = this->getSize();
uint8_t numbOfFrames = this->getFrames();
double width = this->getWidth();
double height = this->getHeight();

Serial.println(currSize);
Serial.println(numbOfFrames);

    for (int i = 0; i < numbOfFrames; i++)
    {
      const unsigned char* frameAt = this->getSingleFrame(i);
      drawBitmap(0,0,width,height, frameAt, currSize);
      delay(100);
    }

}

И в заголовочном файле у меня есть определения

#include <stdint.h>
#include "Arduino.h"

// ensure this library description is only included once
#ifndef Bitmap_h
#define Bitmap_h

// library interface description
class Bitmap
{
  // user-accessible "public" interface
  public:
    Bitmap(double w, double h, uint8_t f, size_t s, const unsigned char* const b);
    double getWidth(){return width;}
    double getHeight(){return height;}
    uint8_t getFrames(){return frames;}
    size_t getSize(){return size;}

    double setWidth(double w){width = w;}
    double setHeight(double h){height = h;}
    uint8_t setFrames(uint8_t f){frames = f;}
    size_t setSize(size_t s){size = s;}

    //const unsigned char* const* getFrameArr(){return bitmap_frames;}
    void drawFrames();
    const unsigned char* const* getAllFrames(){return bitmap_frames;}
    void setAllFrames(const unsigned char* const b){*bitmap_frames = b;}
    const unsigned char* getSingleFrame(uint8_t f){return bitmap_frames[f];}

private:
    double width;
    double height;
    uint8_t frames;
    size_t size;
    const unsigned char* const bitmap_frames[];
};
#endif

Моя проблема связана с массив указателей и как правильно копировать эти кадры или правильно копировать указатели в новый массив (bitmap_frames). Цель состоит в том, чтобы bitmap_frames были такими же, как у массива waddle_table, чтобы я мог l oop по индексу рисовать каждое растровое изображение по одному в порядке. Мой код работал, когда у меня был один жестко запрограммированный массив, но после попытки его обобщения я столкнулся с множеством ошибок типов и несоответствий.

Если кто-то может привести меня в правильном направлении, я, кажется, получил потерян в системе указателей. Спасибо!

1 Ответ

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

Если вы хотите объявить bitmap_frames как постоянный гибкий массив, вы не можете скопировать его и должны инициализировать его в конструкторе:

Bitmap::Bitmap() : bitmap_frames {waddle_dee_0, waddle_dee_1, waddle_dee_2, waddle_dee_3, waddle_dee_4, waddle_dee_5} {}

Или вы можете объявить bitmap_frames как состояние c в определении класса:

static const unsigned char *const bitmap_frames[];

И определить его в исходном файле:

const unsigned char *const Bitmap::bitmap_frames[] = {
  waddle_dee_0,
  waddle_dee_1,
  waddle_dee_2,
  waddle_dee_3,
  waddle_dee_4,
  waddle_dee_5};

Также вы можете просто использовать std::vector:

const std::vector<const unsigned char*> bitmap_frames;

И в конструкторе :

Bitmap::Bitmap() : bitmap_frames(std::begin(waddle_table), std::end(waddle_table)) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...