Forum: Mikrocontroller und Digitale Elektronik c Problem bei Präprozessor Berechnung


von Frager (Gast)


Lesenswert?

Hallo,

kann mir jmd sagen weshalb ich bei
1
#define ALARM_FREQ    2000ul
2
#define ALARM_PINTOGG_PERIOD  (1e6/2)/ALARM_FREQ    // 250  
3
#define ALARM_PINTOGG_FRAC  1000/ALARM_PINTOGG_PERIOD  // 4

für ALARM_PINTOGG_FRAC den Wert 1e-6 erhalte? Da sollte eig 4 rauskommen 
und wenn ich für ALARM_PINTOGG_PERIOD direkt 250 schreibe anstatt der 
Formel klappt das auch. :/

Beitrag #5624415 wurde vom Autor gelöscht.
von Pit S. (pitschu)


Lesenswert?

Mit zusätzlichen Klammern in der ALARM_PINTOGG_PERIOD Formel klappt das 
auch.

von Frager (Gast)


Lesenswert?

Oh vielen Dank! Jetzt hab ich 2 Std. davor gesessen. Warum will er da 
unbedingt Klammern?

von Stefan F. (Gast)


Lesenswert?

Frager schrieb:
> kann mir jmd sagen weshalb ich bei
>
>
1
> #define ALARM_FREQ    2000ul
2
> #define ALARM_PINTOGG_PERIOD  (1e6/2)/ALARM_FREQ    // 250
3
> #define ALARM_PINTOGG_FRAC  1000/ALARM_PINTOGG_PERIOD  // 4
4
>
>
> für ALARM_PINTOGG_FRAC den Wert 1e-6 erhalte?
> Warum will er da unbedingt Klammern?

Der Präprozessor rechnet nicht, sondern er ersetzt Texte.

An der Stelle, wo in deinem Quelltext ALARM_PINTOGG_FRAC steht, wird 
stattdessen der folgende Text eingesetzt:

1000/(1e6/2)/2000ul

von g457 (Gast)


Lesenswert?

> Warum will er da unbedingt Klammern?

Weil der Präprozessor (hier) nicht rechnet sonder nur textersetzt, und 
da kommt bei Dir
1
1000/(1e6/2)/2000ul
 raus. Und das wiedrum ist keinesfalls 4.

von Frager (Gast)


Lesenswert?

Ach okay, das ergibt Sinn. Vielen Dank!

von foobar (Gast)


Lesenswert?

Dir ist bewußt, dass deine ALARM_PINTOGG-defines doubles liefern? Die 
1e6 ist ne Fließkommazahl und das vererbt sich.

von Carl D. (jcw2)


Lesenswert?

foobar schrieb:
> Dir ist bewußt, dass deine ALARM_PINTOGG-defines doubles liefern? Die
> 1e6 ist ne Fließkommazahl und das vererbt sich.

Der Compiler kann int Variablen auch mit float (richtiger double) 
Konstanten initialisieren. Der kann das umrechnen.

: Bearbeitet durch User
von foobar (Gast)


Lesenswert?

>> Dir ist bewußt, dass deine ALARM_PINTOGG-defines doubles liefern? Die
>> 1e6 ist ne Fließkommazahl und das vererbt sich.
>
> Der Compiler kann int Variablen auch mit float (richtiger double)
> Konstanten initialisieren. Der kann das umrechnen.

Ja, es gibt Stellen, wo der Compiler schlampigen Code 
tolleriert/korrigiert, an anderen aber nicht. Die Frage war, ob Frager 
wirklich Fließkommaergebnisse haben wollte - meinem Eindruck nach nicht.

von Joachim B. (jar)


Lesenswert?

Stefanus F. schrieb:
> (1e6/2)

sollte das nicht besser (1e6/2ul) heissen?

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.