C语言中如何将符号数组映射到对应C风格图像数组?
问题
我定义了若干如下形式的C风格图像数组:
static uint8_t wsymbol_0043_mostly_cloudy[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
同时还有存储这些图像名称的数组:
String* symbols[] = { "wsymbol_0001_sunny", "wsymbol_0002_sunny_intervals", "wsymbol_0003_white_cloud"};
我希望在C语言中实现将该符号名称数组映射到对应的图像数组,需要将图像数组本身(而非名称)传入方法,想知道是否可以通过C的“map”函数实现?
解决方案
C标准库没有原生的键值映射“map”函数,但可以手动实现一个映射表来完成名称到图像数组的关联,具体步骤如下:
1. 定义映射结构体
创建结构体存储名称字符串和对应图像数组的指针:
#include <string.h> // 若使用Arduino环境,PROGMEM相关定义已默认包含 typedef struct { const char* name; const uint8_t* img_data; } SymbolMap;
2. 构建映射表
把所有图像名称和对应的数组指针一一绑定:
// 提前声明所有图像数组(若数组在其他文件定义,需加extern) extern const uint8_t wsymbol_0001_sunny[] PROGMEM; extern const uint8_t wsymbol_0002_sunny_intervals[] PROGMEM; extern const uint8_t wsymbol_0003_white_cloud[] PROGMEM; extern const uint8_t wsymbol_0043_mostly_cloudy[] PROGMEM; // 构建映射表 const SymbolMap symbol_map[] = { {"wsymbol_0001_sunny", wsymbol_0001_sunny}, {"wsymbol_0002_sunny_intervals", wsymbol_0002_sunny_intervals}, {"wsymbol_0003_white_cloud", wsymbol_0003_white_cloud}, {"wsymbol_0043_mostly_cloudy", wsymbol_0043_mostly_cloudy} }; // 计算映射表元素总数 const size_t symbol_map_count = sizeof(symbol_map) / sizeof(symbol_map[0]);
3. 实现查找函数
遍历映射表,根据名称匹配对应的图像数组指针:
const uint8_t* find_symbol_img(const char* name) { for (size_t i = 0; i < symbol_map_count; i++) { if (strcmp(name, symbol_map[i].name) == 0) { return symbol_map[i].img_data; } } // 未找到匹配项时返回NULL return NULL; }
4. 使用示例
从名称数组中取出名称,查找对应的图像数组并传入方法:
// 取symbols数组中的第一个名称 const char* target_name = symbols[0]; const uint8_t* target_img = find_symbol_img(target_name); if (target_img != NULL) { // 将图像数组指针传入目标方法,比如显示图像的函数 // display_image(target_img); }
注意事项
- 若使用Arduino的
String类型,需调用c_str()方法转为C风格字符串再传入查找函数:find_symbol_img(symbols[0].c_str()) - 图像数组存储在PROGMEM中,读取数据时要使用
pgm_read_byte()等专用宏,不能直接像普通数组那样访问
内容的提问来源于stack exchange,提问作者user3069232
相关产品推荐
相关产品推荐

