ich mache gerade meine ersten Erfahrungen mit der IDE. Jetzt komme ich beim Zusammensetzen von Strings nicht weiter. Ich habe dazu zwar schon ettliche Seiten gefunden, aber irgendwie die falschen.
Mein Ziel ist es nur einen String zusammen zu bauen, den ich über die serielle Schnittstelle versenden möchte.
Wenn ich von "Strings" rede, denke ich an den Datentyp wie man ihn unter vb kennt. Nach meinen Recherchen macht es einen Unterschied ob man einen Datentyp char oder String verwendet und machmal lese ich String sei kein Datentyp?
Kann mir hier mal bitte jemand eine gute Seite empfehlen, die hier "Licht ins Dunkel" bringen kann?
Mein erster Testcode sieht folgendermaßen aus:
int pinR[9];
const int AnzR = 9;
int R[9];
int i = 0;
String strRAusgabe;
void setup()
{
pinR[1] = 10;
pinR[2] = 2;
pinR[3] = 3;
pinR[4] = 4;
pinR[5] = 5;
pinR[6] = 6;
pinR[7] = 7;
pinR[8] = 8;
pinR[9] = 9;
pinMode(pinR[1], INPUT);
pinMode(pinR[2], INPUT);
pinMode(pinR[3], INPUT);
pinMode(pinR[4], INPUT);
pinMode(pinR[5], INPUT);
pinMode(pinR[6], INPUT);
pinMode(pinR[7], INPUT);
pinMode(pinR[8], INPUT);
pinMode(pinR[9], INPUT);
}
void loop()
{
strRAusgabe = "";
for (i = 1; i < AnzR + 1; i++)
{
R[i] = digitalRead(pinR[i]);
if (R[i] == HIGH)
{
strRAusgabe += ";R" + i + ":1";
}
else
{
strRAusgabe += ";R" + i + ":0";
}
Serial.println(strRAusgabe);
}
}
Die Fehlermeldungen lauten:
Arduino: 1.6.8 (Windows 7), Board: "Arduino Nano, ATmega328"
D:\arduino\Sketch\Test\Test.ino: In function 'void loop()':
Test:37: error: invalid operands of types 'const char*' and 'const char [3]' to binary 'operator+'
strRAusgabe += ";R" + i + ":1";
^
Test:41: error: invalid operands of types 'const char*' and 'const char [3]' to binary 'operator+'
strRAusgabe += ";R" + i + ":0";
^
exit status 1
invalid operands of types 'const char*' and 'const char [3]' to binary 'operator+'
Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.
Was soll das jetzt heißen? Sorry, aber ich komme da noch nicht hinter. Ist vermutlich super einfach, wenn man es kennt, aber ich verstehe noch nicht was die IDE daran nicht mag.
Du musst noch grundlegendere Dinge über Arrays lernen. Ein Array der Größe 9 hat die Indizes 0 bis 8. Nicht 1 bis 9. Du verursachst einen Puffer-Überlauf.
ist ganz einfach, den + operator gibt es nicht für strings
m.E. ist das SO nicht ganz korrekt ausgedrückt. Anderenfalls würde nachfolgendes Beispiel nicht funktionieren:
#include <LiquidCrystal.h>
LiquidCrystal lcd( 12, 11, 5, 4, 3, 2 );
String a = "test";
String b = "fall";
String c = a + b;
String d = " 1 von 1000";
String e = c + d;
void setup()
{
lcd.begin( 20, 4 );
lcd.print( e );
}
void loop()
{}
"Strings" sind hier Objekte, mit denen man (fast) so nett hantieren kann wie in anderen Sprachen. Lediglich die Art ist etwas "anders als normal", erinnern mich hier die Strings stark an JavaSript. Kompliziert wird es erst wenn Char und String vermischt werden sollen...
der Sprachenumstieg hindert dich zur Zeit. Aber das wird hoffentlich noch. C ist eben anders.
Das Arrays bei Null beginnen, daran mußte dich unbedingt gewöhnen und dessen Größe ums 1 erhöhen bei der Deklaration. Der Null-Terminator muß noch Platz haben bei char Arrays.
Bei der Größe zähle ich immer mit 1 beginnend durch. Dann paßt das.
Beim Zugriff gehts mit 0 los.
Habe mal versucht deinen Code sinnvoll umzutexten. Fehlerfrei kompiliert wird er erstmal. Ob klappt wirste sehen. Buffersize muß ausreichend groß sein damit alles rein paßt. Sonst gibts einen Bufferüberlauf. Wie Serenifly auch schon erwähnte. Kann böse enden. Inputs muß man nicht setzen. Die Pins sind von Haus aus Inputs. Außer man man wil die µC internen Pullup Widerstände verwenden, dann muß man die aktivieren. Ausgänge muß man immer definieren.
ist ganz einfach, den + operator gibt es nicht für strings. komme auch von vb(a)(s), mußte mich auch daran gewöhnen.
am besten von anfang an auf c-strings (char, nullterminiert) umsteigen
Ich habe jetzt die Deklaration in char strRAusgabe; geändert, aber geholfen hat das nicht. Habe ich dich jetzt missverstanden?
Mach einfach mehrere Serial.print hintereinander.
OK, gut zu wissen. Wissen wie man strings verknüpft, wüsste ich trotzdem gerne.
Ein Array der Größe 9 hat die Indizes 0 bis 8. Nicht 1 bis 9. Du verursachst einen Puffer-Überlauf. OK, ich bin aus VB Indizes 0 bis 9 gewöhnt und hatte den 0er bewußt noch leer gelassen. Danke für den Hinweis.
Sogenannten "C Strings" sind Null-terminiere Arrays aus char. Da kannst du nicht + machen.
String ist eine Arduino Klasse. Da kannst du + machen. Hat aber einen erhöhten Speicherverbrauch. Einige Dinge gehen einfacher, aber andere sind komplizierter oder gehen gar nicht. Gerade an Konvertierungs- und Formatierungs-Funktionen mangelt es. Auch sollte man vorsichtig mit Zuweisungen und Kopien sein.
Es funktioniert! Vielen Dank für die Unterstützung.
Ich bin zwar jetzt dazu übergegangen Arrays zu vergleichen, aber die Verknüpfung der Strings ist mir jetzt klarer und die werde ich sicher auch benöigen.