[GCC/ WinAVR] Konstanten zur Laufzeit / beim Compilieren

Gast #2280042
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 ;
Moderator #2280069
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;
Gast #2280100
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.

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