Newbie schrieb:
> Hi,
>
> ich bekomme für die erste Zeile eine Fehlermeldung:
> initializer element is not constant
>
> ?
Na, ja. Was ist dein ein 'Initializer'?
Das womit eine Variable initialisiert wird.
Und der muss an bestimmten Stellen (zb globale Variablen) konstant sein.
Bei dir ist er das nicht.
Mach halt eine normale Zuweisung draus, und dann passt es wieder
anstelle
1 | int32_t nSavedPWM_32 = (int32_t)nSavedPWM << 16;
|
dann eben
1 | int32_t nSavedPWM_32;
|
2 |
|
3 |
|
4 | int main()
|
5 | {
|
6 | nSavedPWM = ....;
|
7 | nSavedPWM_32 = (int32_t)nSavedPWM << 16;
|
8 | }
|
oder wie es dann eben bei dir passt.
Im übrigen ist es doch einfach. Was tust du denn, wenn du in Euros
rechnen sollst, aber keine Kommazahlen haben darfst. Du sollstz 2.80
Euro + 3.40 Euro rechnen, ohne Kommazahlen. Dann rechnest du eben in
Cent! 280 Cent + 340 Cent. Und schon kannst du das rechnen, ohne
Kommazahlen benutzen zu müssen.
So auch hier
Wenn du 133/633 rechnen musst, dir aber nur das Ganzzahlige Ergebnis zu
wenig ist (weil 0), dann rechnest du eben 1330/633, das macht 2. Du
merkst dir einfach, dass die 2 (oder allgemeiner: die Einer deines
Ergebnisses) eigentlich schon die erste Kommastelle sind. Und wenn die 1
Kommastelle nicht reicht, dann rechnest du eben 13300/633, das mach 21
und du merkst dir, dass die Zehner und die Einer die ersten beiden
Kommastellen sind. Wenn du ans OCR zuweist, musst du die beiden Stellen
loswerden, das sollte aber einfach sein: dividieren durch 100 reicht.
Addierst du also
21
21
21
21
21
21
----
126
dann hast du laut deiner Systematik eigentlich 5 * 0.21 = 1.26
errechnet. Bei dir dann eben 126 / 100 -> 1, die ins OCR kommt. Und
schon hast du mit 2 Nachkommastellen gerechnet ohne Kommazahlen benutzen
zu müssen.
In einem Computerprogramm wird man natürlich sinnvollerweise nicht
Vielfache von 10 nehmen (so wie bei den Cent) sondern Vielfache von 2,
weil man die dann wieder leicht loswerden kann (anstelle von Dividieren
verschiebt man einfach die Bits), aber das Prinzip ist völlig identisch.