You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 19:52:01