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!
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?
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.
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.....
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?