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 : In lambda function : sketch_apr01a : 65 : 12 : error : “const String”as “this”argument of “String & String :: operator + = (const String &) “는 한정자를 삭제합니다. [-fpermissive] arg + = String ((char *) data);
다른 버전도 시도했지만 비슷한 결과를 얻었습니다.
-
arg.concat((char *)data)
-
arg = arg + String((char *)data)
-
arg += String((const char *)data)
그래서이 특이한 것을 정확히 어떻게 작성해야합니까? 작업?
댓글
- 재미 있음, avr-g ++ it ' 괜찮습니다 (에 대한 경고 포함). 저장 기간). 어쨌든 , arg 변수를 값으로 캡처하므로 ' 람다 함수 외부의 변수에 영향을주지 않습니다.
Answer
당신의 람다는 사본으로 arg
를 캡처하고 있습니다. 이것은 확실히 원하는 것이 아닙니다. 그리고 mutable
한정자가 없기 때문에 캡처 된 매개 변수를 수정할 수 없습니다. 따라서 컴파일러 오류입니다.
규정을 지정하여 오류를 제거 할 수 있습니다. 캡처는 mutable
로 지정되지만 원본이 아닌 arg
의 캡처 된 사본을 수정하게됩니다. 올바른 해결책은 다음과 같습니다. 복사본으로 캡처하는 대신 참조로 문자열을 캡처합니다. Lambda 표현식 을 참조하세요.
하지만 문자열을 모두 피하는 Michel Keijzers와 동의합니다. 더 나은 옵션입니다.
댓글
- 완벽하게 이해됩니다. 감사합니다.
- 통찰력과 정답도 감사합니다 ( 찬성)
Answer
실제로 이러한 문자열 연결 (많이 호출 될 수있는 함수에 있음) ), 이것은 메모리 조각화를 초래할 수 있습니다. 대부분의 Arduino에서 메모리가 곧 너무 흩어져 유용한 메모리가 없습니다. y가 남아 있습니다.
대신 다음과 같이 처리하려는 문자열의 최대 크기로 버퍼를 미리 만드는 것이 좋습니다.
static const int MAX_BUFFER_LENGTH = 256; char buffer[MAX_BUFFER_LENGTH];
두 문자열을 연결하려면 strcat
또는 strncat
함수를 사용합니다. 일반적인 C 함수가 있습니다.
댓글
- 충분하고 일반적으로 좋은 조언입니다. 하지만 ' 제 질문에 대한 답을 알고 싶습니다. 🙂
- concat을 사용할 때 어떤 오류가 발생하는지 궁금합니다 (문자열 전달 작업 오류 일 수 없음). const로 캐스팅 할 수도 있습니다.
Answer
#include <stdio.h> static const int MAX_BUFFER_LENGTH = 32; char buffer[MAX_BUFFER_LENGTH]; sprintf(buffer, "%s%s", string1, string2);