www.mikrocontroller.net

Forum: Compiler & IDEs ASCII Code in String eingeben


Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann man in C in einem String ein Zeichen als ASCII Code eingeben ?
Bsp:
Ich möchte auf einem LCD einen Text mit Umlauten o.ä. ausgeben wie
z.B.
Außentemperatur
Leider liegt das 'ß' auf dem LCD an einer anderen Stelle (nämlich auf
0xE2).
Wie kann ich in den String "Außentemperatur" nun also das ß durch
0xE2 ersetzen ?
"Au\xE2entemperatur" geht nicht.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define SZ 0xE2

char s[] = "Au" SZ "entemperatur";


Peter

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht nicht:
main.c:63: error: parse error before numeric constant

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

Bewertung
0 lesenswert
nicht lesenswert
> "Au\xE2entemperatur" geht nicht.

Dafür hat ISO-C89

"Au\xE2" "entemperatur"

eingeführt.  Diese Teilung braucht man, weil eine Escapefolge erst
beim " oder beim ersten ungültigen Zeichen (zur aktuellen Zahlebasis,
also oktal oder hexadezimal) endet.  "Au\xE2entemperatur" parst
folglich als "Au" "\xE2e" "ntemperatur".

Peter's Vorschlag funktioniert nicht ganz, man muss das SZ als
Stringliteral definieren (nur aufeinanderfolgende Strinliterale werden
auf diese Weise verkettet):

#define SZ "\xE2"

Man darf in Peters "Au" SZ "entemperatur" übrigens auch noch die
Leerzeichen einsparen, dann lässt es sich ein wenig flüssiger lesen.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke !
Funktioniert wunderbar...

Gibt es eigentlich irgendwo eine Beschreibung im Internet wo sowas
steht ?
Ich habe einige C Bücher (u.a. Kernighan/Ritchie) aber da steht sowas
nicht drin. Außerdem suche ich noch einige Infos zu #define wie man
z.B. aus
#define port portd
#define bit  5
sbi (port, bit);
folgendes machen kann:
portd_5=1;

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

Bewertung
0 lesenswert
nicht lesenswert
> Gibt es eigentlich irgendwo eine Beschreibung im Internet wo sowas
> steht?

Keine Ahnung.

> Ich habe einige C Bücher (u.a. Kernighan/Ritchie) aber da steht
> sowas nicht drin.

Im K&R (in der zweiten Auflage natürlich) sollte das schon beschrieben
stehen.  Ich müsste zu Hause in meinem nachgucken, wo's genau steht.

>  Außerdem suche ich noch einige Infos zu #define wie man
> z.B. aus
#define port portd
#define bit  5
sbi (port, bit);

> folgendes machen kann:
portd_5=1;

Wüsste ich nichts, außer vielleicht einem Codegenerator (in einer
Scriptsprache wie Perl oder Python), der einem den vollen Satz davon
zusammenschreibt.

Mein Tip: schreib dir lieber einen HAL (hardware abstraction layer).
Eigentlich willst du doch sowieso nicht wirklich in der Kategorie
"Port und Pin" denken, sondern am Portpin hängt irgendetwas dran,
z. B. eine LED.  Ein HAL wäre dann sowas wie:
#define LED_PORT  PORTD
#define LED_DDR   DDRD
#define LED_PINNO 5

#define LED_INIT() do { LED_DDR |= (1 << LED_PINNO); } while (0)
#define LED_SET()  do { LED_PORT |= (1 << LED_PINNO); } while (0)
#define LED_CLR()  do { LED_PORT &= ~(1 << LED_PINNO); } while (0)

Wenn jetzt deine LED mal ,,umziehen'' muss an einen anderen Pin oder
vielleicht statt vom Ausgang nach Masse von Vcc zum Ausgang geklemmt
wird, hast du nur noch eine Stelle, an der du was ändern musst.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau das möchte ich ja auch machen, aber leider verstehen nicht alle
Compiler unter PORT1|=1<<PINNO dasselbe. Bei AVRs wird ein sbi daraus,
bei einem M16C macht der Compiler genau das was man eingibt: Er
berechnet 1<<PINNO und ODER verknüpft das mit dem Byte.
Daher muss man da schreiben PORT_PINNO=1; damit der Compiler den Bit
Setzen Befehl anwendet.
Irgendwie geht sowas, nur mit dem bisschen was in K&R (zweite Auflage)
dazu steht bekomme ich das nicht hin.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Suche im Web nach 'Stringize' Operation und 'Token Pasting'
Das sind im Praeprozessor die # und ## Operation.
Da Du aber den Inhalt von 2 anderen define-Makros stringizen
moechtest kann das ganze etwas komplex werden.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Da Du aber den Inhalt von 2 anderen define-Makros stringizen moechtest
kann das ganze etwas komplex werden.

Genau das ist mein Problem:

#define LCD_port    p0
#define WR     0

Daraus soll werden:
p0_0

#define sbi(sfr, bit)     (sfr##bit = 1;)

Das Makro zieht die beiden aber zusammen und so wird aus sbi(LCD_port,
WR);
LCD_port_WR
Und das kennt der Compiler nicht. Kann man irgendwie die Reihenfolge
ändern in der Präprozessor das abarbeitet ?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es geht übrigens auch einfach die escapefolge mit backslash zu
verwenden:

"Au\xE2 \bentemperatur"

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
äääh backspace, nicht backslash^^

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.