【问题标题】:how to associate enum with array of string如何将枚举与字符串数组相关联
【发布时间】:2021-03-16 07:31:09
【问题描述】:

如果我有课程名称的数组字符串,例如
courseName = {"java","math","physics"}

enum 有常量变量和代码,如
CSC = 320

C语言如何关联?

【问题讨论】:

标签: arrays c string enums


【解决方案1】:

您需要一些方法将枚举映射到数组索引。

一个带有“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;
}

请注意,这只是一个可能的解决方案。这很简单,但不是很有效。

【讨论】:

    【解决方案2】:

    为什么不:

    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 个元素的数组。看起来很浪费空间。
    • @KamilCuk,这取决于密钥分配的紧密程度。对于高达几千的值,此解决方案是可以的。
    • “几千”!好吧,不,对不起,这只是浪费空间,不会通过我的代码审查。假设 char* 是 4 个字节,那么这个数组有 3 个值 - 仅用于指针就浪费了 1.2 KB 的 ROM(假设您创建数组 const char *const)。在 64kB 的 STM32F103C8T6 上,仅一个阵列就浪费了大约 2% 的闪存。最多 10 秒的值可能是可以接受的,但无论如何我都会使用地图。
    猜你喜欢
    • 1970-01-01
    • 2017-10-07
    • 2014-08-12
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    相关资源
    最近更新 更多