Arduino:字符串连接困难

时间:2011-04-25 20:15:35

标签: c++ string arduino

我(错误)使用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];

问题消失了。有趣。

3 个答案:

答案 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支持+ =运算符。可能会进行一些不需要的转换,允许调用这样的运算符。