【发布时间】:2021-03-16 07:31:09
【问题描述】:
如果我有课程名称的数组字符串,例如courseName = {"java","math","physics"}
和enum 有常量变量和代码,如CSC = 320
C语言如何关联?
【问题讨论】:
如果我有课程名称的数组字符串,例如courseName = {"java","math","physics"}
和enum 有常量变量和代码,如CSC = 320
C语言如何关联?
【问题讨论】:
您需要一些方法将枚举映射到数组索引。
一个带有“from”和“to”成员的简单结构数组解决了这个问题:
struct
{
int course; // Course enumeration value
unsigned name; // Name array index
} course_to_name_map[] = {
{ JAVA_101, 0 },
// etc...
};
通过映射数组查找名称循环查找课程,然后使用对应的索引获取名称:
char *get_course_name(int course)
{
static const size_t map_element_count = sizeof course_to_name_map / sizeof course_to_name_map[0];
for (unsigned i = 0; i < map_element_count; ++i)
{
if (course_to_name_map[i].course == course)
{
return course_names[course_to_name_map[i].name];
}
}
// Course was not found
return NULL;
}
请注意,这只是一个可能的解决方案。这很简单,但不是很有效。
【讨论】:
为什么不:
enum KEY {
KEY_JAVA = 320,
KEY_MATH = 123,
KEY_PHYSICS = 17,
};
char *course_to_name[] = {
[KEY_JAVA] = "java",
[KEY_MATH] = "math",
{KEY_PHYSIC] = "physics",
};
// usage:
course_to_name[KEY_JAVA];
只要课程代码相对较小,它就可以很好地工作。
【讨论】:
KEY_JAVA = 320 ,所以 char *course_to_name[] = { [KEY_JAVA] = 创建了一个包含 320 个元素的数组。看起来很浪费空间。
char* 是 4 个字节,那么这个数组有 3 个值 - 仅用于指针就浪费了 1.2 KB 的 ROM(假设您创建数组 const char *const)。在 64kB 的 STM32F103C8T6 上,仅一个阵列就浪费了大约 2% 的闪存。最多 10 秒的值可能是可以接受的,但无论如何我都会使用地图。