记一次std::map的使用debug记录

最近在做一个音效生成工具,具体就是根据配置文件来解析每一个buzzer音效的freq, duty 和 delay。然后通过命令行传入的参数控制buzzer鸣叫,比如 test_buzzer B_DIDI, 就会发出DIDI的声音。

然后我的想法是先设计一个数据结构,我打算用std::map 来保存,key就是char*, value就是后面的音效参数,使用list来保存,代码如下:

typedef struct {
    int freq;
    int duty;
    int delay; 
} cfg_t;

typedef std::map<char*, std::list<cfg_t>> effect_mappings_t;

 后面就是按部就班,把音效的参数依次insert到list中,所有音效注册完后,我通过命令行传入的参数作为key值,在map里找到相应的value, 控制buzzer去播放;结果运行后,怎么都播放不出来。于是我开始debug, 在播放音效之前使用count()方法检查了一下,key竟然不存在?

怎么会呢?明明注册的时候就是用这些字符串注册的

effect_mappings["B_DIDI"].push_back(cfg);

 后来才恍然大悟,我的key是char*, 我在注册的时候传的是“xxx”这样的字符串,也就是说,这个地方,map是把key当成普通指针了,你通过命令行传进来的是argv[1], 虽然内容一样,但是地址不同,所以argv[1] 在map中是不存在的。

然后我试了一下,改成

typedef std::map<std::string, std::list<cfg_t>> effect_mappings_t;

 这样,map就会判断字符串是不是匹配的了,改了之后,果然就对了

 

posted on 2022-05-31 21:37  疾速瓜牛  阅读(88)  评论(0编辑  收藏  举报

导航