Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 07.12.2003, 00:33 Titel: Char aus Datei zu float |
|
|
Hi,
ich programmiere derzeit an einem Levelloader für meine Engine. Daher muss ich float Daten aus einer Textdatei lesen.
1) Ich brauche eine Funktion um aus char ein float wert zu machen, habe in der msdn nur funktionen für long, double und int gefunden.
2) Wie ist das eigentlich mit dem Postfix f bei Float-Werten(1.0f etc.)?
Was genau bewirken diese eigentlich? Muss ich die mit auslesen?
Bin für jede Hilfe dankbar. |
|
Nach oben |
|
|
Nahar Senior JLI'ler
Alter: 36 Anmeldedatum: 16.07.2003 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 07.12.2003, 07:26 Titel: |
|
|
zu 1: atof()-Funktion. Wandelt deinen char in eine flaot-Zahl um.
Für näheres schau mal unter atof im msdn |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 07.12.2003, 11:37 Titel: |
|
|
Es gibt 2 Möglichkeiten, einen Float in einer Datei zu speichern und später wieder auszulesen. (Nein, eigendlich gibt es noch wesentlich mehr Möglichkeiten)
Variante 1: Als String (char *) mittels atof() wieder einlesen und z.B. mittels fprintf() schreiben.
Variante 2: Die 4 Bytes, die den Float repräsentieren binär abspeichern. (nur, wenn die gesamte Datei eine Binärdatei ist) (read/write sind dafür deine Freunde...)
Das f steht für "Float oder Floatkonstante" und sagt dem Compiler, dass es sich bei dieser Variable um eine floatvariable handelt und nicht um eine Double. atof() Verwendet wiese Information gar nicht, da der Rückgabewert in jedem Fall als Float gespeichert wird. Diese Informationen sind eher für den Compiler gedacht.
f ist im übrigen nicht der einzige verwendete Post- oder Prefix. So kann man Textkonstanten z.B. Explizit als UnicodeTextKonstanten definieren, indem man vor dem einleitendem Anführungszeichen ein L schreibt, z.B.
wprintf(L"AusgabeText");
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 07.12.2003, 12:55 Titel: |
|
|
Mhh, die atof() Funktion habe ich auch schon gefunden, aber wenn ich es richtig sehe bekomme ich damit nur double Werte!? Ist es denn ohne Probleme Möglich von double zu float zu casten? Bin im Moment leider am anderen PC, wo kein VC++ installiert ist.
Aber thnx. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 07.12.2003, 12:58 Titel: |
|
|
Das einzige Problem ist nur der sehr geringe Geschwindigkeitsverlust durch das casten. Sonst funktioniert die Funktion ohne Probleme. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 07.12.2003, 13:12 Titel: |
|
|
Gut, danke. Geschwindigkeitsverlust ist zu verkraften, weil es wie gesagt zum laden von Levels benutzt wird, die ja nicht während des Spielens geladen werden und die fps runter ziehen. |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 07.12.2003, 13:27 Titel: |
|
|
Zumal es beim casten von double zu float keinen verlust gibt - von int zu fload/double oder von double zu int gibt es ganz geringe verluste, weil die Bitrepräsentation anders ist... _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 07.12.2003, 13:37 Titel: |
|
|
So gering sind die Verluste nun auch wieder nicht. Da nicht gerundet wird. Was manchmal notwendig ist.
3.5 wird nicht zu 4 sodnern zu 3
Das wird einfach nur getruncated. Was ziemlich nervt. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Nahar Senior JLI'ler
Alter: 36 Anmeldedatum: 16.07.2003 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 07.12.2003, 13:54 Titel: |
|
|
Ja, aber float ist ja auch eine Gleitkomma-Variable, und damit ist beim Auslesen kein Problem da. Er speichert als 1.250, liest aus als 1.2500000, und rundet das dann wieder auf 1.250. Wo ist also das Problem? (Ich hab da nicht die richtige Menge an nullen verwendet, ich weiß) |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 07.12.2003, 16:09 Titel: |
|
|
Hehe, währ toll wenn er wirklich runden würde ohne Geschwindigkeitsverlust ist leider nicht so. Er schneidet die Stellen einfach weg. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Nahar Senior JLI'ler
Alter: 36 Anmeldedatum: 16.07.2003 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 07.12.2003, 16:25 Titel: |
|
|
Die Geschwindikkeit ist ein anderes Thema, aber was ich sagen wollte war das das abschneiden völig egal ist |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 07.12.2003, 16:30 Titel: |
|
|
Sobald du aber möglichst genaue Werte benutzen möchtest wirst du auch merken das das doch ziemlich blöd ist. Ich habe die Probleme schon ziemlich oft gehabt. Hängt aber davon ab wie du mit den Werten arbeitest.
In MiracleBoy´s Fall hast du aber recht und das ganze ist nicht sonderlich schwerwiegend. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Sören JLI Master Trainee
Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 07.12.2003, 16:46 Titel: |
|
|
Zumal ich wahrscheinlich sowieso nur Zahlen mit einer Nachkomma Stelle verwenden werde(1.0 = 1m). |
|
Nach oben |
|
|
Nahar Senior JLI'ler
Alter: 36 Anmeldedatum: 16.07.2003 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 07.12.2003, 19:55 Titel: |
|
|
erstens das, und zweitens wird er wohl kaum einen Wert als float haben wollen den er nicht als float abgespecihert hat -> der wert kann gar nicht im double-Berecih sein |
|
Nach oben |
|
|
Manuel87 Mini JLI'ler
Anmeldedatum: 28.07.2003 Beiträge: 33
Medaillen: Keine
|
Verfasst am: 09.12.2003, 16:06 Titel: |
|
|
Soweit ich weiß, wird ein float nicht in form von 1.250 abgespeichert, sondern in einem Komplizierteren Format (Ich glaub mit exponent!) Das hab ich gmerkt wie ich irgnedeine Zahl eingegeben hab und der rechner mit einer leicht unterschiedlichen zahl weitergerechnet hat: (Glaub ich hab 4.02 eingegeben und er hat mit 4.0199768 oder so weitergerechnet! Ich werd das aber nochmal nachchecken! Insofern hast du sogar von 1.205 cast from double to float geringe (unbedeutende) Verluste!!!
Aber ich werd mir das nochmal anschauen! |
|
Nach oben |
|
|
|