像Arduino C ++中的字典一样的数据结构

时间:2018-11-27 11:22:17

标签: c++ data-structures arduino

我正在用Arduino写USB到PS / 2转换器,并且我有一个数据结构,如果使用其他高级语言,则可以像字典一样实现。条目将类似于:

{ 0x29: { name: "esc", make: [0x76], break: [0xfe, 0x76] } }

在这里,0x29是密钥的USB代码,因此这是此字典查找的密钥。然后,我将使用entry.name进行调试,entry.make是在按下键(keyDown)时需要发送的字节数组,而在释放键(keyUp)时需要发送的entry.break

用C ++实现这一目标的方法是什么?

1 个答案:

答案 0 :(得分:2)

ArduinoSTL 1.1.0似乎不包含unordered_map,因此您可以像这样创建map

  1. 下载Arduino STL ZIP文件并将其放置在合适的位置
  2. 素描\包含库\添加ZIP库,并为其提供ZIP文件的完整路径。

然后,尽管有很多关于未使用变量的STL警告,它仍应编译。

#include <ArduinoSTL.h>    
#include <iostream>
#include <string>
#include <map>

struct key_entry {
    std::string name;
    std::string down;
    std::string up;
    key_entry() : name(), down(), up() {}
    key_entry(const std::string& n, const std::string& d, const std::string& u) :
        name(n),
        down(d),
        up(u)
    {}
};

using keydict = std::map<unsigned int, key_entry>;

keydict kd = {
    {0x28, {"KEY_ENTER",  "\x5a", "\xf0\x5a"}},
    {0x29, {"KEY_ESC",    "\x76", "\xf0\x76"}}
};

void setup() {
    Serial.begin( 115200 );  
}

void loop() {
    auto& a = kd[0x29];
    // use a.down or a.up (or a.name for debugging)
    Serial.write(a.up.c_str(), a.up.size());
}