Forum: Compiler & IDEs [GCC/ WinAVR] Konstanten zur Laufzeit / beim Compilieren


von Hans (Gast)


Lesenswert?

Wenn in einem Programm die unten stehende Zeile[1] steht, ist der vom 
Compiler (GCC / WinAVR) übersetzte Zielcode 1338 Bytes groß. Wird der 
Ausdruck von Hand errechnet und eingetragen[2], dann ist der Zielcode 
538 Bytes groß.

Der Compiler ermittelt doch in der Regel Konstanten zur Zeit des 
Compilierens - oder nicht? Muss ich einen Schalter angeben, damit er 
dies tut?



[1] T = (Ut - (4095.0/5.0)*(1.162-12.3*0.0079)) * 154 ;

[2] T = (Ut - 872) * 154 ;

von Yalu X. (yalu) (Moderator)


Lesenswert?

Du musst das innere Produkt nach int casten, sonst wird
1
T = (Ut - 872.09577) * 154;

gerechnet. Also so:
1
T = (Ut - (int)((4095.0/5.0)*(1.162-12.3*0.0079))) * 154;

bzw. so (um Rundungsfehler zu minimieren):
1
T = (Ut - (int)((4095.0/5.0)*(1.162-12.3*0.0079)+0.5)) * 154;

von Hans (Gast)


Lesenswert?

> Du musst das innere Produkt nach int casten ...

Die Einführung von (int) ändert nichts an der länge des Zielcodes.

Das Problem ist, dass der GCC-Compiler konstante Ausdrücke nicht zur 
Zeit der Übersetzung berechnet.

von Hans (Gast)


Lesenswert?

Du hast recht :)

Die Klammer um den Ausdruck fehlte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.