Как на самом деле объединить две строки?

Я использую библиотеку 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: ошибка: передача «const String» в качестве «этого» аргумента из 'String& String::operator+=(const String&)' отбрасывает квалификаторы [-fразрешительный] аргумент += строка((символ *)данные);

Я пробовал и другие версии с аналогичными результатами:

  • arg.concat((char *)данные)
  • arg = arg + String((char *)data)
  • arg += String((const char *)data)

Так как же мне написать эту необычную операцию?

, 👍2

Обсуждение

Забавно, на avr-g++ все нормально (с предупреждениями о длительности хранения). В любом случае, вы захватываете переменную arg по значению, поэтому это не повлияет на переменную вне лямбда-функции., @KIIV


3 ответа


Лучший ответ:

3

Ваша лямбда копирует arg, что, безусловно, не то, что вы хотите. И поскольку у него нет квалификатора mutable, захваченные параметры не подлежат изменению. Отсюда и ошибка компилятора.

Вы можете избавиться от ошибки, определив захват как mutable, но тогда вы будете изменять захваченную копию arg, а не оригинальный. Правильным решением было бы захватить строку с помощью ссылка вместо захвата копией. См. Лямбда выражения.

Но с другой стороны, я согласен с Мишелем Кейзерсом в том, что полный отказ от строк это лучший вариант.

,

Имеет смысл, спасибо!, @larsb

Спасибо за понимание и правильный ответ тоже (проголосовали), @Michel Keijzers


2

На самом деле для такого объединения строк (которое есть в функции, которая может быть вызвана много) это может привести к фрагментации памяти, а на большинстве плат Arduino память будет слишком разбросана, и полезной памяти не останется.

Вместо этого лучше заранее создать буфер с максимальным размером строки, которую вы хотите обработать, например:

static const int MAX_BUFFER_LENGTH = 256;

char buffer[MAX_BUFFER_LENGTH];

И используйте функцию strcat или strncat для объединения двух строк; существуют общие функции C.

,

Справедливо, и в целом хороший совет. Но все же хотелось бы узнать ответ на свой вопрос. :-), @larsb

Интересно, какую ошибку вы получаете при использовании concat (не может быть ошибкой операции передачи строки). Может быть, какое-то приведение к const., @Michel Keijzers


1
#include <stdio.h>

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

sprintf(buffer, "%s%s", string1, string2);
,