Как на самом деле объединить две строки?
Я использую библиотеку 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)
Так как же мне написать эту необычную операцию?
@larsb, 👍2
Обсуждение3 ответа
Лучший ответ:
Ваша лямбда копирует arg
, что, безусловно, не то, что
вы хотите. И поскольку у него нет квалификатора mutable
,
захваченные параметры не подлежат изменению. Отсюда и ошибка компилятора.
Вы можете избавиться от ошибки, определив захват как mutable
,
но тогда вы будете изменять захваченную копию arg
, а не
оригинальный. Правильным решением было бы захватить строку с помощью
ссылка вместо захвата копией. См. Лямбда
выражения.
Но с другой стороны, я согласен с Мишелем Кейзерсом в том, что полный отказ от строк это лучший вариант.
Имеет смысл, спасибо!, @larsb
Спасибо за понимание и правильный ответ тоже (проголосовали), @Michel Keijzers
На самом деле для такого объединения строк (которое есть в функции, которая может быть вызвана много) это может привести к фрагментации памяти, а на большинстве плат Arduino память будет слишком разбросана, и полезной памяти не останется.
Вместо этого лучше заранее создать буфер с максимальным размером строки, которую вы хотите обработать, например:
static const int MAX_BUFFER_LENGTH = 256;
char buffer[MAX_BUFFER_LENGTH];
И используйте функцию strcat
или strncat
для объединения двух строк; существуют общие функции C.
Справедливо, и в целом хороший совет. Но все же хотелось бы узнать ответ на свой вопрос. :-), @larsb
Интересно, какую ошибку вы получаете при использовании concat (не может быть ошибкой операции передачи строки). Может быть, какое-то приведение к const., @Michel Keijzers
#include <stdio.h>
static const int MAX_BUFFER_LENGTH = 32;
char buffer[MAX_BUFFER_LENGTH];
sprintf(buffer, "%s%s", string1, string2);
- Использование StringStream в скетче Arduino
- Чтение строки, разделенной запятыми
- Использование строк внутри кода расширений mBlock
- Как улучшить этот Код? (или как передать строку Char в функцию, чтобы она вела себя как переменная)
- Еще один простой и глупый вопрос о строках C++
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
Забавно, на avr-g++ все нормально (с предупреждениями о длительности хранения). В любом случае, вы захватываете переменную arg по значению, поэтому это не повлияет на переменную вне лямбда-функции., @KIIV