【发布时间】:2022-01-11 18:53:03
【问题描述】:
我有各种uint8_t 类型的数组内容“模板”,我想在一个特殊的头文件中定义它们。这些内容模板也有不同的长度:
#define CONTENT_VARIANT_A { 5, 3, 8, 1, 4, 23 }
#define CONTENT_VARIANT_B { 1, 10, 2 }
#define CONTENT_VARIANT_C { 4, 39, 2, 39 }
// '0' is not a valid element value (=> can be used for loop termination)
#define CONTENT_MAX_SIZE = 20;
在我的代码中,我希望有一种方法可以将数组缓冲区的内容设置为这些预定义值之一。这是我目前的代码,使用switch 和memcpy:
设置内容的方法:
void SetBuffer(uint8_t *my_buffer, uint8_t chosen_content) {
memset(my_buffer, 0, CONTENT_MAX_SIZE);
switch (chosen_content) {
case CHOICE_VARIANT_A: {
uint8_t new_content[] = CONTENT_VARIANT_A;
memcpy(my_buffer, new_content, sizeof(new_content));
break;
}
case CHOICE_VARIANT_B: {
uint8_t new_content[] = CONTENT_VARIANT_B;
memcpy(my_buffer, new_content, sizeof(new_content));
break;
}
case CHOICE_VARIANT_C: {
uint8_t new_content[] = CONTENT_VARIANT_C;
memcpy(my_buffer, new_content, sizeof(new_content));
break;
}
}
}
用法:
// Buffer declaration (done once)
uint8_t my_buffer[CONTENT_MAX_SIZE] = { 0 };
// Buffer population + usage (executed multiple times, with varying values for 'chosen_content')
SetBuffer(my_buffer, chosen_content);
uint8_t i = 0;
while (i < CONTENT_MAX_SIZE && my_buffer[i] > 0) {
// ...
++i;
}
我是一名 C# 程序员,并且是 C 的新手; SetBuffer 中的代码对我来说似乎过于复杂,但这是我唯一能想到的应该工作的东西(关于我认为我对 C 的了解),而且它也可以编译。这是做我想做的事情的正确方法,还是完全不同,应该做完全不同的事情?
【问题讨论】: