Hallo! Wenn ich ein Float mit 0 initialisiere, egal mit welcher Zahl und es dann via sprintf(s,"a:%f\r\n"); uputs(s); ausgebe, dann sehe ich nur a:? Wo ist mein Fehler? Wenn ich eine ausgelagerte Funktion (vom timerinterrupt ausgeführt) aufrufe, die Zugriff auf ein Float-array haben soll(via pointer übergeben) dann bekomme ich sogar einen Reset!
die variable gebe ich über die uart aus an uputs() sollte dies erkennbar sein. Tausend Dank für die Info, dass ich sprintf erst floatingpoint-fähig machen muss. kann ich also davon ausgehen, dass meine berechnungen mit den floats funktioniert haben, dass wirklich nur die ausgabe via sprintf fehlerhaft war?
Dem umfangreichen Quelltext, den du hier gezeigt hast, nach zu schließen sind deine Berechnungen perfekt. Den perfekt berechneten Wert musst du aber auch noch an sprintf() übergeben.
float temp; temp = (float)(adc/1024*5); sprintf(s,"temp: %f\r\n",temp); uputs(s); erzeugt mir eine ausgabe von 0.000000 anstatt einen Wert anzuzeigen, ja, adc wird korrekt mit dem Wert angezeigt, wenn ich ihn ausgebe warum bek. ich nur den Wert 0.0000 ist doch flasch!
Timo P schrieb: > temp = (float)(adc/1024*5); ich denke mal das cast ist falsch test mal mit (float)adc/1024*5; woher kommt das *5?
10bit auflösung, 5VDC Betriebsspannung dann kommt noch ein Fatkor (analoge Sensorspannung linear)
Timo P schrieb: > float temp; > > > temp = (float)(adc/1024*5); http://www.mikrocontroller.net/articles/FAQ#Datentypen_in_Operationen > warum bek. ich nur den Wert 0.0000 ist doch flasch! Weil du das so programmiert hast :-) Programmiere es richtig, dann kommt auch "das richtige" raus.
Grundsätzlich kenne ich mich ja mit datentypen und deren umwandlung aus. Warum jedoch die Klammern einen fehler verursachen, ist mir nicht klar wenn ich schreibe a = 6/7/8/9; ist das genau das gleiche wie a = (6/7/8/9); also müsste: a = (float) 7/2; a = (float)(7/2); auch das gleiche sein..... Was habe ich falsch programmiert?
Versuche es doch bitte mit einem C-Buch. Stw. Operatoren und Reihenfolge der Auswertung. Und lesbare Sätze würden auch weniger nerven.
Timo P schrieb: > also müsste: > > a = (float) 7/2; > a = (float)(7/2); > > auch das gleiche sein Programmiersprache != Mathematik. Da gelten teilweise andere Gesetze. Hast du denn den von Karl Heinz angegebenen Artikel http://www.mikrocontroller.net/articles/FAQ#Datentypen_in_Operationen schon gelesen?
Du willst in deinem Buch einmal das Kapitel über "Operator Precedence" (Reihung von Operatoren) durcharbeiten. a = (float)(7/2); dividiere 7 durch 2. Das ergibt 3. Wandle das Ergebnis (3) um in einen float Weise die float 3.0 an a zu a = (float) 7/2; Nimm den Integer 7 Wandle ihn in einen float. Das ergibt 7.0f Dann dividieren diese 7.0f durch 2. Da 7.0f ein float ist, wird auch der Integer 2 zu einem float 2.0f umgewandelt. Die Division, die zur Ausführung kommt, lautet also: 7.0f / 2.0f Und das ergibt 3.5 Weise diese 3.5 an a zu. Sieht so aus, als ob du mit Datentypen und deren Umwandlung und vor allen Dingen wie Operationen ausgewählt werden bzw. wie sie binden, doch nicht so vertraut bist, wie du denkst. Das eigentlich schockierende an der Sache: Dieser Sachverhalt (und noch viele andere triviale Dinge, die jeden Tag hier immer wieder gefragt werden) finden sich in jedem noch so grindigen C-Buch. Wenn man also ein C-Buch durchgearbeitet hätte, würde sich diese Fragestellung erst gar nicht stellen, weil das Grundlagen sind. Die Übungen im entsprechenden Kapitel einmal durchgearbeitet und man vergisst das nie wieder.
Solange sich hier immer wieder ein Trottel findet, der jede Kleinigkeit jedem zehnmal erklärt, ist das doch bequemer. :-(
PS: KHB: bitte nicht persönlich nehmen, das steht jetzt eher zufällig unter einem Beitrag von dir.
Ja gelesen habe ich den angegebenen link. dort steht nichts von klammern, die die zu castenen Daten umgeben.... Wie ich meine Sätze lesbarer gestalten kann, weiß ich nicht. Ich denke, dass man mich hier sehrwohl verstehen kann. Karl heinz Buchegger schrieb: > dividiere 7 durch 2. Das ergibt 3. Ich dachte, dass im Code ein float value entsteht. Und, dass dieser ausschließlich zu einem int wird, wenn ich das Ergebnis dieser Berechnung einem int zuweise alla int a = 2/7 dann ist a = 3, das ist mir ja bewusst. aber float a = (2/7) dass dann a = 3 sein soll.....
so würde ich einfach schreiben float a = 7/(float)2 dann erhalte ich meinem float-wert...
Timo P schrieb: > aber float a = (2/7) dass dann a = 3 sein soll..... C-Buch! C-Buch! C-Buch! C-Buch! C-Buch! C-Buch! C-Buch! C-Buch! C-Buch! C-Buch! C-Buch! C-Buch! C-Buch! C-Buch! C-Buch! C-Buch! C-Buch! C-Buch!
Timo P schrieb: > Ich dachte, dass im Code ein float value entsteht. Und, dass dieser > ausschließlich zu einem int wird, wenn ich das Ergebnis dieser > Berechnung einem int zuweise alla int a = 2/7 dann ist a = 3, das ist > mir ja bewusst. das wäre ja schlimm, wenn jeden int berechnung intern als float laufen würde. Jeder Progamm würde exterm verlangsamt besonders bei CPU ohne float Unterstützung
Timo P schrieb: > Ja gelesen habe ich den angegebenen link. > Karl heinz Buchegger schrieb: >> dividiere 7 durch 2. Das ergibt 3. > > Ich dachte, dass im Code ein float value entsteht. Ich dachte, du hast den Link gelesen? Was ist denn 7 (vom Datentyp her) Was ist denn 3 (vom Datentyp her) Welche Art der Division kommt daher zum Zug? (Geh nochmal zum Link und lies den nächsten Abschnitt auch noch mit)
Timo P schrieb: > so würde ich einfach schreiben float a = 7/(float)2 > > dann erhalte ich meinem float-wert... Ich würde ganz einfach schreiben float a = 7.0 / 2.0; Wozu einen Integer erst umständlich auf einen float casten, wenn ich dieselbe Zahl auch gleich als Floating Point Zahl schreiben kann?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.