www.mikrocontroller.net

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


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich versuche folgendes programm auf einem atmega8 zum laufen zubekommen

//alle variablen sind unsigned long (aus verzweifelung :P)

jahr=1970;
monat=2;
tag=2;
stunde=0;
minute=0;
sekunde=0;

      for(int j=1970;j<jahr;j++)
                {
                if(j%4==0 && j%100!=0 || j%400==0)       {unix_sekunden+=(366*24*60*60);}
        else                     {unix_sekunden+=(365*24*60*60);}
                }
                
        for(int j=1;j<monat;j++)
        {
        if(j==1 || j==3 || j==5 || j==7 || j==8 || j==10 || j==12)   {unix_sekunden+=(31*24*60*60);}
        if(j==4 || j==6 || j==9 || j==11)              {unix_sekunden+=(30*24*60*60);}
        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);}}
        }

        unix_sekunden+=((tag-1)*24*60*60);
          unix_sekunden+=(stunde*60*60)-3600;
        unix_sekunden+=minute*60;
        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ß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :/

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
yeyyyy

danke das hats gebracht

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.