gpt4 book ai didi

c - 优化C中数组的结构

转载 作者:行者123 更新时间:2023-12-02 07:59:03 25 4
gpt4 key购买 nike

我正在尝试编写一个结构来存储各种图形元素的坐标以及一些设置和获取函数。每当用户更改他们的语言选择时,坐标值将更改以适应替代字体。然而,我需要的坐标集数量(我需要维护的整数)将是常量,并在结构中定义为 numElements。

请考虑以下代码。这是我为支持我使用的其他图形绘制功能而创建的一种库。它按原样工作,但我在嵌入式系统中,因此内存非常宝贵,我想进行更改但不知道如何使其工作。

#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,在我声明的结构实例中定义它就足够了。但显然事实并非如此。我假设我需要对动态内存分配做一些事情,但我还没有深入探讨这个主题,也不确定我需要做什么。

注意:我上面提供的代码已经简化了很多。我这样做的部分目标是避免拥有需要维护的大型结构。在实际应用中,大约有 30 个图形项,每个图形项包含 10-20 个元素。如果我按照@Clifford 或@Bastien 的建议去做,那么我将拥有 1000 多行结构/头文件。

注意:numElements 仅用于调整 GRAPHIC_COORD 结构中坐标数组的大小。如果我按照@Clifford 或@Bastien 的建议去做,我可以完全省略 numElements 成员,这将简化结构。但是这个结构仍然会长得离谱。

我正在使用 Keil 的 uVision5 IDE 在定制板上使用 STM32F103 芯片(如果这很重要的话)。

最佳答案

在内存受限的设备上,动态内存分配和可变长度数组通常是不明智的,因为当分配失败时,您必须能够处理它,在这种情况下,您可能无能为力。

如果对于每个元素来说,坐标数组的长度是固定的,那么无论如何都不需要动态分配。考虑:

typedef struct
{
const uint16_t numElements;
COORDINATES* coord ; // <<< pointer to coordinates array
}GRAPHIC_COORD;

然后:

COORDINATES title_coord[]  = { /*constant initialiser coords*/ } ;
COORDINATES header_coord[] = { /*constant initialiser coords*/ } ;
COORDINATES text_coord[] = { /*constant initialiser coords*/ } ;

然后最后:

GRAPHIC_COORD graphicItemCoordinates[] =
{
{ sizeof(title_coord) / sizeof(GRAPHIC_COORD), title_coord },
{ sizeof(header_coord) / sizeof(GRAPHIC_COORD), header_coord },
{ sizeof(text_coord) / sizeof(GRAPHIC_COORD), text_coord }
};

#define LAST_GRAPHIC_ITEM (sizeof(graphicItemCoordinates) / sizeof(*graphicItemCoordinates))

然后每个 COORDINATES 数组可以具有不同的(尽管是单独固定的)长度。

您可以使用宏来简化初始化程序 - 例如:

#define ITEM_COORDS_INIT( item ) {sizeof(item) / sizeof(GRAPHIC_COORD), (item)}

然后:

GRAPHIC_COORD graphicItemCoordinates[] =
{
ITEM_COORDS_INIT(title_coord),
ITEM_COORDS_INIT(header_coord),
ITEM_COORDS_INIT(text_coord)
};

请注意,让数组的大小由其初始化程序确定通常比在 [] 中放置一个值更好。您可以像我上面为 LAST_GRAPHIC_ITEM 创建的宏一样,通过创建宏来为元素数量创建一个符号。

另请注意,如果您打算将这些结构放在 ROM 中——通常您拥有的 ROM 比 RAM 多,那么您应该将它们声明为static const:

static const COORDINATES title_coord[]  = { /*constant initialiser coords*/ } ;
...
static const GRAPHIC_COORD graphicItemCoordinates[] = ...

关于c - 优化C中数组的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59755416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com