我(错误)使用Arduino String类。我的整个计划:
void setup() {
Serial.begin(9600);
}
void loop() {
const String args[3] = {
"foo", "bar", "baz" };
String result = "";
Serial.println(result);
result += args[0];
Serial.println(result);
result += args[1];
Serial.println(result);
result += args[2];
Serial.println(result);
Serial.println();
}
打印:
foo
foobar
foobarbaz
foo
foobar
foobarbaz
foo
foobar
foobarüÿ
foo
foobar
foobarüÿ
foo
foobar
foobar
foo
foobar
foobarüÿ
foo
foobar
foobarüÿ
foo
foobar
foobarüÿ
我不确定为什么它不只是一直打印:
foo
foobar
foobarbaz
我可能做错了什么?
更新:我尝试在阵列中添加第四个字符串。现在程序经过loop()
左右15次后停止运行。
更新2 :以下是String
附加运营商的code:
const String & String::operator+=( const String &other )
{
_length += other._length;
if ( _length > _capacity )
{
char *temp = (char *)realloc(_buffer, _length + 1);
if ( temp != NULL ) {
_buffer = temp;
_capacity = _length;
} else {
_length -= other._length;
return *this;
}
}
strcat( _buffer, other._buffer );
return *this;
}
更新3 :如果我更换:
String result = "";
使用:
String result = args[0];
问题消失了。有趣。
答案 0 :(得分:4)
奇数字符是堆内存损坏的结果。
您的代码没有任何问题。这是当前Arduino软件使用的内存分配例程版本中的缺陷的表现。它目前附带AVR Libc 1.6.4,其中包含最新1.7.1版本中修复的许多内存分配问题。
我使用Teensy 2.0 board对Arduino软件的增强功能成功运行了此代码(即没有显示奇数字符)teensyduino。这包含针对这些内存问题的修复程序,但遗憾的是,在编写Arduinos时,这些修复程序不适用。
计划于2011年8月将官方Arduino软件升级到最新的AVR Libc。
答案 1 :(得分:1)
这看起来像是被覆盖的内存的典型症状。你必须查看程序的另一部分才能找到罪魁祸首,因为你在这里展示的任何内容都不会导致这种情况。
答案 2 :(得分:0)
除了其他任何内容之外,您发布的手册页并不表示String支持+ =运算符。可能会进行一些不需要的转换,允许调用这样的运算符。