Float Wert g?
Übersicht

![]() |
Der EisvogelBetreff: Float Wert g? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo
Floats können ja ungültig sein, das äußert sich meines Wissens nach so, dass NaN ausgegeben wird. Jetzt wird mir merkwürdigerweise "g" ausgegeben. Also wenn ich den Wert eines Floats mittels Print ausgebe. Vorher wurde eine Division zweier Ganzzahlen ausgeführt. Weiß jemand was dieses g bedeutet und warum es da ist? Das ist ziemlich doof, denn ich brauche die Werte und kein g. Code kann ich lieder nicht zeigen, da ich den Fehler nicht in kleinem Code reproduzieren kann und er sporadisch auftaucht. Der gesamte Code ist zu lang. MfG Der Eisvogel |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Lass dir doch einfach mal die beiden Werte vor der Division ausgeben. Vielleicht hast du ja Glück und kannst "g" mal wieder provozieren. | ||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Werte sind vor der Division ganz beliebig im Integer-Bereich. Wobei der Dividend immer kleiner ist als der Divisor. Wenn ich die Werte normal dividiere, dann funktioniert alles. Aber in meinem Programm nicht. Ich seh einfach keinen Zusammenhang. Ich kann das Problem auch nicht issolieren, da immer wenn ich denke ich habs, das Problem doch wieder auftaucht, ohne dass ich was am Code geändert habe.
Was ich vielleicht noch sagen sollte ist, dass ich sehr viel mit der WinAPI bei dem Projekt arbeite, das hat ja schon so einige Probleme bei mir verursacht, aber diesmal kommt mir das noch komischer vor. Ob es was damit zu tun hat kann ich nicht sagen, denn die ganzen API-Funktionen aus dem Programm rauszuholen würde mich Tage kosten. |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es gibt nur NaN oder Infinity - alles andere ist kein Float. Entweder davor oder danach gibst du noch andere Daten aus oder castest nicht richtig. | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich bin mir zu 100% sicher, dass ich den Float Wert ausgebe, inzwischen habe ich das g auch an anderer Stelle entdeckt. | ||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was sagt Hex/Bin? | ||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sicher, dass das g keine 9 ist? | ||
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja ich bin mir sicher, denn die 9 hat oben rechts keinen Haken und ist nicht so tief gestellt. Wenn ich ne 9 und ein g mitausgebe, dann sehe ich zwei g's.
Sowohl Hex, als auch Bin liefern 0 zurück. Meine Logs verzeichnen folgendes: Zitat: [22:48:57] g%, 00000000, 00000000000000000000000000000000
Zuerst die Ausgabe in Prozent, dann Hex und dann Bin. Der Code der Ausgabe sieht so aus: BlitzMax: [AUSKLAPPEN] Global xp:Float Es macht einfach absolut keinen Sinn. |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde eine DebugLog-Offensive starten:
BlitzMax: [AUSKLAPPEN] DebugLog "xp: "+xp+", "+Hex(xp)+", "+Bin(xp) Kann es sein, dass du die Retro-Left-Funktion irgendwie umgehst und einen eigenen Wert aufrufst? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie ich schrieb - es ist kein Float.
Du arbeitest mit Strings und vermutlich ist da irgendwo ein Chr ![]() |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, ich frag mich jetzt wie es keine Float sein kann, wenn ich es ausdrücklich (Global xp:Float) so deklariert habe.
Ich hab mal die DebugLog-Offensive von ZEVS ausgeführt und habe gleich davor nochmals die Variable Lokal deklariert und einen Wert zugewiesen ohne Berechnung: BlitzMax: [AUSKLAPPEN] Local xp:Float = 0.5 Als Ausgabe bekomme ich folgendes: Zitat: [13:34:10] xp: g, 00000000, 00000000000000000000000000000000
[13:34:10] percent: g [13:34:10] as String: g [13:34:10] with Slice: g [13:34:10] with Left: g [13:34:10] part is g Die Funktion Retro-Left habe ich nicht überschrieben, es ist die originale. Ein direkte aufruf mittels brl.retro.Left hat auch keine Änderung. Dann bevor einer fragt, DebugLog wurde durch eine eigene Funktion überschrieben, die die Zeit mitausgibt. Aber das ist auch nicht der Bösewicht, da auch hier ein direkter Aufruf keine Änderung zeigt. Woher kommt dieses g? Ich meine das ist ja dann so, als ob ich einer Float-Wert ein g zuweise, obwohl ich 0,5 zuweise. Es ist auch hier egal was für einen Wert ich nehme, es bleibt immer ein g. Kann das ein Bug im Kompiler sein? |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, das Problem liegt weder bei Float noch beim Compiler - jedenfalls nicht Grundlegend, denn dann würde man nichts Vernünftiges mit BMax hin bekommen.
Du benutzt irgendwas, was den Compiler verwirrt. Der Code funktioniert hier und sicherlich auch bei dir, wenn du das WinAPI zeug raus lässt (wenn nicht: BlitzMax neu installieren). |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mh, das ist schlecht. Ich benutze sehr viel von der WinAPI, andernfalls hätte das Programm keinen Sinn. Den gesamten Code zu posten halte ich für unsinnig, da er mehrere tausend Zeilen lang ist. Einzelne Teile sind auch schwierig, da ich nicht weiß welche Funktion den Fehler hervorrufen könnte. Komisch ist ja auch, dass in der Nähe der Ausgabe, also da wo ich das DebugLog platziert habe, keinerlei Funktionen der WinAPI aufgerufen werden. Das gesamte Modul, in welchem es ist, (ca. 200 Zeilen) hat keine API aufrufe.
Was könnte ich als nächstes tun, um das Problem zu finden, außer eine API-Funktion nach der anderen rauszunehmen, denn das sind verdammt viele? Ich benutze Funktion von folgenden Bibliotheken:
Dwmapi.dll ist kritisch wenn man das Programm auf XP ausführt, aber ich programmieren ja auf Win7 64 Bit. Bei der ntdll.dll könnte ich mir dann höchstens noch vorstellen, dass sie Probleme machen könnte. Da die Funktionen die ich daraus verwende sich begrenzt halten, habe ich die schonmal alle rausgenommen gehabt, aber das Problem bestand weiterhin. Jetzt aber alle andere Funktionen rausnehmen kann ewig dauern. Fraglich auch, ob ich das Programm dann überhaupt noch zum Laufen bekommen würde, weil dann absolut nichts mehr geht. Was ich vielleicht noch sagen sollte ist, dass alle Funktionen statisch gelinkt sind mittels Library-Files (*.a oder *.lib). |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich finde es verdächtig, dass ausgerechnet g rauskommt und Blitz' Floatausgabe ja der von "%g" bei Cs printf (und Konsorten) entspricht. Eigentlich kann ich mir aber keine sinnvolle Fehlerkette vorstellen, die zu deinem Problem führen könnte. Andererseits habe ich auch keine Ahnung, ob BlitzMax beim Kompilieren y+"bla"+x+"!?!" irgendwie in Stream-Späße umwandelt, ob es da noch Spezialhacks für DebugLog gibt und wie die mit deinem Überschreiben der Funktion (und deiner speziellen Implementierung) zusammenspielen. | ||
MrKeks.net |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Weil du gesagt hast, es würde sehr lange dauern, den API-Spaß zu entfernen:
- Assemblercode durchschauen oder zumindest xp - An eine C-Funktion à la Code: [AUSKLAPPEN] void floatoutput(float x){
printf("%f",x); } übergeben und schauen, was rauskommt. Dann sähe man vielleicht, womit das Problem zusammenhängt (manipulierte[r] Stack/Zeiger o. Ä.). |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn ich die Variable an die floatoutput Funktion übergebe, dann bekomme ich korrekt 0.500000 ausgegeben. Aber schlauer werde ich dadurch nicht. Wenn was mit dem Stack-Zeiger nicht in Ordnung wäre, dann dürfte das doch nicht funktionieren, oder? | ||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
kog |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielleicht wurde durch eine API funktion der Stackzeiger überschrieben, bzw. in einen anderen Speicherbereich hinein. | ||
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aber dann würde doch mit der C-Funktion nicht der richtige Wert ausgegeben, oder? | ||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Genau. Dann liegt es wahrscheinlich nicht an manipuliertem Stack. D.h. die Verfälschung passiert vielleicht schon davor, vielleicht bei der Umwandlung Float->String. Das ist aber alles Spekulation und ich denke, solange du uns keinen Code zeigst (vielleicht kann auch schon der Assemblercode die Lösung liefern), können wir nichts anderes tun als spekulieren. | ||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group