mit eingänge rechnen

OP #3605891
Lesenswert?

Hallo leute,

ich möchte gerne mit vier sensoren am PORTA (PA0 bis PA4) rechnen.
also sensor1 = 1, sensor2 = 2 usw.
1
....
2
wist = PORTA;
3

4
dir = wist - wsoll
5

6
if(wist >= 10)
7
{
8
  PORTD = 0x00;
9
}
10

11
if(wist <= 10)
12
{
13
  PORTD = 0xFF;
14
}
15
....

habe im inet schon gesucht und sowas änliches gefunden. der code 
funktioniert in der simulation aber praktisch nicht =(

ich hoffe mir kann da jemand helfen. danke
OP #3605941
Lesenswert?

also ich möchte mit den sensoren die position auslesen. (0x01 = 1, 0x02 
= 2, usw.)

wenn "wist" größer ist als 10 dann sollen die leds nicht leuchten und 
wenn "wist" kleiner ist als 10 dann sollen alle leuchten.

mit der formel "dir = wist - wsoll" möchte ich gerne die richtung von 
einem werkzeugwechler (20 werkzeuge) bestimmen (ob er sich links oder 
rechts dreht für den schnellsten weg). aber da ich jetzt noch nicht mal 
die leds zum leuchten bringe muss da noch warten.

habs auch mit PINA versucht und es klappt leider auch nicht =(
Gast #3605953
Lesenswert?

Zeig' uns am besten mal eine vollständigen, kleinen Code der 
kompilierbar ist und gleichzeitig das Problem aufweist - also im 
Simulator geht aber nicht auf dem uC. Dann brauchen wir nicht jedes 
Detail einzeln von Dir zu erfragen.
OP #3605969
Lesenswert?

1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <avr/interrupt.h>
4

5
char wist, wsoll, dir;
6

7
int main()
8
{
9
  DDRA = 0x00;
10
  PORTA &= ~((1<<PA0) | (1<<PA1) | (1<<PA2) | (1<<PA3)); //habs auch ohne probiert 
11
  DDRD = 0xFF;
12

13
while(1)
14
{  
15
  wist = PINA & 0x1F;//<<da liegt das problem
16

17
  if(wist >= 10)
18
  {
19
    PORTD = 0x00;
20
  }
21

22
  if(wist <= 10)
23
  {
24
    PORTD = 0xFF;
25
  }
26
}
27
  return(1);
28
}
Angehängte Dateien:
Gast #3605990
Lesenswert?

> ... der code funktioniert in der simulation aber praktisch nicht =(

Nun, ein Problem ist im Code nicht erkennbar.

Und was funktioniert nun praktisch nicht?
Genauer: Was erwartest Du und was geschieht tatsächlich?

Zeige uns auch mal Deine Schaltung und mache ein Foto vom Aufbau.
Gast #3606012
Lesenswert?

Jetzt widersprechen sich zwei Antworten von mir und Hans.

Meiner Ansicht nach, wird hier mit Werten gerechnet, aber keine 
Zeichenmanipulation gemacht. Deswegen sollten die Werte integers sein.
Gast #3606021
Lesenswert?

Bitflüsterer schrieb:
> Jetzt widersprechen sich zwei Antworten von mir und Hans.
>
> Meiner Ansicht nach, wird hier mit Werten gerechnet, aber keine
> Zeichenmanipulation gemacht. Deswegen sollten die Werte integers sein.

von mir aus kann er das auch machen, aber PINA hat eben nur 8-Bit. Wenn 
er unbedingt "int" nehmen soll, dann auch dort "unsigned". Wobei das 
sign-bit hier abgeschnitten wird, da bei 8-15 keine "1" stehen können.

 Aber es ist einfach Verschwendung eine 16-Bit variable für ein 
8-Bit-Register zu verwenden.
Gast #3606046
Lesenswert?

Hans schrieb:
> Bitflüsterer schrieb:
>> Da mit integers verglichen wird,
>> sollten die Variablen auch integers sein.
>
>
>
> D. Kirschner schrieb:
>
1
 >>= 10
>
> ist je nach Lvalue ein Int oder ein char.

Wo hat der TO das geschrieben? Ein Versehen beim kopieren?

Jedenfalls ist das Problem, denke ich, eines von signed/unsigned.

Wenn man eine kleine Variable verwenden will, dann eben unsigned short 
int aber auf keinen Fall char, meine ich.
Gast #3606056
Lesenswert?

Bitlfüsterer schrieb:
> Wenn man eine kleine Variable verwenden will, dann eben unsigned short
> int aber auf keinen Fall char, meine ich.

Hm... jetzt ist aber eine Diskussion angebrochen. Ich vermute, Du kommst 
aus der PC-Programmierung. Ein char ist einfach ein 8-Bit-Variable. Wenn 
Du Dich durch die Header-Dateien gräbst, dann wirst Du sehen, dass 
jedenfalls bei den AVRs sehr wohl unsigned char verwendet wird. Der 
Compiler sieht in einem char einfach eine 8-Bit variable. Mit Strings 
hat das nicht unbedingt was zu tun.
Gast #3606064
Lesenswert?

D. Kirschner schrieb:
> weis auch jemand wie man einen port aufteilen kann?
>
> also vier eingänge (PA0 bis PA3) und vier eingänge (PA4 bis PA7)
> auslessen
>
> kann man das so machen:
>
> i = PINA & 0b00001111;
> k = PINA & 0b11110000;
>
> also so das k 1 bis 4 ist und i auch

Nein, dann so:
1
i = PINA & 0b00001111;
2
k = (PINA & 0b11110000) >> 4;
Gast #3606068
Lesenswert?

Bist Du Dir sicher, dass Du weist, was Du tust?

Eine Abfrage von Schaltern mittels XXX < YYY
ist außer in Sonderfällen, oder wenn man genau weis was man tut, Unsinn.

Im binären Bereich sollte man von vornherein mit unsigned Variablen 
arbeiten.

Allerdings bin ich mir immer noch nicht darüber im Klaren, was Du 
überhaupt vorhast. U. A. scheint  das Erklären nicht zu Deinen Stärken 
zu gehören.
Gast #3606073
Lesenswert?

Hans schrieb:
> Bitlfüsterer schrieb:
>> Wenn man eine kleine Variable verwenden will, dann eben unsigned short
>> int aber auf keinen Fall char, meine ich.
>
> Hm... jetzt ist aber eine Diskussion angebrochen. Ich vermute, Du kommst
> aus der PC-Programmierung.
Nein. Durchaus nicht. Programmiere ziemlich lange (jahrzehntelang) auch 
uCs.

> Ein char ist einfach ein 8-Bit-Variable. Wenn
> Du Dich durch die Header-Dateien gräbst, dann wirst Du sehen, dass
> jedenfalls bei den AVRs sehr wohl unsigned char verwendet wird.

Es ist unstrittig, dass man das machen kann und das es auch 
funktioniert. Dennoch ist das Argument plausibel, dass char, wie schon 
das Wort sagt "Zeichen" bedeutet.
Daraus folgt, dass ein Wert der als Zahl verwendet wird eben auch als 
int deklariert werden sollte. Das es viele anders machen ist meiner 
Ansicht nach kein ebenso plausibles Gegenargument.

> Compiler sieht in einem char einfach eine 8-Bit variable. Mit Strings
> hat das nicht unbedingt was zu tun.

Von Strings habe ich auch nichts gesagt. :-) (Schon der zweite Fall, das 
Du behauptest etwas sei geschrieben worden, was nicht geschrieben 
wurde).
Gast #3606087
Lesenswert?

Bitflüsterer schrieb:
> Es ist unstrittig, dass man das machen kann und das es auch
> funktioniert. Dennoch ist das Argument plausibel, dass char, wie schon
> das Wort sagt "Zeichen" bedeutet.
> Daraus folgt, dass ein Wert der als Zahl verwendet wird eben auch als
> int deklariert werden sollte. Das es viele anders machen ist meiner
> Ansicht nach kein ebenso plausibles Gegenargument.

Wenn Du die Plattform wechselst, dann bleibt ein unsigned char immer 
noch 8-Bit. Ein int oder ein short int kann dort durch aus größer sein 
als 16 bzw. 8 bit. Alleine für die Portierbarkeit sollte man bei 
8-Bit-Variablen bleiben, wenn solche gemeint sind.
Gast #3606096
Lesenswert?

Aber Hans, lassen wir das. Das ist eine Meinungsfrage und nicht 
entscheidend.

Was mich viel mehr irritiert, ist das es auf dem Chip mit unsigned char 
geht und mit char nicht und das es in der Simulation mit beidem geht.

Da das Vorzeichen ja in PINA nicht gesetzt sein sollte, dürfte signed 
unsigned garkeine Rolle spielen.
Gast #3606098
Lesenswert?

Hans schrieb:
> Bitflüsterer schrieb:
>> Es ist unstrittig, dass man das machen kann und das es auch
>> funktioniert. Dennoch ist das Argument plausibel, dass char, wie schon
>> das Wort sagt "Zeichen" bedeutet.
>> Daraus folgt, dass ein Wert der als Zahl verwendet wird eben auch als
>> int deklariert werden sollte. Das es viele anders machen ist meiner
>> Ansicht nach kein ebenso plausibles Gegenargument.
>
> Wenn Du die Plattform wechselst, dann bleibt ein unsigned char immer
> noch 8-Bit. Ein int oder ein short int kann dort durch aus größer sein
> als 16 bzw. 8 bit. Alleine für die Portierbarkeit sollte man bei
> 8-Bit-Variablen bleiben, wenn solche gemeint sind.

Sicher. Deswegen verwenden wir :-) ja auch nicht char sondern uint8_t.
Gast #3606101
Lesenswert?

Bitflüsterer schrieb:
> Was mich viel mehr irritiert, ist das es auf dem Chip mit unsigned char
> geht und mit char nicht und das es in der Simulation mit beidem geht.

Man weiß ja nicht, was an den Pins A4-A7 hängt. Wenn A7 immer high ist 
;) dann kann bei einem signed char immer nur eine negative Zahl raus 
kommen. Da wir die Schaltung nicht kennen, habe ich einfach geraten.
Gast #3606109
Lesenswert?

Hans schrieb:
> Man weiß ja nicht, was an den Pins A4-A7 hängt. Wenn A7 immer high ist
> ;) dann kann bei einem signed char immer nur eine negative Zahl raus
> kommen. Da wir die Schaltung nicht kennen, habe ich einfach geraten.

Dieses mal glaube ich, dass ich da Quatsch geschrieben habe, da ja 
ausmaskiert wird. Vielleicht wissen die Profis, wie Karl Heinz Buchegger 
oder Jörg Wunsch, warum das geholfen hat.

Ich halte mich mal raus und duck mich weg
Gast #3606113
Lesenswert?

Hans schrieb:
> Bitflüsterer schrieb:
>> Sicher. Deswegen verwenden wir :-) ja auch nicht char sondern uint8_t.
>
> uint8_t ist folgendermaßen definiert:
>
>
1
 typedef unsigned char   uint8_t
>
> aber ich hör mal auf mit dem Klugscheißern ;)

Das mag beim AVR-GCC so sein, aber wir haben ja davon gesprochen:

Beitrag "Re: mit eingänge rechnen"
>> Wenn Du die Plattform wechselst, ...


Hans schrieb:
> Man weiß ja nicht, was an den Pins A4-A7 hängt. Wenn A7 immer high ist
> ;) dann kann bei einem signed char immer nur eine negative Zahl raus
> kommen. Da wir die Schaltung nicht kennen, habe ich einfach geraten.

Selbst wenn das oberste Bit im Port gesetzt ist, dann sollte doch durch 
& 0x1F das oberste Bit im Ergebnis immer 0 sein. Und zwar egal ob es nun 
unsigned char oder signed char ist. Es sollte da auch keine Rolle 
spielen ob Simulation oder echter Chip. Was meinst Du?
Gast #3606127
Lesenswert?

Bitflüsterer schrieb:
> OK. Wenn wir beide das so sehen und das bedeutet, dass es wirklich so
> ist, dann lag ein völlig anderes Problem vor und der TO hat es nicht
> gelöst.

ich glaube schon, dass das Problem gelöst ist. Möglicherweise 
funktioniert die Bitmanipulation bei signed variablen nicht oder anders. 
Bin aber zu faul das jetzt mit dem gcc mal auszuprobieren. Die großen 
kommen bestimmt bald vom Sonntagsspaziergang :)
Gast #3606206
Lesenswert?

>unsigned char oder signed char...

Bei Bitmanipulationen gibt es kein "signed"  oder "unsigned", da diese 
Manipulationen eben auf Bitebene passieren.

 XXXXXXXX
&00011111
_______
 000?????  ?: Hier kommt's auf X an

Gruß Jonas
Gast #3606219
Lesenswert?

Bitflüsterer schrieb:
> Jetzt widersprechen sich zwei Antworten von mir und Hans.
>
> Meiner Ansicht nach, wird hier mit Werten gerechnet, aber keine
> Zeichenmanipulation gemacht. Deswegen sollten die Werte integers sein.

Der Typ für Text ist char, nicht signed char, nicht unsigned char, 
sondern char.

Bitflüsterer schrieb:
>> Compiler sieht in einem char einfach eine 8-Bit variable. Mit Strings
>> hat das nicht unbedingt was zu tun.
>
> Von Strings habe ich auch nichts gesagt. :-) (Schon der zweite Fall, das
> Du behauptest etwas sei geschrieben worden, was nicht geschrieben
> wurde).

Nun, ein String ist halt ein Array aus char. Sonst nutzt C nirgends char 
für Text. Für einzelne Zeichen wird in der Regel int benutzt. Schau dir 
mal die ganzen Standard-Funktionen an, die mit einzelnen Zeichen 
arbeiten, wie z.B. isalpha() oder toupper(). Dort wird als Parameter und 
Rückgabetyp für Zeichen nicht etwa char, sondern int verwendet.

Bitflüsterer schrieb:
>> uint8_t ist folgendermaßen definiert:
>>
>> typedef unsigned char   uint8_t >
>> aber ich hör mal auf mit dem Klugscheißern ;)
>
> Das mag beim AVR-GCC so sein,

Das muß eigentlich überall so sein, wo es ein uint8_t gibt.
Gast #3606245
Lesenswert?

Rolf Magnus schrieb:
> Bitflüsterer schrieb:
>> Jetzt widersprechen sich zwei Antworten von mir und Hans.
>>
>> Meiner Ansicht nach, wird hier mit Werten gerechnet, aber keine
>> Zeichenmanipulation gemacht. Deswegen sollten die Werte integers sein.
>
> Der Typ für Text ist char, nicht signed char, nicht unsigned char,
> sondern char.

Irrelevant. Das mag so sein, aber ich habe nirgendwo, auch nicht in dem 
von Dir zitierten Text, das Gegenteil geschrieben.

> Bitflüsterer schrieb:
>>> Compiler sieht in einem char einfach eine 8-Bit variable. Mit Strings
>>> hat das nicht unbedingt was zu tun.
>>
>> Von Strings habe ich auch nichts gesagt. :-) (Schon der zweite Fall, das
>> Du behauptest etwas sei geschrieben worden, was nicht geschrieben
>> wurde).
>
> Nun, ein String ist halt ein Array aus char. Sonst nutzt C nirgends char
> für Text.
Falsch. Ein einzelnes Zeichen wird als char deklariert. Nicht nur ein 
Array von chars. Der Programmierer triftt die Entscheidung, nicht die 
Sprache. Deine Aussage widerlegt auch nicht, dass ich nichts von Strings 
geschrieben habe.

> Bitflüsterer schrieb:
>>> uint8_t ist folgendermaßen definiert:
>>>
>>> typedef unsigned char   uint8_t >
>>> aber ich hör mal auf mit dem Klugscheißern ;)
>>
>> Das mag beim AVR-GCC so sein,
>
> Das muß eigentlich überall so sein, wo es ein uint8_t gibt.

Falsch. Auf der linken Seite des typedef kann jeder andere bekannte Typ 
stehen. Es gibt durchaus auch Systeme in denen ein unsigned char 16 Bit 
breit ist. Oder auf was bezieht sich "muß ... so sein"?
Gast #3606259
Lesenswert?

Bitflüsterer schrieb:
>> Der Typ für Text ist char, nicht signed char, nicht unsigned char,
>> sondern char.
>
> Irrelevant. Das mag so sein, aber ich habe nirgendwo, auch nicht in dem
> von Dir zitierten Text, das Gegenteil geschrieben.

Und was meintest du dann damit:

Bitflüsterer schrieb:
> Hans schrieb:
>> Bitflüsterer schrieb:
>>> Werte bitte int und nicht char
>>
>> Nee, PINA ist ein unsigned char.
>
> Das ist hier unwichtig.


> Wichtig ist vielmehr in welcher Weise die Werte nach dem Einlesen
> interpretiert werden. Da mit integers verglichen wird, sollten die
> Variablen auch integers sein.

Dann schau mal in die ISO-Norm. char ist dort ein "integer type", ganz 
genau wie int. Von den Regeln her unterscheiden die sich nicht, bis 
darauf, daß die Mindest-Wertebereich unterschiedlich ist und daß für 
char nicht festgelegt ist, ob es ohne entsprechende Angabe signed oder 
unsigned ist. Deshalb gibt man, wenn man char für Integers benutzen 
will, immer signed oder unsigned mit an.

>> Nun, ein String ist halt ein Array aus char. Sonst nutzt C nirgends char
>> für Text.
> Falsch.

Lies doch bitte den Rest meines Postings, den du beim Zitieren 
unterschlagen hast.

> Ein einzelnes Zeichen wird als char deklariert. Nicht nur ein
> Array von chars. Der Programmierer triftt die Entscheidung, nicht die
> Sprache.

Klar kann man sich als Programmierer gegen das entscheiden, was die 
Sprache vorgesehen hat. Klug ist das meistens allerdings nicht.

>> Bitflüsterer schrieb:
>>>> uint8_t ist folgendermaßen definiert:
>>>>
>>>> typedef unsigned char   uint8_t >
>>>> aber ich hör mal auf mit dem Klugscheißern ;)
>>>
>>> Das mag beim AVR-GCC so sein,
>>
>> Das muß eigentlich überall so sein, wo es ein uint8_t gibt.
>
> Falsch. Auf der linken Seite des typedef kann jeder andere bekannte Typ
> stehen. Es gibt durchaus auch Systeme in denen ein unsigned char 16 Bit
> breit ist. Oder auf was bezieht sich "muß ... so sein"?

Es bezieht sich - genau wie ich geschrieben habe - auf Plattformen, bei 
denen ein uint8_t überhaupt existiert. Wenn char 16 Bit breit ist, gibt 
es schlicht kein uint8_t, denn char ist der kleinstmögliche Typ, da per 
Definition sizeof(char)==1.
Gast #3606270
Lesenswert?

>Wenn char 16 Bit breit ist, gibt
>es schlicht kein uint8_t

Verstehe ich nicht?

Warum sollte es keine vorzeichenlose 8bit breiten Datentypen geben nur 
weil chars als Unicode (2byte) definiert sind?

he?
Gast #3606279
Lesenswert?

blamaster schrieb:
>>Wenn char 16 Bit breit ist, gibt
>>es schlicht kein uint8_t
>
> Verstehe ich nicht?
>
> Warum sollte es keine vorzeichenlose 8bit breiten Datentypen geben nur
> weil chars als Unicode (2byte) definiert sind?

Das hat nichts mit Unicode zu tun. char ist als erstes mal ein 
Integer-Typ wie short, int, long und long long auch. Es wird aber auch 
für Text verwendet. Außerdem ist char die kleinste einzeln adressierbare 
Einheit (byte). Daraus resultiert, daß sizeof(char) 1 ist. Es kann also 
keinen kleineren Typ als char geben. char wird daher in der Regel nur 
dann 16 Bit breit sein, wenn die Zielplattform mit kleineren Datentypen 
nicht umgehen kann. Und genau deshalb wird es dann auch kein uint8_t 
geben.
Gast #3606324
Lesenswert?

Rolf Magnus schrieb:
> Bitflüsterer schrieb:
>>> Der Typ für Text ist ...
>> Irrelevant. ...
> Und was meintest du dann damit:
>>> Bitflüsterer schrieb:
>>>> Werte bitte int und nicht char
>>> Nee, PINA ist ein unsigned char.
>> Das ist hier unwichtig.

Das es unwichtig sei, weil es ohnehin darum ging, mit dem Wert zu 
rechnen resp. ihn mit der "<=" Operation zu vergleichen. Das ist aber 
erstmal völlig unabhängig von Frage signed oder unsigned, sondern 
bezieht sich auf char oder short.

>> Wichtig ist vielmehr ...
> Dann schau mal in die ISO-Norm. char ist dort ein "integer type", ...

Da ich ja selbst ein Erbsenzähler bin, muss ich Dir leider recht geben. 
:-{ Ich bezog mich mit "integer" auf den Typ int und nicht auf die 
Terminologie in der Norm. Insofern war meine Ausdrucksweise unklar.

Um aber Mißverständnissen vorzubeugen, möchte ich betonen, das char 
meiner Ansicht nach nicht für Werte verwendet werden sollte, die als 
Zahlen interpretiert werden (wie das z.B. mit einem kleiner-Vergleich 
geschieht).
Ich meine mich da in guter Gesellschaft mit Karl Heinz B. zu befinden, 
mag aber in diesem Fall seine Aussagen falsch interpretieren.

Rolf Magnus schrieb:
>>> Nun, ein String ist halt ein Array aus char. Sonst nutzt C nirgends char
>>> für Text.
>> Falsch.
>
> Lies doch bitte den Rest meines Postings, den du beim Zitieren
> unterschlagen hast.

Ich versichere Dir: Es war nicht meine Absicht, eine meiner Ansicht 
widersprechende Aussage zu unterschlagen. Deinem nachfolgenden Text 
betreffs itoa, atoi etc. wollte ich nicht widersprechen. Deswegen habe 
ich ihn nicht zitiert. Er enthält aber meiner Ansicht nach nichts, was 
Deine Aussage irgendwie unterstützt.

Es ging darum, das Deine Aussage impliziert das char anders als in 
arrays für Zeichen nicht verwendet wird. Und das halte ich für falsch.
Deswegen auch das hier nachfolgende von mir, das Du zitiert hast.

Rolf Magnus schrieb:
>> Ein einzelnes Zeichen wird als char deklariert. Nicht nur ein
>> Array von chars. Der Programmierer triftt die Entscheidung, nicht die
>> Sprache.
>
> Klar kann man sich als Programmierer gegen das entscheiden, was die
> Sprache vorgesehen hat. Klug ist das meistens allerdings nicht.

Das möchte ich im Zusammenhang verstanden wissen: Du schriebst:
>Sonst nutzt C nirgends char für Text.
und das ist meiner Ansicht nach, definitiv falsch, denn die Sprache 
erlaubt ja die Deklaration einer Variablen dir nur ein char enthält.
Man mag darüber streiten ob das "was die Sprache vorsieht" das selbe ist 
oder auch nicht, wie das "was die Sprache erlaubt auszudrücken". In 
diesem Fall gehe ich aber davon aus, das sich beide Dinge decken.

>>> Bitflüsterer schrieb:
>>>>> uint8_t ist folgendermaßen definiert:
>>>> Das mag beim AVR-GCC so sein,
>>> Das muß eigentlich überall so sein, wo es ein uint8_t gibt.
>> Falsch. Auf der linken Seite des typedef kann jeder andere bekannte Typ
>> stehen.

> Es bezieht sich - genau wie ich geschrieben habe - auf Plattformen, bei
> denen ein uint8_t überhaupt existiert. Wenn char 16 Bit breit ist, gibt
> es schlicht kein uint8_t, denn char ist der kleinstmögliche Typ, da per
> Definition sizeof(char)==1.

Au weia. Du hast recht. Ich bitte um Entschuldigung. Leider passiert mir 
das nicht das erstemal.
Ich werde hier lieber nichts mehr zu C sagen und mich vorerst auf Fragen 
beschränken, bevor ich nicht die Norm gründlich gelesen habe und sie mir 
danach unter's Kopfkissen gelegt habe.
Gast #3606355
Lesenswert?

>>Wenn char 16 Bit breit ist, gibt es schlicht kein uint8_t
>
> Warum sollte es keine vorzeichenlose 8bit breiten Datentypen geben nur
> weil chars als Unicode (2byte) definiert sind?

Unicode beschreibt die Zeichen, nicht deren Darstellung.
Wenn du Multibytezeichen verwenden möchtest, dann ist "char" der falsche 
Datentyp, richtig ist dann "wchar_t".

Bitflüsterer schrieb:
>> Klar kann man sich als Programmierer gegen das entscheiden, was die
>> Sprache vorgesehen hat. Klug ist das meistens allerdings nicht.
>
> Das möchte ich im Zusammenhang verstanden wissen: Du schriebst:
>>Sonst nutzt C nirgends char für Text.
> und das ist meiner Ansicht nach, definitiv falsch, denn die Sprache
> erlaubt ja die Deklaration einer Variablen dir nur ein char enthält.

Sicher. Ein "char" ist aber kein Zeichen, sondern ein gewöhnlicher 
(normalerweiser) 8 Bit breiter Integer, nichts anderes. Im Gegensatz 
dazu wird für einzelne Zeichen in der libc aber "int" verwendet, nun 
rate mal, warum. ;-)

"char" stand mal für "character", zu einer Zeit, als Computer auch nicht 
durch 8 teilbare Wortbreiten verwendeten. Dem ist nicht mehr so.

Lass dich nicht durch den Namen verwirren.

Gruß,
Svenska
Gast #3606359
Lesenswert?

Bitflüsterer schrieb:
> Rolf Magnus schrieb:
>> Bitflüsterer schrieb:
>>>> Der Typ für Text ist ...
>>> Irrelevant. ...
>> Und was meintest du dann damit:
>>>> Bitflüsterer schrieb:
>>>>> Werte bitte int und nicht char
>>>> Nee, PINA ist ein unsigned char.
>>> Das ist hier unwichtig.
>
> Das es unwichtig sei, weil es ohnehin darum ging, mit dem Wert zu
> rechnen resp. ihn mit der "<=" Operation zu vergleichen. Das ist aber
> erstmal völlig unabhängig von Frage signed oder unsigned, sondern
> bezieht sich auf char oder short.

Der Unterschied ist aber eigentlich nur, daß char in der Regel kleiner 
ist.

> Um aber Mißverständnissen vorzubeugen, möchte ich betonen, das char
> meiner Ansicht nach nicht für Werte verwendet werden sollte, die als
> Zahlen interpretiert werden (wie das z.B. mit einem kleiner-Vergleich
> geschieht).

Da gebe ich dir recht, allerdings nur für char ohne weitere Verzierung. 
signed char und unsigned char können problemlos als kleine Integer 
verwendet werden, während ich sie für Text nicht empfehlen würde.
Mit unsigned char zu rechnen, bringt aber eigentlich nur dann was, wenn 
man eine 8-Bit-Plattform hat, auf der int halt teurer ist oder wenn man 
sehr platzsparend programmieren muß. In anderen Fällen hat int 
normalerweise keinen Nachteil gegenüber char zum rechnen.

> Ich versichere Dir: Es war nicht meine Absicht, eine meiner Ansicht
> widersprechende Aussage zu unterschlagen. Deinem nachfolgenden Text
> betreffs itoa, atoi etc. wollte ich nicht widersprechen. Deswegen habe
> ich ihn nicht zitiert. Er enthält aber meiner Ansicht nach nichts, was
> Deine Aussage irgendwie unterstützt.

Nun, es zeigt, daß ISO C für einzelne Zeichen int nutzt und nicht char.

> Es ging darum, das Deine Aussage impliziert das char anders als in
> arrays für Zeichen nicht verwendet wird. Und das halte ich für falsch.

Es wird von den Standardfunktionen nicht für einzelne Zeichen verwendet. 
Das hatte ich vielleicht auch etwas mißverständlich ausgedrückt. Selbst 
kann man natürlich auch einzelne Zeichen in char speichern, aber auch 
hier nur in char, niemals in signed char oder unsigned char.

> Deswegen auch das hier nachfolgende von mir, das Du zitiert hast.

Ja, auch das war sicher etwas mißverständlich.
Gast #3606388
Lesenswert?

Svenska schrieb:
> "char" stand mal für "character", zu einer Zeit, als Computer auch nicht
> durch 8 teilbare Wortbreiten verwendeten. Dem ist nicht mehr so.

Es hat sicher auch was mit der ursprünglichen Bedeutung des Bytes zu 
tun. Zwei Definitionen waren da gängig:

- Die kleinste einzeln adressierbare Einheit der Plattform
- Die Menge Speicher, die für ein Zeichen des Standard-Zeichensatzes 
genutzt wird

Somit war damals zwischen dem kleinsten Integer-Datentyp und dem 
Datentyp für Zeichen ein fester Zusammenhang. In C ist ersteres als 
"Byte" definiert, letzteres als "char", wobei beides dieselbe Größe hat.
Heute in Zeiten von Unicode und Multibyte-Zeichen und von Dutzenden von 
unterstützen Zeichensätzen gibt es diesen Zusammenhang so natürlich 
nicht mehr.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren