(unsigned) long rechenproblem // libc avr atmega8

Gast #1497177
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ß
Moderator (Firma: Titel) Persönliche Seite #1497225
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.
Gast #1497232
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 :)
#1497297
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.
Gast #1497302
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 :/

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren