Arduino: трудности с конкатенацией строк - PullRequest
2 голосов
/ 26 апреля 2011

Я (неправильно) использую класс 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

Что можетЯ делаю неправильно?

Обновление : я пытался добавить четвертую строку в массив.Теперь программа останавливается через 15 раз через loop() или около того.

Обновление 2 : вот код для оператора добавления String:

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 ]

4 голосов
/ 02 июня 2011

Нечетные символы являются результатом повреждения памяти кучи.

В вашем коде нет ничего плохого .Это является проявлением дефекта в версии подпрограмм выделения памяти, используемых текущим программным обеспечением Arduino.В настоящее время он поставляется с AVR Libc 1.6.4, который содержит ряд проблем с выделением памяти, исправленных в последней версии 1.7.1.

Я успешно выполнил этот код (т.е. без нечетных символов)отображается на плате Teensy 2.0 с использованием расширения teensyduino программного обеспечения Arduino.Он содержит исправления для этих проблем с памятью, но, к сожалению, эти исправления не применяются при программировании Arduinos.

В августе 2011 г. планируется обновить официальное программное обеспечение Arduino до последней версии AVR Libc.

1 голос
/ 26 апреля 2011

Это похоже на типичный признак перезаписи памяти. Вам нужно будет заглянуть в другую часть программы, чтобы найти виновника, потому что ничто из того, что вы здесь показываете, не приведет к этому.

0 голосов
/ 26 апреля 2011

Помимо всего прочего, размещенная вами страница руководства не предполагает, что String поддерживает оператор + =.Возможно, происходит какое-то нежелательное преобразование, позволяющее вызывать такого оператора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...