Alex: Fallstrick in C?

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

  1. 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";

    1. 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!

      1. 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

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. 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

          1. 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

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
  2. 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