www.mikrocontroller.net

Forum: Compiler & IDEs GCC 4.1.1 vergleich zweier longs klappt nicht


Autor: marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
hab folgendes Problem vergleiche zwei unsigned long Werte :

unsigned long dimmpunkt,dimmdauer;

dimmpunkt = (uint32_t)(rtc_getTimeInSecond() - starttimesec);
dimmdauer = (uint32_t)(dimmStore.dimmMinuten*60);

rprintf("Dimm Now: %d \r\n",dimmpunkt);
rprintf("Dimmdauer: %d \r\n",dimmdauer);

if(dimmpunkt <= dimmdauer)
  Es wird nie hierhin gesprungen egal ob dimmpunkt <= dimmdauer!!!


Wenn ich es mit unsigned int mache klappt es einwandfrei... brauche nur 
für den Wertebereich unsigned long...

Kann es mir nicht erklären?!?!
Hat jemand einen Typ?

- GCC 4.1.1
- ATMega128

LG
marc

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rprintf("Dimm Now: %lu \r\n",dimmpunkt);
rprintf("Dimmdauer: %lu \r\n",dimmdauer);

Autor: marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das nicht klappen war eher auf das

if(dimmpunkt <= dimmdauer)

bezogen. Es wird nie "in" das if verzweigt. Die Ausgabe gibt korrekte 
Werte wieder trotzdem wird nicht ins If verzweigt wenn dimmpunkt <= 
dimmdauer???

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woran stellst du das fest?

Autor: marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da keine weiteren Debug Meldungen mehr ausgegeben werden, die Ausgabe 
##Aufdimmen####### müsste ausgegeben werden wenn dimmpunkt <= dimmdauer, 
das passiert aber nicht. Ich kann es mir auch nicht erklären! Sobald ich 
dimmpunkt & dimmdauer zum Test mal als unsigned int def. klappt es 
einwandfrei, natürlich nur solange es nicht zum Überlauf kommt.

if(dimmpunkt <= dimmdauer)
{   // ist Aufdimmzyklus

  dimmwert = dimmerGetLevel(dimmer,dimmpunkt,1);
#ifdef DEBUG
  rprintf("##Aufdimmen#######\r\n");
#endif
}

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die Ausgabe gibt korrekte Werte wieder

Woher weisst du das, wo du nur 16 von 32 Bits anzeigst?

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wird zwar nicht der Fehler sein, aber warum definierst du die Variablen 
anders als du sie castest?

Wie sind denn die anderen Variablen bzw. Funktionen definiert?

der cast nach der Berechnung ist auch etwas sinnfrei ...

ich vermute mal das du in der Berechnung einen Überlauf hast.

Autor: marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das casten it überbleibsel von diversen Test...Nach einigen rumprobieren 
komm ich der Sache auf die Schliche... was passiert wenn man eine float 
Value zB.

0.166 * (uint_32)10 malnimmt. Bei mir kommt nur Blödsinn raus... Kann 
man keine uint_32 mit einer Float multiplizieren? Gibts da irgendwo 
einen Überlauf. Hab mich tot gesucht und nix gefunden, wahrscheinlich 
bin ich zu blöd ... Vermute mal das das auch bei vergleich von 2 uint_32 
passiert. Wie gesagt verwendet man uint_16 klappt multiplikation mit 
Float und Vergleich per IF...

marc

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
marc wrote:

> 0.166 * (uint_32)10 malnimmt. Bei mir kommt nur Blödsinn
> raus... Kann man keine uint_32 mit einer Float multiplizieren?

Doch, man kann, ist aber bissel sinnfrei.  Die 10 wird ja (egal ob
int, uint16_t oder uint32_t) als Allererstes in eine 10.0 umgewandelt.

> ... Vermute mal das das auch bei vergleich von 2 uint_32 passiert.

Du sprichst immer noch Vermutungen aus, ohne irgendwas zu belegen.

Das, was du beschreibst, sollte alles funktionieren.  Du wirst also
wohl irgendwas anderes vergurkt haben, aber wirfst uns hier nur die
fürs Problem nicht relevanten Codeschnipsel hin.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, aber deine Info ist zu knapp. Ohne den Datentyp jeder Variablen 
und Funktion zu kennen, bleibt alles im Dunkel.

Wenn beispielweise in (dimmStore.dimmMinuten*60) der Typ von dimmMinuten 
16bittig ist, ist es das Ergebnis auch, egal in was du das dann castest.

Und wenn (rtc_getTimeInSecond() - starttimesec) negativ werden kann, 
dann wird es auch interessant.

Dass if(dimmpunkt <= dimmdauer) nicht korrekt funktioniert, glaube ich 
erst, wenn die beide Werte gesehen habe. Was mit %d printf nicht der 
Fall ist, denn %d passt nun einmal nicht zu den Datentypen.

Und (0.166 * (uint_32)10) dürfte mit oder ohne cast funktionieren, nur 
ist das Ergebnis vom Type "double" und nicht uint_32. Der Rest hängt 
davon ab, was du damit machst.

Autor: marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem gefunden!!! War ein Pointer Fehler an einer ganz anderen Stelle, 
dadurch wurde die uint32_t Var zerschossen. Asche über mein Haupt das 
ich zweifeln konnte :)

marc

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.