Ich habe ein Display mit einem "komischen" Zeichensatz. Alphanumerische
Zeichen (0..9, a..Z) sind ok, aber bei öäü gibt es Vertauschungen mit
anderen Sonderzeichen.
Ich habe bei den Zeichenketten, die ich ins Flash lege, bisher immer
statt z.B.
const __flash char TEST = "Töfftöff";
sowas geschrieben:
const __flash char TEST = "T%fft%ff";
So funktioniert das natürlich, ist aber eher unschön. Ich suche nach
einer automatischen Lösung.
Eine Alternative ist natürlich, die Zeichen zur Laufzeit in der
Displayroutine einzeln ersetzen zu lassen, was aber unnötig Rechenzeit
und Flash kostet. Sowas müsste doch eigentlich auch zur Compilezeit bzw.
im Präprozessor gehen? Hat jemand Tipps?
Ich möchte die Texte einfach auf natürliche Art und Weise schreiben.
Ohne Sonderzeichen dazwischen, ohne \x-Verrenkungen. Wenn ich "Sülze"
ausgeben will, möchte ich "Sülze" schreiben.
> Wenn ich "Sülze" ausgeben will, möchte ich "Sülze" schreiben.
Textersetzung pre-compile-Event oder zur Laufzeit machen. Hat aber alles
Vor- und Nachteile, such Dir aus, welche Du haben willst.
Otto Normalverbraucher schrieb:> Ohne Sonderzeichen dazwischen, ohne \x-Verrenkungen. Wenn ich "Sülze"> ausgeben will, möchte ich "Sülze" schreiben.
Ich möcht' auch viel. Manchmal muß man halt mit dem zufrieden sein, was
man kriegt ;).
Du kannst natürlich auch dein komisches Display wegschmeissen und dir
eins kaufen, das mit Sonderzeichen besser umgehen kann.
Wenn's dir das wert ist.
Otto Normalverbraucher schrieb:> as aber unnötig Rechenzeit> und Flash kostet.
Ist der Display-Code so laufzeitrelevant, dass das so schlimm wäre? Ich
kenne deine Anwendung nicht, aber für ein paar Statusmeldungen auf einem
Display kann man sich für jedes Zeichen durchaus ein switch-case mit
8 Möglichkeiten (ÄÖÜäöüß, default) leisten. Das ist immer noch um einige
Größenordnungen schneller, als man lesen kann.
im Sourcecode-Text ganz normal schreiben damit man es
auch vernünftig lesen kann.
In der LcdWriteChar() die Umlaute, Sonderzeichen etc. bei
der Ausgabe durch die entsprechenden Werte des LCD-Zeichensatzes
ersetzen.
Hier werden testweise Umlaute durch die normalen Vokale ersetzt, das
kannst du dann deinen Bedürfnissen anpassen. Die Ersetzung erfolgt zur
Compile-Zeit und im Programm landet der fertig verarbeitete String. Zum
Kompilieren sollte dieser Code als ISO-8859-15 gespeichert werden, denn
bei UTF-8 nehmen Umlaute mehrere Bytes ein und 'ä' funktioniert nicht
mehr.
Wichtig ist dass pro String-Literal eine globale/statische Variable
(hier myString1) angelegt wird, auf der man dann später .data() aufrufen
kann um den "const char*" zu erhalten.
Einfach nur replace ("...").data() funktioniert nicht.
Niklas G. schrieb:> In C++11 gehts auch ganz ohne Präprozessor:
Boah, wer will solchen Monstercode lesen, pflegen oder verstehen?
Und mit avr-gcc übersetzbar ist er auch nicht...
Johann L. schrieb:> Boah, wer will solchen Monstercode lesen, pflegen oder verstehen?
Nicht so schlimm wenn man C++ kann.
> Und mit avr-gcc übersetzbar ist er auch nicht...
Stimmt, weil dem AVR-GCC ein paar C++ Header Files fehlen. Im Anhang
eine Version die std::array nachbildet und auch mit dem AVR-GCC
funktioniert, und für die Grundlagen die C-Header verwendet.
Habe außerdem noch ein Makro hinzugefügt das Lambdas missbraucht um die
Verwendung zu vereinfachen (doch keine globale Variable nötig):
Ansonsten hätte ich einfach mal einen Perl-Script geschrieben, der die
Zeichen ersetzt. Die Strings einfach in eine separate Header-Datei
schreiben und mit dem Script die relevanten Zeichen ersetzen.
(sed, awk und Konsorten gingen natürlich auch).