2つの文字列を実際に連結する方法は?

SPISlaveライブラリを使用しており、次のコードスニペットがあります:

 String arg; SPISlave.onData([arg](uint8_t *data, size_t len) { data[len] = 0; arg += String((char *)data); // ... }  

ただし、コンパイラは文字列の連結を好みません:

/home/lars/sketch_apr01a/sketch_apr01a.ino:ラムダ関数の場合:sketch_apr01a:65:12:エラー: “constString”を “String &文字列の” this “引数として渡します:: operator + =(const String &) “は修飾子を破棄します[-fpermissive] arg + = String((char *)data);

他のバージョンも試しましたが、同様の結果が得られました:

  • arg.concat((char *)data)
  • arg = arg + String((char *)data)
  • arg += String((const char *)data)

では、この珍しい文字をどのように正確に記述すればよいですか操作?

コメント

  • おかしい、avr-g ++では'問題ありません(警告付き保存期間)とにかく、arg変数を値でキャプチャしているため、'ラムダ関数の外部の変数には影響しません。

回答

ラムダがargをコピーでキャプチャしていますが、これは間違いなくあなたが望むものではありません。また、mutable修飾子がないため、キャプチャされたパラメータは変更できません。したがって、コンパイラエラーです。

修飾することで、エラーを取り除くことができます。キャプチャはmutableですが、元のコピーではなく、argのキャプチャされたコピーを変更することになります。正しい解決策は次のとおりです。コピーではなく、参照によって文字列をキャプチャします。ラムダ式を参照してください。

しかし、私は、文字列を完全に回避するというMichelKeijzersに同意します。

コメント

  • 完璧な意味を持っています、ありがとう!
  • 洞察と正解にも感謝します(賛成)

回答

実際には、このような文字列の連結(多くの場合呼び出される可能性のある関数内にあります) )、これによりメモリの断片化が発生する可能性があります。ほとんどのArduinoでは、メモリがすぐに分散しすぎて、有用なメモリがなくなります。 yは残ります。

代わりに、次のように、処理する文字列の最大サイズでバッファを事前に作成することをお勧めします。

static const int MAX_BUFFER_LENGTH = 256; char buffer[MAX_BUFFER_LENGTH]; 

そして、関数strcatまたはstrncatを使用して2つの文字列を連結します。一般的なC関数があります。

コメント

  • 十分に公平で、一般的には良いアドバイスです。しかし、'それでも私の質問に対する答えを知りたいです。 🙂
  • concatを使用するとどのようなエラーが発生するのでしょうか(文字列を渡す操作エラーになることはできません)。 constへのキャストかもしれません。

回答

#include <stdio.h> static const int MAX_BUFFER_LENGTH = 32; char buffer[MAX_BUFFER_LENGTH]; sprintf(buffer, "%s%s", string1, string2); 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です