是否有更短的方法来初始化结构数组?

时间:2014-01-11 23:31:46

标签: c struct microchip

我有一个“缓冲区缓冲区”,如下所示:

#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编译器,但问题可能是普遍的。

2 个答案:

答案 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的值发生变化,您就不必在代码中调整多个位置。