mikrocontroller.net

Forum: Compiler & IDEs Fehler bei char[]="\x01Auto"


Autor: Hermann Günther (hahgeh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Man kann doch in einem character array in C im Initialisierungs-String 
Zeichen als hexadezimalen Wert angeben, so wie im Betreff. Also mit 
\xhh, vobei hh die Hexadezimalziffern sind.

Nach meinem Wissen sollte der Compiler aus:
const char []="\x01Auto";
folgende Bytefolge im Speicher machen (hex):
01 41 75 74 6F 00

Bei mir tut er es aber nicht. Bei mir interpretiert er immer das 'A', 
welches auch eine hex-Ziffer sein könnte, als solche und macht aus \x01A 
0x1A
also:
1A 75 74 6F 00

Wie kann ich das verhinder, bzw. wieso ist das überhaupt so, denn ein 
char-Zeichen kann ja nur aus maximal zwei hex-Ziffern bestehen.

Ich verwende den arm-gcc. Die Version weiß ich gerade nicht, da muss ich 
morgen nochmal nachschauen.

VDumfG
hahgeh

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

Bewertung
0 lesenswert
nicht lesenswert
Man kann Strings unterteilen, dadurch kann man das Interpretieren als 
Hex beenden:
const char []="\x01""Auto";
Die beiden Strings "\x01" und "Auto" werden automatisch zusammengefügt.

Ich bin auch schon auf dieses Problem reingefallen, das je nach Text nur 
selten auftritt (nämlich wenn der auf den Hex Wert folgenden Buchstaben 
ein A-F ist).

Autor: Hermann Günther (hahgeh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah wunderbar, das werde ich morgen gleich mal ausprobieren.

Aber das ist schon irgendwie seltsam. Gibt es für dieses Verhalten einen 
bestimmten Grund, oder ist das "nur" ein Compilerfehler?

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

Bewertung
0 lesenswert
nicht lesenswert
Hermann Günther wrote:

> Aber das ist schon irgendwie seltsam. Gibt es für dieses Verhalten einen
> bestimmten Grund, oder ist das "nur" ein Compilerfehler?

Es ist ein Fehler in deinem Code.  Der Compiler tut genau das, was ihm
der C-Standard aufträgt.  Oktale Escape-Folgen werden nach dem dritten
Zeichen oder beim ersten nicht-oktalen Zeichen beendet, je nachdem,
welche der beiden Bedingungen zuerst eintritt.  Hexadezimale Folgen
werden ausschließlich mit dem ersten nicht-hexadezimalen Zeichen
beendet.  Auf diese Weise lassen sich Bytes mit beliebig vielen Bits
abbilden.

Meines Wissens ist eigens dafür in C89 (also vor ca. 20 Jahren) die
Möglichkeit eingeführt worden, dass zwei aufeinanderfolgend
geschriebene Zeichenkettenkonstanten vom Compiler zu einer einzigen
zusammengefügt werden.

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.