Я пытаюсь написать структуру для хранения координат для различных графических c элементов, а также некоторых функций set и get. Значения координат будут меняться для размещения альтернативных шрифтов всякий раз, когда пользователь меняет свой выбор языка. Однако число наборов координат, которые мне нужны (целые числа, которые мне нужно сохранить), будет постоянным и определяется как numElements в структуре.
Пожалуйста, рассмотрите следующий код. Это своего рода библиотека, которую я создал для поддержки других функций рисования graphi c, которые я использую. Он работает как есть, но у меня встроенные системы, поэтому память стоит дорого, и я хотел бы внести изменения, но не знаю, как заставить это работать.
#define MAX_ELEM 20
typedef enum{TITLE, HEADER, TEXT, LAST_GRAPHIC_ITEM}GRAPHIC_ITEMS;
typedef struct
{
uint16_t x;
uint16_t y;
}COORDINATES;
typedef struct
{
const uint16_t numElements;
COORDINATES coord[MAX_ELEM];
}GRAPHIC_COORD;
GRAPHIC_COORD graphicItemCoordinates[LAST_GRAPHIC_ITEM] =
{
{ // TITLE
1,
},
{ // HEADER
2,
},
{ // TEXT
14,
}
};
void SetXCoord(GRAPHIC_ITEMS item, uint16_t new_x, uint16_t elemNum);
void SetYCoord(GRAPHIC_ITEMS item, uint16_t new_y, uint16_t elemNum);
uint16_t GetXCoord(GRAPHIC_ITEMS item, uint16_t elemNum);
uint16_t GetYCoord(GRAPHIC_ITEMS item, uint16_t elemNum);
Я бы хотел например, оптимизировать размер массивов COORDINATES, чтобы они содержали достаточно информации для необходимого количества элементов. Таким образом, изменение в коде, которое я имею в виду, будет выглядеть так:
typedef struct
{
const uint16_t numElements;
COORDINATES coord[numElements]; // changed size value here from MAX_ELEM to numElements
}GRAPHIC_COORD;
Однако, когда я делаю это изменение и пытаюсь скомпилировать, я получаю ошибки, говорящие о том, что numElements не определен. Мне кажется, что мне не нужно было определять numElements в объявлении типа, и этого достаточно для определения его в экземпляре структуры, которую я объявляю. Но очевидно, что это не так. Я предполагаю, что мне нужно что-то сделать с динамическим распределением памяти c, но я еще глубоко не затронул эту тему и не уверен, что мне нужно делать.
Примечание: приведенный выше код значительно упрощен. Часть моей цели в том, чтобы сделать это таким образом, чтобы избежать большой структуры, которую мне нужно поддерживать. В реальном приложении более 30 графических элементов c, каждый из которых содержит 10-20 элементов. Если бы я сделал это, как предложили @Clifford или @Bastien, то у меня было бы более 1000 строк файла структуры / заголовка.
Примечание: numElements существует только для определения размера координатного массива в структуре GRAPHIC_COORD. Если бы я сделал это так, как предлагают @Clifford или @Bastien, я мог бы полностью опустить член numElements, что упростило бы структуру. Но структура все равно будет нелепо длинной.
Я работаю в IDE Keil uVision5 с микросхемой STM32F103 на специальной плате, если это имеет какое-либо значение.