Hallo Zusammen,
Irgnedswie habe ich einen Knopf in meinem Denken. Ich möchte gerne eine
Zeichenkette an eine Funktion übergeben.
bool uart_e_send(const int8_t* string)
Nun weiss ich das man in C für Strings ein Char-Array nimmt. Doch wiso
nimmt man nicht unsigned char? Also:
bool uart_e_send(const uint8_t* string)
Gemäss ASCII Tabelle sind alle Zeichen mit einem positiven Wert zwischen
0 und 255. Das würde ja dann bei einem signed char falsch interpretiert
werden.
Zudem verlangen alle string Funktionen in string-h den Datentyp char.
Soll ich nun mit char oder mit int8_t arbeiten (was ja sowieso aufs
gleiche rauskommt nach dem Präprozessor)?
Vielen Dank schon mal für alle Erklärungen
Gruss
Jörg
Weil C nicht für Textverarbeitung ausgelegt wurde.
Andere Sprachen wie z.B Pascal haben einen definierten Typ "String"
bereits fix und fertig implementiert und die können auch problemlos
damit umgehen.
kleiner Affe schrieb:> Zudem verlangen alle string Funktionen in string-h den Datentyp char.> Soll ich nun mit char oder mit int8_t arbeiten (was ja sowieso aufs> gleiche rauskommt nach dem Präprozessor)?
nein es kommt nicht auf das gleiche raus.
Es gibt Systeme wo char uint8_t ist.
gehe einfach davon aus das es 3 verschiedene Datentypen sind. Für
Strings nimmer man char - fertig.
Nun, in C gibt es kein dafür gemachten Datentyp. Trotzdem kann man in C
strings verarbeiten so das am schluss das richtige rauskommt. Macht man
das jetzt mit char, uint8_t oder int8_t und falls man char oder int8_t
nimmt. Wie geht denn das mit Zeichen die gemäss ASCII Tabelle über 127
leigen?
Gruss
Jürg
kleiner Affe schrieb:> Macht man> das jetzt mit char, uint8_t oder int8_t und falls man char oder int8_t> nimmt.
char
> Wie geht denn das mit Zeichen die gemäss ASCII Tabelle über 127> leigen?
das spielt doch überhaupt keine rolle, es sind am ende doch nur 8bits.
Da sie als Zeichen interpretiert werden und nicht als zahl ist es egal
was nach dem konvertieren in ein Zahl darin steht.
Hallo Peter
Schon mal Danke für deine Antwort. Gemäss deiner Aussage kann ich auch
einem signed char (mit 8 bit) den Wert 243 zuweisen obwohl dieser
grösser als 127 ist? Reklamiert da nicht schon der Compiler?
Anno Tobak, als das ein Kriterium war, hatten Zeichen nur 7 Bit.
So gab es auch keine Probleme beim Vergleich.
8 Bit pro Zeichen sind etwas Neumodisches. Initiiert von Nicht-USAnesen.
Das es noch andere Zeichen (1 - 127) gibt wundert die noch heute.
kleiner Affe schrieb:> Schon mal Danke für deine Antwort. Gemäss deiner Aussage kann ich auch> einem signed char (mit 8 bit) den Wert 243 zuweisen obwohl dieser> grösser als 127 ist?
wenn char wirklich signed ist dann ja, warum auch nicht.
> Reklamiert da nicht schon der Compiler?
warum sollte er
Nun, ich dachte weil bei 8 bit signed der Wertebereich vo -128 bis +127
geht. Alles ausserhalb wäre dann ein Grund, dass der Compiler ausruft.
Aber ja du hast recht, habe es soeben versucht und der Compiler nahm es
ohne zu klagen an.
Danke dir für die Antwort.
Gruss Jürg
kleiner Affe schrieb:> Nun, in C gibt es kein dafür gemachten Datentyp. Trotzdem kann man in C> strings verarbeiten so das am schluss das richtige rauskommt. Macht man> das jetzt mit char, uint8_t oder int8_t und falls man char oder int8_t> nimmt. Wie geht denn das mit Zeichen die gemäss ASCII Tabelle über 127> leigen?
Erstens passen in die heute üblichen 8-Bit char's 256 Werte. Zweitens
wechselt man für mehr typischerweise auf eine Unicode UTF-Kodierung. Zum
Beispiel UTF-8, wenn man weiter bei char's bleiben möchte.
Und die folgende Bemerkung ist hirnrissig:
Markus M. schrieb:> Weil C nicht für Textverarbeitung ausgelegt wurde.
C wurde zum Schreiben von UNIX entwickelt. UNIX enthält die für damalige
Zeiten umfangreichste Sammlung von Werkzeugen zum Bearbeiten von Text.
Bis auf wenige Ausnahmen natürlich in C geschrieben. troff war so eine
Ausnahme, das war ursprünglich in Assembler geschrieben. Bis Brian W.
Kernighan himself mit ditroff eine um viele Funktionen erweiterte
Version in C vorlegte. Ach ja, troff/ditroff und Konsorten sind die UNIX
Textsatzsysteme.
Ein Integer beliebiger Breite in C (also short, int, long usw) ist
signed, es sei denn, man schreibt "unsigned" davor. Für den Datentyp
"char" gilt das nicht, formal sind "char", "unsigned char" und "signed
char" unterschiedliche Datentypen.
Darum darf der Compiler auch entscheiden, ob er ein char nun mit oder
ohne Vorzeichen betrachtet, und das ist sogar auf dem gleichen Compiler
mit verschiedenen Architekturen unterschiedlich.
Wenn du Mathe mit 8 Bit machen willst, dann
(a) nimm uint8_t und int8_t
(b) nimm explizit "unsigned char" oder "signed char"
(c) geh in den nächsten Getränkeladen. SCNR
kleiner Affe schrieb:> Wie geht denn das mit Zeichen die gemäss ASCII Tabelle über 127> leigen?
Es gibt keine verbindlichen ASCII-Zeichen über 127.
Es gibt Codepages, die einem Zahlenwert verschiedene Zeichen zuordnen
Es gibt die Unicode BMP, die hier genau eine Zuordnung definiert.
(https://de.wikipedia.org/wiki/Unicodeblock_Lateinisch-1,_Erg%C3%A4nzung)
Es ist aber unüblich, mit einer 8-bit Zahl Unicode >127 darzustellen.
Mit UTF-8 wäre eine 200 kein einzelnes Zeichen sondern der Auftakt für
ein Multibyte-Zeichen, also die nächsten 8-Bit Zahlen würden
ausgewertet.
Verwende also char für Strings und keine
Additionen/Subtraktion/Vergleiche auf diesem Datentyp außerhalb von
0...127.
kleiner Affe schrieb:> Nun, ich dachte weil bei 8 bit signed der Wertebereich vo -128 bis +127> geht.
Irrelevant!
Um das Vorzeichen bei Buchstaben, musst du dir erst einen Kopf machen,
wenn du mit Buchstaben rechnen willst.
Z.B. Wenn du 2 Buchstaben addieren, die Wurzel draus ziehen, und das
dann als Pointer nutzen möchtest.
Möglich in C? Ja!
Sinnvoll? Eher nicht.
Arduino F. schrieb:> Sinnvoll? Eher nicht.
Naja, daß man von eine Ziffer von binär nach ASCII konvertiert oder
umgedreht, ist nicht so selten, und da habe ich oft Patterns wie
Nop schrieb:> Naja, daß man von eine Ziffer von binär nach ASCII konvertiert oder> umgedreht, ist nicht so selten,
Das ist auch OK, solange kein Ergebnis den Bereich von 0..127 verlässt.
Eine Abfrage oder Vergleich <0 oder >=128 ist dagegen gefährlich, da
char signed oder unsigned sein kann.