У меня есть 2D-массив фиксированного размера, и я реализовал функцию FIFO. Таким образом, массив всегда будет заполнен до того, как он достигнет функции FIFO, затем FIFO удалит самый старый массив, переместит все массивы вверх на один, а затем добавит самый новый массив на другой конец. В основном очередь. Теперь этот код будет фактически выполняться на микроконтроллере, массив будет поступать от АЦП, а затем я сохраню массив АЦП в 2D-массиве. Чтобы спроектировать алгоритм FIFO на простом C, я написал программу, которая генерирует случайные числа, а затем сохраняет их в 2D-буфер. Затем программа спрашивает пользователя, какие новые значения должны быть сохранены, пользователь вставляет последний массив значений, а затем программа удаляет самый старый массив, перемешивает все оставшиеся массивы на единицу, а затем последние номера пользователей добавляются в конец. Программа делает это 10 раз. Это сделано для имитации того, что происходит в коде микроконтроллера. 2D-массив уже заполнен значениями, а затем АЦП добавляет последний набор значений в массив, и самый старый набор забывается.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int fixed_number[5] = { 0 };
uint16_t big_array[10][5] = { 0 };
uint16_t big_array_copy[10][5] = { 0 };
uint16_t small_array_1[5] = { 0 };
uint16_t k[1] = { 0 };
uint8_t count = 0;
int main()
{
for (int j = 0; j < 10; j++)
{
for (int i = 0; i < 5; i++)
{
big_array[j][i] = rand() % 255;
}
}
for (int j = 0; j < 10; j++)
{
for (int i = 0; i < 5; i++)
{
big_array_copy[j][i] = big_array[j][i];
}
}
printf("These are the original numbers in the big array:n");
for (int j = 0; j < 10; j++)
{
for (int i = 0; i < 5; i++)
{
k[0] = big_array[j][i];
printf("%d,", k[0]);
}
printf("n");
}
while (count < 10)
{
printf("Please enter values for queue:n");
for (int i = 0; i < 5; i++)
{
scanf_s("%d", &fixed_number[i]);
}
printf("nn");
printf("Array values have been swapped:n ");
for (int k = 0; k < 5; k++)
{
big_array_copy[10 - 1][k] = 0;
}
for (int j = 9; j > 0; j--)
{
for (int i = 0; i < 5; i++)
{
//small_array_1[i] = big_array[j + 1][i];
big_array_copy[j][i] = big_array[j - 1][i];
}
}
for (int i = 0; i < 5; i++)
{
big_array_copy[0][i] = fixed_number[i];
}
for (int j = 0; j < 10; j++)
{
for (int i = 0; i < 5; i++)
{
k[0] = big_array_copy[j][i];
printf("%d,", k[0]);
}
printf("n");
}
for (int j = 0; j < 10; j++)
{
for (int i = 0; i < 5; i++)
{
big_array[j][i] = big_array_copy[j][i];
}
}
count++;
}
}
Теперь этот код работает отлично, но здесь много циклов, и он также требует вдвое больше памяти, чем буфер big_array[][] необходимо скопировать в big_array_copy[][]. В реальном приложении это буфер uint16_t somebuffer[100][45] что составляет 4,5 КБ. У меня есть 512 Кбайт SRAM, но я предпочитаю использовать как можно меньше.
Вышеупомянутый метод может быть реализован на моей целевой платформе (STM32F767 для тех, кому интересно), но есть ли более простой метод для реализации вышеизложенного, который использует довольно переносимый c без специальных функций, который может уменьшить требуемую память и время обработки? Благодарность
1 ответ
Нам не хватает включения <stdint.h>
. С другой стороны, мы включаем <time.h>
который мы не используем.
Код здесь не компилируется из-за использования Приложения К. scanf_s()
без проверки на его наличие. Нет причин не использовать обычные scanf()
здесь (но проверьте его возвращаемое значение — это важно!)
По всему коду разбросано множество магических констант, без указания того, связаны ли они друг с другом. Это делает эту программу неподдерживаемой, потому что вы не можете изменить ни одну из них по отдельности, не понимая вся программа.
Кроме того, со всей функциональностью, объединенной в main()
, что затрудняет понимание цели каждой части кода. Пожалуйста, разделите код на хорошо названные функции (возможно, с static
связь).
Я рекомендую исправить их, прежде чем отправлять еще один запрос на проверку, чтобы изучить это более подробно.