C ++ Arduino:从hashmap添加和获取值返回垃圾值

时间:2017-11-07 10:45:49

标签: c++ arduino hashmap

我的Arduino上有一个小程序,我在其中使用了Wiring框架中的HashMap库。 无论如何,HashMap的键类型为char *,值类型为char *。 我从文件中读取了一些键和值,然后尝试将它们添加到地图中。我将它们读作字符串,然后使用.c_str()方法将它们转换为char *。 当我打印地图时,我得到了非常奇怪的值,我认为这可能是内存中的垃圾? 任何人都知道如何解决这个问题,以及为什么会这样?我在想它可能需要对.c_str()返回的内存中的临时值做一些事情,但我不确定。有帮助吗? 这是代码:( st只是一个字符串,我把它分成两个,其中:是)。

    String msgC = st.substring(0, st.indexOf(":") - 1);
    const char* messageCode = msgC.c_str();
    String msg = st.substring(st.indexOf(":") + 1);
    const char* message = msg.c_str();
    hashMap[messageCode] = message;

当我将'message'和'messageCode'打印到控制台时,它们没问题。 打印hashmap时的输出:

重点:真正擦拭,高和低价值:B0 D8 0 BE A0 9B 86:刮水器正在擦拭,高和低 关键:价值:⸮目前正在擦拭,高速。

关键:价值:⸮

编辑: 当我使用hashMap键和值的String类型时,我会得到更奇怪的行为:

if (dataFile)   { 
  String st;
 while (dataFile.available() > 0) {
  char s = char(dataFile.read());
  if (s!='\n'){
    st = st+s;
  }
  else{
    String msgC = st.substring(0, st.indexOf(":") - 1);
    String msg = st.substring(st.indexOf(":") + 1);
    Serial.print(msgC + " " + msg);
    hashMap[msgC] = msg;
    st = "";
  }
} 

现在,前三对msgC和msg被读取并存储得很好。但其余部分在句子中间分裂或根本没有加载。 Serial.print的输出:
1D0 834 B0 D8 0 A0 A0 9B 8雨刮器关闭。
1D0 834 B0 D8 0 A8 A0 9B 8刮水器,单次擦拭。
1D0 834 B0 D8 0 A1 A0 9B 8刮水器打开,不擦拭。
(直到这里没关系)

目前正在擦拭,低速。  目前正在擦拭,低速。 擦拭,中速。  擦拭,中速。 只是擦拭,高速。  只是擦拭,高速。

奇怪的东西。当我在HashMap中使用char *时没有发生这种情况,并且我没有更改代码中的任何其他内容。为什么更改HashMap键和值的类型会影响从文件读取?

1 个答案:

答案 0 :(得分:0)

您只将指针添加到数据到hashmap:

 String msg = st.substring(st.indexOf(":") + 1);
 const char* message = msg.c_str();
 hashMap[messageCode] = message;

销毁msg后,message指向的内存即可免费使用,因此未定义行为

您的哈希映射实际上应包含String个值,而不是char*