Hi,
ich experimentiere gerade mit einem kleinen LCD(HD44780) und muss
feststellen, dass ich mich schon wieder in Pointerarithmetik verstricke,
oder einfach nicht richtig verstehe, was "fprintf" intern macht.
Ich gebe Mal kurz das Bsp. und sage euch dann was ich erwarte bzw. nicht
erwarte:
Ich erwarte eine Ausgabe wie "IP-Adresse: -->>-->>MIDI-IN-THROU "
Bekomme aber einen Mischmasch aus allen Feldern.
Meine Vermutung ist, dass fprintf die Einträge ALLE konkateniert und
dann aufs Display schreibt. Dieses hat aber nur 2x40 Zeichen und fängt
dann warscheinlich wieder vorne an zu überschreiben, so dass ich den
Mist sehe.
Da ich eh alle Leerzeichen reinschupsen muss, habe ich von einem
Pointerarray a la char *menue[] Abstand genommen.
Könnt *ihr* mir *einen* Schubs *in* die *richtige* Richtung
*geben?* (und nebenbei sagen, wie man ganze Sätze hier fett bekommt ;)
Ich dachte ich mache mir das Leben einfacher, indem ich nen Wrapper
nutze:
1
staticinlineintlcd_putchar(charc,FILE*stream)
2
{
3
lcd_sendchar(c);
4
}
aber nun stehe ich da mit dem Halbwissen über fprintf und diese
Formatzeichen wie %s.
Grüße Oekel
Das Problem liegt nicht im fprintf, sondern eher daran, dass die Strings
gar nicht terminiert sind, weil du keinen Platz für die terminierende
'\0' gelassen hast.
Michael Frangenberg schrieb:> Das Problem liegt nicht im fprintf, sondern eher daran, dass die Strings> gar nicht terminiert sind, weil du keinen Platz für die terminierende> '\0' gelassen hast.>
1
constcharmenue[][17]=...
> An sonsten springt mir gerade nichts ins Auge...
Und genau das wars dann auch schon. Perfekt danke!
Falls mir noch Jemand erklären könnte, warum sich dieser Effekt
einstellt, wenn ich das Zeichen nicht mit einplane, wäre ich noch einen
Tick schlauer.
Aber fürs erste bin ich wieder happy!
Grüße Oekel
D a v i d K. schrieb:> Falls mir noch Jemand erklären könnte, warum sich dieser Effekt> einstellt, wenn ich das Zeichen nicht mit einplane, wäre ich noch einen> Tick schlauer.
Das sind absolute Grundlagen für die Stringverarbeitung in C.
Es ist so vereinbart, das Strings in C mit einer '\0' terminirt werden.
Daran wird das Ende erkannt.
Wenn du ein
Markus M. schrieb:> Das Thema mit den C-Strings wird hier im Forum einmal die Woche> durchgekaut. Verwende bitte die Suchfunktion mit "C-String" und lies dir> den Artikel durch:> http://www.mikrocontroller.net/articles/String-Verarbeitung_in_C>> Grüsse
Du hast natürlich Recht. Nachdem klar war, dass mein Fehler dort lag,
hätte ich mich erneut ORDENTLICH auf die Suche machen müssen. Zumal die
Artikel hier wirklich allererste Sahne sind. Sorry, der zweite Post war
voreilig und faul...
DirkB schrieb:>
Wenn ein String nicht mit \0 terminiert wird, dann endet er nicht.
Irgendwo weiter hinten im Speicher wird zufällig ein Null-Byte stehen.
Der String, den printf dann ausgibt wird genau bis dort gehen. Da Du
drei Strings ausgibst, wiederholt sich der Fehler drei mal.
printf kann ohne das \0 Zeichen nicht wissen, wo der String endet. Den
als Parameter wird nicht der ganze String übergeben, sondern ein Pointer
auf das erste Zeichen. Es wird keine Längen-Angab eübergeben. Ob das
Array als char[16] oder char[100] deklariert ist, kann printf nicht
wissen.
Das gilt für alle String Funktionen.