Forum: Compiler & IDEs ASCII Code in String eingeben


von Benedikt (Gast)


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.

von peter dannegger (Gast)


Lesenswert?

#define SZ 0xE2

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


Peter

von Benedikt (Gast)


Lesenswert?

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

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


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.

von Benedikt (Gast)


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;

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


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
1
#define port portd
2
#define bit  5
3
sbi (port, bit);

> folgendes machen kann:
1
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:
1
#define LED_PORT  PORTD
2
#define LED_DDR   DDRD
3
#define LED_PINNO 5
4
5
#define LED_INIT() do { LED_DDR |= (1 << LED_PINNO); } while (0)
6
#define LED_SET()  do { LED_PORT |= (1 << LED_PINNO); } while (0)
7
#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.

von Benedikt (Gast)


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.

von Karl H. (kbuchegg)


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.

von Benedikt (Gast)


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 ?

von Simon K. (simon) Benutzerseite


Lesenswert?

es geht übrigens auch einfach die escapefolge mit backslash zu
verwenden:

"Au\xE2 \bentemperatur"

von Simon K. (simon) Benutzerseite


Lesenswert?

äääh backspace, nicht backslash^^

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.