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


von Dominik T. (dom) Benutzerseite


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:
1
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
1
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

von Benedikt K. (benedikt)


Lesenswert?

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

von Dominik T. (dom) Benutzerseite


Lesenswert?

Danke, das funktioniert soweit. :-)

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

Weiß das jemand genau?

Gruß,
Dominik

von Benedikt K. (benedikt)


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 "".

von A.K. (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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:
1
#define ue "\x5D"
2
3
...
4
5
  puts("Zur"ue"ck");

von Günter R. (galileo14)


Lesenswert?

Hallo, Jörg,

Deine Tipps sind einfach Klasse!

Günter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.