ValF("2.3") gibt manchmal "2.0" zurück

Für allgemeine Fragen zur Programmierung mit PureBasic.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

ValF("2.3") gibt manchmal "2.0" zurück

Beitrag von c4s »

Dies ist wohl der bisher seltsamste Fehler/Bug(?), den ich bisher gesehen habe. Unter bestimmten Umstanden scheint ValF() falsche Werte zurückzugeben. Ungefährer Beispielcode:

Code: Alles auswählen

Global Dim SArray.s(200)
SArray(10) = "2.3"

Global SGlobal.s
SGlobal = ""


Procedure Change()
   SGlobal = "Something"
EndProcedure

Procedure Test()
   Debug SArray(10)  ; Immer "2.3"
   Debug ValF(SArray(10))  ; Immer "2.0" anstatt "2.29...", wenn SGlobal geändert wird!
EndProcedure



;Change()
Test()
Blöderweise lässt sich mit dem Code der Fehler nicht reproduzieren, obwohl mein (langer) Quellcode ungefähr so aussieht. Alles was ich sagen kann ist, dass sich die Werte im Array nicht ändern und dass der Code nicht in einem Thread läuft. Außerdem ändert sich SGlobal immer vor Test() (weil es sich ja nicht in einem Thread befindet)...
I habe es mit PB 4.51 32bit, aktiviertem Unicode und Threadsafe kompiliert. Der Fehler entsteht bei Windows Vista (Dual Core). Auf meinem Entwicklungsrechner (Windows XP, Single Core) kann ich es jedoh nicht nachvollziehen. Weiter scheint der Fehler mit der vor einigen Monaten kompilierten Executable erst seit einigen Wochen (Windows-Update?!) zu kommen.

Was ich also fragen will ist: Unter welchen Umständen kann ValF() falsche Ergebnisse zurückgeben?


(Hinweis: Ich habe selbiges auch im englischen Forum nachgefragt http://www.purebasic.fr/english/viewtop ... 6&p=361356)
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: ValF("2.3") gibt manchmal "2.0" zurück

Beitrag von DarkDragon »

Es wäre halt wichtig einen richtigen Beispielcode zu haben. :(

Das ganze deutet auf den Fehler der Rekursion mit Fließkommazahlen oder auf Fehler im String-Handling hin.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: ValF("2.3") gibt manchmal "2.0" zurück

Beitrag von bobobo »

, statt . ?
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: ValF("2.3") gibt manchmal "2.0" zurück

Beitrag von c4s »

bobobo hat geschrieben:, statt . ?
Nein. Es ist immer mit Punkt.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: ValF("2.3") gibt manchmal "2.0" zurück

Beitrag von DarkDragon »

Hast du vllt. Unicode an und einen anderen Punkt o.ä. erwischt?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: ValF("2.3") gibt manchmal "2.0" zurück

Beitrag von DarkDragon »

Sorry für den Doppelpost, aber sonst übersieht man es vllt.

Wie sieht es aus wenn du atof verwendest (Geht leider nur unter 32bit :? )?

Code: Alles auswählen

Import ""
  atof.f(String.p-ascii)
EndImport

Debug atof("2.3")
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: ValF("2.3") gibt manchmal "2.0" zurück

Beitrag von c4s »

Ich hab besagtes ValF() in meinem Code durch atof() ersetzt, kompiliert (mit Unicode?!) und auf Vista getestet. Damit stürzt das Programm dann leider einfach ab...

Edit:
Der richtige Code sieht übrigends so aus:

Code: Alles auswählen

WriteFloat(FileNr, atof(SArray(123)))
Hab aber gerade FileNr ist keine initialisierte Datei bekommen...mal weiter testen.
Zuletzt geändert von c4s am 13.09.2011 16:55, insgesamt 1-mal geändert.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: ValF("2.3") gibt manchmal "2.0" zurück

Beitrag von DarkDragon »

Ääh dann probiers mit ImportC statt Import ;-) .
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: ValF("2.3") gibt manchmal "2.0" zurück

Beitrag von c4s »

Ok, mit ImportC stürzt es zwar nicht ab, führt aber zum selben Ergebnis.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: ValF("2.3") gibt manchmal "2.0" zurück

Beitrag von DarkDragon »

Und an WriteFloat liegts nicht? Also wenn du vor WriteFloat mal Debug ValF(SArray(123)) machst kommt auch 2.0 raus?

[EDIT]
Hab es grad selbst getestet .. liegt nicht daran.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten