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?
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
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.
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 ;)
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
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 |
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.
Volker Zabe schrieb: > Ansonsten ist eine gans normaler Integer-Typ. Seit wann hat eine Gans was mit Integern zu tun?
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.
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.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.