记一次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就会判断字符串是不是匹配的了,改了之后,果然就对了