Werte Konvertierung schlägt fehlt!?

OP #2685086
Lesenswert?

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 #2685108
Lesenswert?

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
#2685179
Lesenswert?

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 #2685199
Lesenswert?

> 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

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