Werte Konvertierung schlägt fehlt!?

OP #2685086
Hallo Leute,
ich arbeite noch nicht lange mit C und dem GCC. Momentan verwende ich 
das AVR-Studio und WIN AVR. Mein Problem sieht sehr simpel aus und die 
Lösung ist es vermutlich auch, aber ich komme nicht drauf ;)

Schonmal Vielen Dank im Voraus.

Problem ist folgendes:


foo(uint32_t i) verwendet das Argument i als Zähler um i-mal eine andere 
Funktion auszuführen.

rufe ich die Funktion mit fixen Werten im Quelltext auf wie z.B.

foo(32000) wird die Funktion auch 32000mal ausgeführt (while(i--))

Sobald ich allerdings eine Variable oder zu berechnende Werte wie
(2*16000)  oder  uint32_t help = x*y  als Argument gebe, schlägt es 
fehl.

casts haben mich auch nicht weitergebracht:  foo((uint32_t)(x*y));
Egal was ich mache, wenn der Wert nicht fertig im Quelltext steht wird 
die while-Schleife nicht korrekt durchlaufen. Ich nehme an dies liegt an 
der Arbeitsweise vom Compiler? Könnte es was bringen Binärdarstellungen 
in eine 32bit Integer zu shiften?


foo(uint32_t i)
{
  while(i--)
   doIt();

}


Grüße

dashin
OP
void repeat(uint16_t val, uint32_t i)
{

  while (i--)

  send(val);

}


void doIt(uint16_t a0, uint16_t b0, uint16_t a1, uint16_t b1, uint16_t 
val)
{

    uint32_t temp = (uint32_t)  ((a1-a0+1)*(b1-b0+1));
    repeat(val,temp);

}


Rechne ich  ((a1-a0+1)*(b1-b0+1)) von Hand aus und schreibe das Ergebnis 
klar      uint32_t temp = 10000;

funktioniert alles.

Ergänzung:  Bei kleinen Werten für temp funktioniert auch mit Variablen 
alles. Bsp. temp = x*y  und x = 10 und y = 123
Gast
Andreas B. schrieb:
> uint32_t temp = (uint32_t)  ((a1-a0+1)*(b1-b0+1));

Du darfst nicht erst das Ergebnis zu 32Bit casten sondern einen der 
Operanden.

Sonst findet die Rechnung mit 16 Bit statt. Du erhälst einen Überlauf 
und erst dieser (übergelaufene) Wert wird nach 32 Bit gecastet.
Andreas B. schrieb:
> Ja! Ich danke Euch von ganzem Herzen! Toll wie schnell man hier
> Unterstützung findet. Ich hoff ich kann das später auch mal zurückgeben
> :)
>
> uint32_t temp =  (((uint32_t) (a1-a0+1))*(b1-b0+1));
>
> funktioniert einwandfrei.

Dann kann da aber was nicht stimmen.
Wenn dir beim händischen Rechnen 10000 (Zehntausend) rauskommt, bist du 
selbst mit 16 Bit Rechnerei auf der sicheren Seite.
OP
> Dann kann da aber was nicht stimmen.
> Wenn dir beim händischen Rechnen 10000 (Zehntausend) rauskommt, bist du
> selbst mit 16 Bit Rechnerei auf der sicheren Seite.

ah, ich merks grad :/ hab das Beispiel von Zehntausend total falsch 
gewählt. Der Fehler tritt wie zu erwarten, erst bei Werten über 2^16 
auf.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.