PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Float-Konstante im Headerfile berechnen?



the_Ghost666
06.02.2009, 12:16
Moin,
Ich stoße beim GCC gerade auf ein Problem.
Ich möchte für eine Spannungsmessung die AD-Werte in eine Spannung umrechnen und in eine Floatvariable legen.
Dafür brauche ich ja einen Koeffizienten, Referenzspannung/Auflösung.

#define AD_Reference 2.5 //in Volt
#define AD_Bit_Res 65535 //Resolution of the ADC

so, jetzt möchte ich zwei Zeilen später im Header-File das hier machen:

const float AD_Constant= AD_Reference/AD_Bit_Res;

Resultat, der Compiler findet das Object-File nichtmehr.
Mache ich was falsch oder kann der Compiler keine Berechnungen, nur Ersetzungen durchführen?
Meine Notlösung ware eine Funktion, die diese Berechnung macht und am Anfang ausgeführt wird, dann ist AD_Constant nurnoch als float, nicht als const float definiert.
Ich möcht halt vermeiden einen festen Wert dorthin zu schreiben, den der User nicht ohne Taschenrechner versteht.
Kennt jemand eine Lösung?

McJenso
06.02.2009, 13:21
Hallo,

habe die Zeilen in ein Programm eingefügt. Das haut bei mir hin. Ich vermute der Fehler liegt um die Zeilen herum.

Gruß

Jens

the_Ghost666
06.02.2009, 13:45
Mh.. du hast recht, das Problem ist in einer .c Datei nicht, nur wenn ich es in einer .h mache

Besserwessi
06.02.2009, 14:19
Solche fsten Werte sollte man rein per #define festlegen. Dabei sollte man aber lieber ein paar extra Klammern spendieren, denn die #Defines werden erst mal rein als ASCII text ausgeführt und nicht schon berechent. Die Berechnung folgt dann erst später.

Auch wenn der Wert als Const float .... definiert ist, wird der Wert erst mal ins RAM kopiert, so wie bei einer initialisieren Variable. In wieweit das dann beim optimieren wieder wegfällt ist schwer zu sagen. Wenn es über 2 Files verteilt ist, dann wird es aber kaum wegfallen können.

the_Ghost666
06.02.2009, 14:25
Grundsätzlich stimm ich dir da zu, aber nicht in dem Fall, denn da steht dann 38.3446e-005 und dass dann noch deutlich zu erklären, find ich schwieriger als an zwei stellen ganzzahlen oder zahlen mit einer nachkommastelle einzutragen. soll halt auch für den dau als modul nutzbar sein, der quick& dirty das einsetzen will statt groß drüber nachzudenken.
Hab die variablen deklaration einfach in das .c file geschoben, die defines bleiben im header und es klappt (mit nem simulator geprüft). Mit dem Ram hab ich kein Problem, deswegen stört das nicht.

Besserwessi
06.02.2009, 16:28
Wenn man das mit #define macht, kreigt man die Augerechente Zahl auch nicht zu sehen. Das einzige was passiert ist, daß der Compiler den Ausdruck AD_Reference/AD_Bit_Res ggf. mehr mals während des compilierens berechenen muß. Das ist aber Rechenzeit am PC und fällt nicht weiter auf. Der Code wird eventuell auch etwas anders:
mit const ... wird am Anfang die Constante mit ins RAM copiert und dannach wie eine variable angesprochen. Mit define wird die Konstante ggf. auch mehrmals vermutlich per LDI reg,xxx direkt in Register geladen. Was jetzt kürzer wird müßte man im Einzelfall sehen.

the_Ghost666
06.02.2009, 16:45
Ach moment, du meinst ,dass ich die Quotientenbildung auch in die #define Anweisung geben kann? Aber natürlich, hast ja völlig recht! Dann tauscht der compiler im ersten Durchgang die Formel im #define gegen den Ausdruck in der Berechnung aus und macht im zweiten Durchgang daraus ne konstante in der Gleichung!
Werds direkt testen, besten Danke!

Besserwessi
07.02.2009, 13:54
Hinter so ein #define kann man ziehmlich vieles Stecken. Man muß nur ggf. ein paar extra klammern Vorsehen, vor allem wenn man mit Übergabeparamentern arbeitet.

Der Const Befehl in C ist eigentlich nur dafür geeigent wenn man Zeiger auf ein Konstante braucht. Normale Konstanten gehen besser mit define.