2017-11-07 9 views
0

私はArduinoで小さなプログラムを持っています。このプログラムでは、WiringフレームワークのHashMapライブラリを使用します。 とにかく、HashMapはキー型char *、値型char *でもあります。 ファイルからいくつかのキーと値を読み、それらをマップに追加しようとしました。私は文字列としてそれらを読んで、次にchar *に変換するために.c_str()メソッドを使います。 地図を印刷すると、私は非常に奇妙な値を取得します。これはメモリからのガベージであると思いますか? 誰でもどのように修正できますか、それはどうして起こりますか? .c_str()によって返されたメモリ内の一時的な値で何かをしなければならないかもしれないと思っていましたが、わかりません。どんな助け? コードは次のとおりです。(stは単なる文字列で、2つに分割します。C++ Arduino:ハッシュマップから値を追加して取得するとゴミの値が返される

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'をコンソールに出力すると問題ありません。私はハッシュマップを印刷 出力:キー

は:B0 D8 0 BE A0 9B 86:rently HIG、&値を拭くワイパーが現在拭い、HIG & キー:値:⸮pers現在拭い、ハイスピード。

キー:値:⸮

EDIT:今

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の最初の3組:私はハッシュマップのキーと値のString型を使用する場合、私はより多くの奇妙な行動を取得 読み込まれて正常に保存されます。しかし、残りの部分は途中で分割されるか、まったく読み込まれません。 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ワイパーがオンで、ワイピングされていません。
(これまでのところまでOK)

現在ワイピング、低速。 現在、ワイピング、低速。 トリプルワイピング、中速。 トリプルワイピング、中速。 主流のワイピング、高速。 主流のワイピング、高速。

奇妙なもの。そして、これはHashMapでchar *を使用したときには起こりませんでしたが、コード内では何も変更しませんでした。どのようにして、HashMapのキーと値のタイプを変更すると、このファイルの読み込みに影響を与えるのでしょうか?

+1

'const char *'はポインタであり、文字列ではありません。 'messageCode'は' msgC'のデータを指しています。 'msgC'が消えると' messageCode'はゴミを指します。あなたが 'const char *'によって指示されたものが、あなたがマップで終わるか、代わりに文字列のマップを使うまで有効であることを確かめてください。 – nwp

+0

@nwpどうすればそれらが有効であることを確認できますか?どうやってコピーを作るのですか? –

+0

'hashmap 'の代わりに 'hashmap 'を使います。そうすれば、マップは文字列を所有し、マップがなくなるまで無効になりません。 – nwp

答えて

0

あなたはハッシュマップへのデータにのみポインタを追加している:msg一度

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

が破壊され、messageが指すメモリは、使用のために自由になったので、未定義の動作です。

ハッシュマップには、実際にはchar*の代わりにStringの値が含まれている必要があります。

+0

私は現在の質問を編集して、文字列を使用するときに何が起こるかを調べました。あなたは見てみることができますか? –

関連する問題