Arduino: die Schwierigkeit mit der String-Verkettung
Ich bin (mis-)mit dem Arduino String Klasse. Mein ganzes Programm:
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();
}
Diese Drucke:
foo
foobar
foobarbaz
foo
foobar
foobarbaz
foo
foobar
foobarüÿ
foo
foobar
foobarüÿ
foo
foobar
foobar
foo
foobar
foobarüÿ
foo
foobar
foobarüÿ
foo
foobar
foobarüÿ
Ich bin mir nicht sicher, warum es nicht einfach immer drucken:
foo
foobar
foobarbaz
Was könnte ich falsch gemacht?
Update: ich habe versucht, das hinzufügen einer vierten string in das array. Jetzt wird das Programm beendet nach 15 mal durch loop()
oder so.
Update 2: Hier ist die code für die String
append-operator:
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;
}
Update 3: Wenn ich ersetzen:
String result = "";
mit:
String result = args[0];
Verschwindet das problem. Interessant.
- Ähm, warum nicht std::string?
- Gibt es das auf Arduino? Ich glaube nicht, es war.
- Es ist eine Portierung der STL für den arduino: arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1295132807, aber, wie der Autor sagt, Sie brauchen, um zu sehen, Ihre Speicher ziemlich eng.
- Haben Sie versucht, nur deklarieren Ergebnis ohne initialisieren: String Ergebnis; ich denke, ich erinnere mich Ringen mit der Arduino string Klasse selbst, und ich bin mir nicht sicher, dass er immer das richtige tut mit null-Terminierung.
- Haben Sie versucht, mit
String result = String("");
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den ungeraden Zeichen sind ein Ergebnis von heap-Speicher Korruption.
Es ist nichts falsch mit Ihrem code. Dies ist eine manifestation eines Mangels in der version des memory-allocation-Routinen verwendet, die von der aktuellen Arduino-software. Derzeit Schiffe mit AVR-Libc 1.6.4 enthält eine Reihe von Speicher-allocation-Probleme behoben, im neuesten release 1.7.1.
Habe ich diesen code ausführen erfolgreich (d.h. ohne die seltsame Zeichen angezeigt werden) auf eine Teensy 2.0 board mit der teensyduino Erweiterung der Arduino-software. Diese enthält Updates für diese Speicher-Probleme, aber leider sind diese Updates gelten nicht bei der Programmierung von Arduinos.
Gibt es Pläne zur Verbesserung der offiziellen Arduino-software auf die neueste AVR-Libc im August 2011.
Dieser sieht aus wie ein typisches symptom der Speicher überschrieben wird. Sie müssen schauen, in einem anderen Teil des Programms, den Schuldigen zu finden, denn nichts, was Sie hier zeigen, würde dies dazu führen,.
Abgesehen von allem anderen, das Handbuch Seite, die Sie geschrieben nicht darauf hin, dass die String-unterstützt + = - operator. Möglicherweise einige unerwünschte Umwandlung ist Los, wie ein operator aufgerufen werden.
operator+
zeigen+=
als eine akzeptable syntax. Nicht der beste Weg, um es zu dokumentieren, aber...