Как минимизировать используемое пространство данных? (перераспределение 2D-массива в функции) - PullRequest
0 голосов
/ 25 апреля 2019

Я работаю над несколькими различными анимациями LED Tower. Текущий подход состоит в том, чтобы инициализировать 2D-массив с определенными значениями и скопировать их в глобальный 2D-массив, который используется для обновления отображения. Однако каждая функция, содержащая двумерный массив без знака [15] [4] байтов, занимает много места для данных. Я хотел бы спросить, как правильно переопределить глобальный массив из функции без необходимости инициализировать новый для каждой анимации.

const int BYTES     = 4;    // bytes per layer
const int LAYERS    = 15;   // height of the tower

unsigned char LED_Buffer[15][4] = {0}; // global array


void someFunc(void){

    unsigned char buffer[15][4] = 
{
0x03, 0x03, 0x03, 0x03, 0x06, 0x06, 0x06, 0x06, 0x0c, 0x0c, 0x0c, 0x0c,
0x18, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60,
0xc0, 0xc0, 0xc0, 0xc0, 0x81, 0x81, 0x81, 0x81, 0xc0, 0xc0, 0xc0, 0xc0,
0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x18, 0x18,
0x0c, 0x0c, 0x0c, 0x0c, 0x06, 0x06, 0x06, 0x06, 0x03, 0x03, 0x03, 0x03
};

    for (int y = 0; y < LAYERS; y++)
        {
            for (int x = 0; x < BYTES; x++)
            {
                LED_Buffer[y][x] = buffer[y][x];
            }
        }
// animation code
// ...
}

1 Ответ

2 голосов
/ 25 апреля 2019

Объявите это static.Память будет в разделе данных процесса и будет инициализироваться при запуске программы, а не каждый раз, когда вызывается функция.

void someFunc(void){

    static const unsigned char buffer[15][4] = 
    {
    0x03, 0x03, 0x03, 0x03, 0x06, 0x06, 0x06, 0x06, 0x0c, 0x0c, 0x0c, 0x0c,
    0x18, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60,
    0xc0, 0xc0, 0xc0, 0xc0, 0x81, 0x81, 0x81, 0x81, 0xc0, 0xc0, 0xc0, 0xc0,
    0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x18, 0x18,
    0x0c, 0x0c, 0x0c, 0x0c, 0x06, 0x06, 0x06, 0x06, 0x03, 0x03, 0x03, 0x03
    };

    memcpy(LED_buffer, buffer, sizeof(buffer));
// animation code
// ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...