Forum: Mikrocontroller und Digitale Elektronik Datentyp für Strings


von kleiner Affe (Gast)


Lesenswert?

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

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von kleiner Affe (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von kleiner Affe (Gast)


Lesenswert?

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?

von Sebastian S. (amateur)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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

von kleiner Affe (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

man muss halt wissen was man macht
1
   signed char c = 255;
2
   if ( c == 255 ) {
3
      printf("gleich oder ungleich ist die Frage");
4
   }

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

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.

von S. R. (svenska)


Lesenswert?

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

von A. S. (Gast)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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.

von Nop (Gast)


Lesenswert?

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
1
my_char = my_digit + '0';

von A. S. (Gast)


Lesenswert?

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.

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.