u_SD schrieb:> Fällt jemanden auf Anhieb auf, wo hier der Wurm drinsteckt?
Der Fehler liegt sehr wahrscheinlich in einem anderen Teil des
Programms. Ich vermute einen amoklaufenden Pointer...
Was macht fmod()?
Sonst das übliche: welcher Controller? Welche Toolchain?
Evtl. fehlen dir die kompletten float-Libs, und der Compiler kann es im
ersten Fall schon zur Übersetzungszeit retten, weil es eine Konstante
ist.
Evtl. math-Lib dazu linken (-lm) und/oder richtige Libs angeben.
es ist ein PIC23 Controller,
fmod macht hoffentlich die "normale" Modulu Operation, habe dazu nur das
folgende gefunden:
1
math.h:
2
#define __MPROTOL(x) x ## f
3
#define fmod(p1,p2) __MPROTOL(fmod)(p1,p2)
nath.h sowie FenericTypeDefs.h sind natürlich inkludiert.
Der Fehler erscheint auch eher unregelmäßig, d.h. die Ausgabe auf dem
Display wechselt ständig, d.h. mal ist die Ausgabe von 16*2 30 und mal
32.
Kurios
Ein Beispiel für double->Display ist in dem Programm 'f_mess.c' zu
finden.
Beitrag "reziproker Frequenzzähler mit STM32F4Discovery"
Die Funktion 'zeige_x()' ist zwar etwas ausführlicher, als das, was Du
brauchst, kann aber auf das Notwendige gekürzt werden. Auch wird das
Ergebnis in einen string gepackt, aber ein Beispiel für eine LCD-Ausgabe
findet sich weiter unten.
Ich nehme an, daß 'fmod()' Modulo von float liefert; gibt es vielleicht
eine Funktion 'dmod()'?
danke für den ganzen Input.
Kann es nicht sein, dass ich noch ein Typcast etc. einfügen muss. Ich
kenne mich leider nicht genau mit Compilern aus und was dieser intern
macht:
ein
1
wert=(double)zaehler*2;
hat leider auch keine Beseerung gebracht.
Ich habe ja double = unsigned char * 2;
Wie genau verarbeitet der Compiler das?
Ich habe das Gefühl´, dass irgendwo hier der Hund begraben sein muss.
u_SD schrieb:> Wie genau verarbeitet der Compiler das?
bei
1
unsignedcharzaehler;
2
doublewert;
3
wert=zaehler*2;
wird zaehler in ein int gewandelt (2 ist schon ein int) und dann als
Integermultiplikation durchgeführt.
Das Ergebnis (ist auch ein int) wird dann in ein double gewandelt und
wert zugewiesen.
bei
1
unsignedcharzaehler;
2
doublewert;
3
wert=(double)zaehler*2;
werden zaehler und 2 in double gewandelt und dann als
double-Multiplikation berechnet. Das Ergebnis wird wert zugewiesen.
Hierzun hat Herr Brunegg in einem vorherigen Thread mal das folgende
geschrieben:
> Die Zahl mit 10 multiplizeren, die Zerlegung auf die Einerstelle> durchführen :-)>> Aber Achtung: gegebenenfalls muss bzw. sollte man vorher noch runden.> Denn 0.1 kann beispielsweise im Rechner nicht gespeichert werden,> sondern liegt zb als 0.0999999 vor. printf berücksichtigt das und rundet> entsprechend, so dass die Ausgabe wieder 0.1 lautet, obwohl die im> Rechner so gar nicht vor liegen.
Was genau hat es damit auf sich?
Wo genau muss ich runden und mit welchen Befehl wäre dies möglich?
Vielen Dank auch an Dirk. Die Ausführungen haben mir sehr geholfen!