我有一个“缓冲区缓冲区”,如下所示:
#define BUFFER_MESSAGE_COUNT 5
unsigned char buffer_data[BUFFER_MESSAGE_COUNT][128];
typedef struct {
unsigned char *data;
int size;
int cursor;
} t_buffer;
typedef struct {
int cursor;
int size;
t_buffer buffers[BUFFER_MESSAGE_COUNT];
} t_message_buffer;
t_message_buffer message_buffer = {
0,
BUFFER_MESSAGE_COUNT,
{
{ buffer_data[0], sizeof(buffer_data[0]) / sizeof(char), 0 },
{ buffer_data[1], sizeof(buffer_data[1]) / sizeof(char), 0 },
{ buffer_data[2], sizeof(buffer_data[2]) / sizeof(char), 0 },
{ buffer_data[3], sizeof(buffer_data[3]) / sizeof(char), 0 },
{ buffer_data[4], sizeof(buffer_data[4]) / sizeof(char), 0 }
}
};
是否有更短/更好的方式来声明和初始化它而不是给出所有元素?
我正在使用Microchip XC8编译器,但问题可能是普遍的。
答案 0 :(得分:1)
我假设你在一个大小重要的环境中工作(为了改变)。
如果是这种情况,我不太确定它是初始化RAM结构的有效方式 这将迫使编译器为预主静态变量初始化分配相同数量的ROM。
由于您的结构内容看起来相当冗余,因此使用初始化函数可能在资源使用方面更有效,并且肯定比初始化宏更具可读性和演化性。
在所有条件相同的情况下,我只会选择初始化函数。
答案 1 :(得分:0)
您使用的方法很好,但它的适应性不强。 for
循环会更好:
t_message_buffer message_buffer;
message_buffer.cursor = 0;
message_buffer.size = BUFFER_MESSAGE_COUNT;
for(int i = 0; i < BUFFER_MESSAGE_COUNT; i++)
{
message_buffer.buffers[i].data = buffer_data[i];
message_buffer.buffers[i].size = sizeof(buffer_data[i]);
message_buffer.buffers[i].cursor = 0;
}
这样,如果BUFFER_MESSAGE_COUNT
的值发生变化,您就不必在代码中调整多个位置。