Fallstrick in C?
Alex
- programmiertechnik
Hallo alle zusammen!
Kurioses Problem: Ich programmiere gerade einen Microcontroller in C, avrgcc ist der Compiler. Wenn ich schreibe
uint8_t s;
time_t t;
s = n/100;
t.csecs = n % 100;
t.secs = (s % 60);
t.mins = (s/60) % 10;
erhalte ich beispielsweise für den Input n=25856 im Feld secs den Wert 2 und in mins eine 0. Mit einem expliziten
time_t t;
t.csecs = n % 100;
t.secs = ((n/100) % 60);
t.mins = ((n/100)/60) % 10;
erhalte ich hingegen das erwartete secs=18, mins=4. Sieht hier jemand die Ursache des Problems in der ersten Variante, bevor ich mich durch den Assemblercode gewühlt hab? Warnings gibt es übrigens keine.
Grüße,
Alex
echo $begrüßung;
uint8_t s;
s = n/100;
erhalte ich beispielsweise für den Input n=25856 im Feld secs den Wert 2 [...]
258 ist ein bisschen groß für einen 8-Bit-unsigned-Integer (0..255), nicht?
echo "$verabschiedung $name";
Hallo dedlfix.
uint8_t s;
s = n/100;
erhalte ich beispielsweise für den Input n=25856 im Feld secs den Wert 2 [...]258 ist ein bisschen groß für einen 8-Bit-unsigned-Integer (0..255), nicht?
Argl! Betriebsblindheit ...
Vielen Dank!
Hello,
Argl! Betriebsblindheit ...
Wie wäre es mit der Aktivierung des Range Check?
Oder ist Deine Anwendung zeitkritisch?
Mit range Check müsste es auch einen Fehlercode geben oder einen Runtime-Error, wenn der Fehlercode nicht abgefragt wird.
Ein harzliches Glückauf
Tom vom Berg
Wie wäre es mit der Aktivierung des Range Check?
Oder ist Deine Anwendung zeitkritisch?Mit range Check müsste es auch einen Fehlercode geben oder einen Runtime-Error, wenn der Fehlercode nicht abgefragt wird.
Nicht so auf einen Mikrocontroller. Da gibts es nämliche keine Runtime-Errors und auch kein Betriebssystem.
Außerdem is der Programmspeicher auf nem Controller meistens sehr begrenzt, so dass sich der Aufwand beim Programmieren mehr lohnt, als den Code durch zusätzliche Prüfungen zur Laufzeit aufzublähen.
Gruß,
Klaus
Hello,
Außerdem is der Programmspeicher auf nem Controller meistens sehr begrenzt, so dass sich der Aufwand beim Programmieren mehr lohnt, als den Code durch zusätzliche Prüfungen zur Laufzeit aufzublähen.
Das sehe ich ein :-)
Ein harzliches Glückauf
Tom vom Berg
Hallo,
uint8_t s;
time_t t;s = n/100;
t.csecs = n % 100;
t.secs = (s % 60);
t.mins = (s/60) % 10;
s hat den Typ uint8\_t. Der Wertebereich von uint8\_t beträgt 0 bis 255. 25856 geteilt durch 100 ergibt 258,65. Da es sich um Integerwerte handelt 258. Und jetzt verrat mir mal wie du diese 258 in der 8-Bit-Variable unterbringen willst?
Gruss,
OhneName