Forum: Mikrocontroller und Digitale Elektronik (unsigned) long rechenproblem // libc avr atmega8


von gast (Gast)


Lesenswert?

hallo,

ich versuche folgendes programm auf einem atmega8 zum laufen zubekommen

1
//alle variablen sind unsigned long (aus verzweifelung :P)
2
3
jahr=1970;
4
monat=2;
5
tag=2;
6
stunde=0;
7
minute=0;
8
sekunde=0;
9
10
      for(int j=1970;j<jahr;j++)
11
                {
12
                if(j%4==0 && j%100!=0 || j%400==0)       {unix_sekunden+=(366*24*60*60);}
13
        else                     {unix_sekunden+=(365*24*60*60);}
14
                }
15
                
16
        for(int j=1;j<monat;j++)
17
        {
18
        if(j==1 || j==3 || j==5 || j==7 || j==8 || j==10 || j==12)   {unix_sekunden+=(31*24*60*60);}
19
        if(j==4 || j==6 || j==9 || j==11)              {unix_sekunden+=(30*24*60*60);}
20
        if(j==2) {if(j%4==0 && j%100!=0 || j%400==0){unix_sekunden+=(29*24*60*60);} else {unix_sekunden+=(28*24*60*60);}}
21
        }
22
23
        unix_sekunden+=((tag-1)*24*60*60);
24
          unix_sekunden+=(stunde*60*60)-3600;
25
        unix_sekunden+=minute*60;
26
        unix_sekunden+=sekunde;


vorweg: das programm ist richtig und läuft! nur tut es das nicht auf dem 
µC :/

ich vermute das es irgendwas mit den 32ig bitigen long variablen zutun 
hat, da die niederwertigsten 4byte richtig dargestellt werden... die 
anderen 4sind meistens null bzw das 4te zeigt manchmal etwas an(aber 
falsch)


gruß

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Mein Verdacht:
Deine Konstanten haben auf dem uC (welcher auch immer) nur 16 Bit   :-o
Und was gibt 366*24*60*60?
Da fehlt an geeigneter Stelle ein UL

von gast (Gast)


Lesenswert?

ne die variable hat 32bit. laut libc faq


aber was mir grade in den sinn kommt:
aber wo wird 366*24*60*60 gespeichert bevor es mit der variable 
verrechnet wird?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>  laut libc faq
Na gut, falls du es noch nicht gemerkt hast: für welchen Prozessor?

> ne die variable hat 32bit.
Ich hatte von den Konstanten gesprochen (z.B. 366*24*60*60 = 31622400)

> aber wo wird 366*24*60*60 gespeichert bevor es mit der variable
> verrechnet wird?
Es wird vom Compiler vermutlich als 16-Bit Konstante ausgerechnet.

von gast (Gast)


Lesenswert?

>Ich hatte von den Konstanten gesprochen

ups überlesen.
ich werd mal versuchen das irgendwie mit long variablen grade zubiegen


>für welchen Prozessor?
der atmega8 HAT 32bit long variablen..weiß ich da ich sie schon genutzt 
habe :)

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:
>>Ich hatte von den Konstanten gesprochen
>
> ups überlesen.
> ich werd mal versuchen das irgendwie mit long variablen grade zubiegen
>
>
>>für welchen Prozessor?
> der atmega8 HAT 32bit long variablen..weiß ich da ich sie schon genutzt
> habe :)

Falls du es noch nicht gemerkt hast:
Dem Compiler ist es völlig egal, ob deine Variable 32 Bit hat oder 
nicht. Während er 366*24*60*60 ausrechnet, interessiert ihn das ganz 
einfach nicht. Der Datentyp der Ergebnisvariable ist nie relevant, wenn 
es darum geht festzulegen, welche Operationen für eine Berechnung 
benutzt werden.

von gast (Gast)


Lesenswert?

jo das ist mir schon klar.

ich glaube das zitieren ist hier etwas vom weg abgekommen ^^

viel wichtiger wäre mir...wie löse ich das problem effektiv?
atm fällt mir nur eine schleife ein in der ich jedesmal 2^16 addiere bis 
ich am ziel bin...das wären dann für ein jahr >400 schleifen 
durchgänge...unschön :/

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:

> viel wichtiger wäre mir...wie löse ich das problem effektiv?

Oh Mann

  366UL*24UL*60UL*60UL

(Eigentlich würde 1 UL schon reichen, aber was solls)

Jetzt rechnet der Compiler diesen Ausdruck mit long Arithmetik aus.

von gast (Gast)


Lesenswert?

yeyyyy

danke das hats gebracht

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

gast schrieb:
> yeyyyy
> danke das hats gebracht
Häh? Sieh mal meinen ersten Post im 
Beitrag "Re: (unsigned) long rechenproblem // libc avr atmega8" an.
Mitdenken und Googeln ist nicht verboten.
(Regie: dreht sich kopfschüttelnd ab)

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.