Forum: Compiler & IDEs unsigned char hochzählen?


von Stefan (Gast)


Lesenswert?

Hallo,

ich brauche in einer Funktion eine Variable, die immer bis 2 zählt und 
dann zurückgesetzt wird.

Würde folgendes funktionieren:
{
static unsigned char t=0;

if(t < 3)   // wird alle 60ms ausgeführt
 {
  t++;
 }
else
  t=0;

}

Geht das, oder wegen dem Datentyp "unsigned char" nicht?

von Volker Z. (vza)


Lesenswert?

Hallo Stefan,
Mein C-Buch ist zwar 21 Jahre alt, aber da steht der Wertebereich der 
Typen noch drinn.
Steht es in den heutigen Büchern nicht mehr drin?

Volker

von Stefan (Gast)


Lesenswert?

Der Wertebereich ist nicht mein Problem. Ich dachte nur das eine 
char-Variable nach der ASCII-Tabelle geht und ich bin mir nicht sicher, 
ob ich da die Abfrage

t < 3
oder
t < '3'

Machen kann und was genau bei t++; passiert.

von Markus (Gast)


Lesenswert?

Schau mal genauer in der ASCII Tabelle nach, was Zeichen wirklich sind 
;-)
das Zeichen '3' wäre dezimal 51, also klappt das mit t<3 sicherlich ;)

von Volker Z. (vza)


Lesenswert?

Zugegeben, der Name dieses Types ermöglicht duraus verwirrung.
Der name soll aber nur andeuten das hier der wertebereich der 
ASCII-Codierten zeichen hinnein passt. Ansonsten ist eine gans normaler 
Integer-Typ.

'3' == 0x33 == 51
sind nur andere Darstellungen ein un dem selben Werts. Der 
Speicherstelle ist es egal wie Du den Wert eingegeben hast oder wie Du 
ihn darstellst.
Es steht immer 00110011b drinnen.

Volker

von Sepp (Gast)


Lesenswert?

Also, so wie ich dich verstanden habe, willst du ja bis 2 zählen. Also 
soll die Variable den Wert 0, 1 oder 2 haben. Also kommt kein ASCII 
Zeichen vor.
1
static unsigned char t=0;
2
3
if(t < 3)   // wird alle 60ms ausgeführt
4
 {
5
  t++;
6
 }
7
else
8
  t=0;

sollte gehen, eleganter ist aber:
1
static unsigned char t=0;
2
3
t++;
4
t%=2; //Bei 2 wird die Variable zu 0

von DirkB (Gast)


Lesenswert?

Bei  t%=2 hat t nur die Zustände 0 und 1.  Darum t%=3

von Peter II (Gast)


Lesenswert?

DirkB schrieb:
> Bei  t%=2 hat t nur die Zustände 0 und 1.  Darum t%=3

und eine division durch 3 ist nicht gerade effizent, wenn man es als IF 
schreibt es es lesbarer und auch noch schneller.

von Micha (Gast)


Lesenswert?

Volker Zabe schrieb:
> Ansonsten ist eine gans normaler Integer-Typ.
Seit wann hat eine Gans was mit Integern zu tun?

von Ui (Gast)


Lesenswert?

Stefan schrieb:
> if(t < 3)   // wird alle 60ms ausgeführt
>  {
>   t++;
>  }
> else
>   t=0;

So schreibt das niemand.

if(t<3)t++;elset=0;

Alles in einer Zeile ist viel übersichtlicher.

von Peter II (Gast)


Lesenswert?

Ui schrieb:
> if(t<3)t++;elset=0;
> Alles in einer Zeile ist viel übersichtlicher.
scheinbar verliert hier der compiler schon die übersicht, dann er wird 
es nicht verstehen.

von Martin (Gast)


Lesenswert?

Muss es nicht:
1
if(t < 2)   // wird alle 60ms ausgeführt
2
 {
3
  t++;
4
 }
5
else
6
  t=0;
heissen? Also t<2 statt t<3? Sonst zählt die Kiste doch von 0, 1, 2, 3, 
0...

von Martin (Gast)


Lesenswert?

Martin schrieb:
> Also t<2 statt t<3?

Nein.

> Sonst zählt die Kiste doch von 0, 1, 2, 3, 0...

Nein.

von Rolf Magnus (Gast)


Lesenswert?

Martin schrieb:
> Martin schrieb:
>> Also t<2 statt t<3?
>
> Nein.

Doch.

>> Sonst zählt die Kiste doch von 0, 1, 2, 3, 0...
>
> Nein.

Doch.

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.