mikrocontroller.net

Forum: Compiler & IDEs Escape Sequenz "\xhh" Bug im GCC???


Autor: Dominik T. (dom) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe einen eigenen Zeichensatz für mein GLCD erstellt und möchte nun 
konstante Strings anlegen. Für das 'ü' muss ich bei meinem Zeichensatz 
0x5d verwenden.
Will ich nun den String "Zurück" konstant im Flash abgelegen würde man 
ja schreiben:
char PROGMEM string[] = "Zur\x5Dck";

\x ist ja die Escape-Sequenz für einen HEX-Code, aber wieviele Stellen 
wertet der GCC als HEX aus?
Im obigen Beispiel scheint es so, als würde das c auch noch mit als 
HEX-Ziffer ausgewertet werden. Jedenfalls zeigt meine print-Funktion 
weder das korrekte 'ü' noch das darauf folgende 'c' an.

Schreibe ich
char PROGMEM string[] = "\x5D\x5D\x5D\x5D";
werden korrekt "üüüü" angezeigt.

Ist das nun ein Bug im GCC?

Laut ANSI-C sind das meiner Meinung nach nur 2 Ziffern:
http://www.liquifried.com/docs/useful/Cescapeseq.html

Gruß,
Dominik

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal so:
char PROGMEM string[] = "Zur""\x5""Dck";

Autor: Dominik T. (dom) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das funktioniert soweit. :-)

Aber mich würde trotzdem interessieren, was nun ANSI C ist.

Weiß das jemand genau?

Gruß,
Dominik

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kaut K&R darf die Anzahl der Zeichen hinter \x beliebig lang sein. 
Allerdings darf dabei Müll rauskommen, wenn der Wert nicht mehr 
dargestellt werden kann (also z.B. wen der Wert nicht mehr in int 
passt).
Genau weiß ich es auch nicht, aber anscheined ist das korrekt was der 
Compiler macht.

Woher soll der Compiler bei "Zur\x5Dck"; wissen, ob das Hex Zeichen bei 
5, bei D oder beim c endet ?
Daher verwendet man um sicher zu gehen den Weg mit den mehreren "".

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ANSI: "Even if eight bits are used for objects that have type char , the 
construction '\x123' specifies an integer character constant containing 
only one character."

Hintergrund: Die Breite eines "chars" ist seitens ANSI nicht auf 8 Bits 
festgelegt. Die Interpretation eines Strings darf jedoch nicht davon 
abhängen, ob das nun 8, 9 oer 12 Bits sind.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute, dass ANSI-C89 eigens dafür die `string concetanation',
also das automatische Verketten der Strings "abc" "def" zu "abcdef"
erfunden hat.  Das gab's davor (also es nur oktale ESC-Sequenzen
gab) nämlich noch nicht.  Ist aber auch für andere Dinge ganz nett,
z. B. kann man das dann auch etwas lesefreundlicher aufschreiben:
#define ue "\x5D"

...

  puts("Zur"ue"ck");

Autor: Günter R. (galileo14)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, Jörg,

Deine Tipps sind einfach Klasse!

Günter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.