Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Strange and dangerous behaviour
Message
From
19/10/2004 09:38:13
 
 
To
19/10/2004 09:29:32
General information
Forum:
Visual FoxPro
Category:
Other
Miscellaneous
Thread ID:
00952515
Message ID:
00952585
Views:
6
No Fabio non me l'hai rovinaa ma,..dicimo che mi hai gettato nel panico !:-)
Grazie dei sugerimenti e delle delucidazioni
a presto
Alessio

>Alessio, ti scrivo in italiano perchè ho poco tempo.
>
>Su UT vi sono decine di membri che pensano di conoscere VFP solo perchè lo usano da 10 o 20 anni.
>
>molti di questi ti diranno che io vedo solo bugs, ma è un fatto:
>molti bugs sistemati in VFP8SP1 e VFP9 sono il risultato di un mio duro lavoro personale per controllare questa schifezza.
>Sfortunatamente il mercato non offre molto, e se uno vuole fare qualcosa di esatto, o usa C++ oppure si spara in bocca.
>VFP ha una porta sul C, e se non passo a NET 2005 probabilmente lo cannibalizzo dentro a un processo C.
>
>Comunque per quanto riguarda i calcoli, la storia è molto lunga, ma il succo è questo:
>se vuoi fare delle somme esatte devi usare i currency, non hai altra via perchè ogni altro numero è trattato come un double.
>Il risultato è che se usi MSSQL e fai delle somme su MSSQL con dei decimal, oppure scarichi i decimal dentro a dei
>numeric di VFP e rifai le somme in VFP, puoi ottenere risultati diversi.
>Molti ti diranno di usare ROUND(), ma questa funzione non è sempre corretta ( la stessa MS lo ha ammesso ).
>Lo stesso INT() in VFP8 ha un bug, corretto in VFP9, ma non è detto che non ve ne siano altri.
>Ma, per quanti sforzi possano fare, è impossibile garantire la somma esatta usando i double.
>
>Puoi trovare qualcosa in Message #871747
>Dedicandoci del tempo, penso si possa trovare un esempio molto più semplice
>
>CLEAR
>s= 0.000000
>v= 0.100000
>FOR I=1 TO 1000000
>	s = m.s + m.v
>NEXT
>? m.s, ROUND(m.s,6)
>s= 0.000000
>v= 0.100000
>FOR I=1 TO 1000000
>	s = ROUND(m.s + m.v,6)
>NEXT
>? m.s, ROUND(m.s,6)
>s= 0.000000
>v= 0.100000
>FOR I=1 TO 1000000
>	s = ROUND(m.s,6) + ROUND(m.v,6)
>NEXT
>? m.s, ROUND(m.s,6)
>
>Quindi dovresti tappezzare il tuo programma di Round(), ma sono certo che esiste un controesempio
>dove round non funzione.
>Per rinforzare la cosa:
>
>
>? round(3.9 * 55.15,2) - round(3.900000000 * 55.15,2)
>
>Qualcuno ti dirà che il mondo non è perfetto, certamente VFP riporta ( come output ! ) dei risultati corretti nel 99.999%
>dei casi, e ovviamente, finchè fai 3 somme e due moltiplicazioni con numeri banali il tutto è ok.
>
>Ma, vai da un cliente, magari una banca, e quando gli proponi il pacch(o)etto gli dici:
>"il programma qualche rara volta ti darà dei risultati leggermente sbagliati,
>ma devi essere realista, il mondo non è perfetto!"
>( a parte che a me sembra che il mondo sia fatto sufficientemente bene, e che non vi sono errori sistematici e quelli casuali
>sono governati dalla costante di Planck, un numero piuttosto piccolo)
>
>Io uso MS SQL, e questo non è perfetto ma certamente ha un livello professionale, e finora sui calcoli non ha mai ceduto.
>Tutti i calcoli li faccio fare a MSSQL, VFP lo uso solo come interfaccia.
>
>Spero di non averti rovinato la giornata.
>Ciao.
>
>>Fabio told me that VCX and SCX object are just vfp tables that can be edited with a simple browse command, he also told me that you cannot trust abiut VFP calculation and i asked him to tell me more about this "bug"
>>
>>E ora te speri di cavartela così ?
>>più che una pulce mi hai piazzato un cammello nell'orecchio.... che è 'sta storia dei calcoli ?
>>Comunque sapevo che le classi sono nient'altro che tabelle, ma conitnuo a non capire, ammesso che esista, il metodo per ovviare al piccolo inconveniente di cui all'oggetto :-)
>>Comunque una cosa l'ho capita... è un gran bel casino !
>>Alla luce di tutto ciò...secondo te conviene continuare a programmare in VFP o conviene passare ad un altro linguaggio (ammesso che ne esista uno affidabile) ?
>>Tu cosa usi ? e soprattutto dormi sonno tranquilli ? :-)
>>
>>
>>
>>>Nonchalance, mi fai sorridere, se questo fosse il peggio, sarei ben felice.
>>>( lo sai che non puoi fidarti di come fa i calcoli ?)
>>>
>>>Comunque, soprassediamo.
>>>
>>>VCX e SCX sono tabelle VFP. Se le apri con USE puoi facilmente vederlo.
>>>Rapidamente,
>>>Apri una classe, chiudi, sul command ti resta MODIFI .... OF ...,
>>>riprendi la riga e cambia MODIFY ... OF con USE, enter.
>>>BROWSE.
>>>
>>>Non è semplice ed intuitivo, ma cerco di spiegartelo:
>>>VFP mette il codice ( p-code ) compilato in un campo memo dei VCX/SCX di nome ObjCode ( è il codice degli fxp),
>>>quando tu apri una Classe/Form, VFP non analizza il codice ASCII ( come qualunque essere pensante farebbe ),
>>>no!, lui prende il p-code, lo analizza, estrae i puntatori al codice sorgente che ha generato il p-code
>>>e usa questi per estrarre le procedure dal campo methods ( dove c'è il programma ASCII ).
>>>
>>>Quindi, se per qualche motivo le due cose non vanno d'accordo,
>>>oppure ( come penso ) la cosa è inutilmente complessa e VFP ha un bug che si può presentare ARANDOM,
>>>i puntatori vanno per conto loro e ti estraggono o routine diverse ( come ti è capitato )
>>>oppure ( come è capitato a me ) pezzi sparsi di routine diverse.
>>>
>>>Un vero gusto!
>>>
>>>Ciao.
>>>Fabio
>>>>Cavolo.... e me lo dici con questa nonchalance o..come diavolo si scrive ?
>>>>'to fatto mi ha fatto usire pazzo per mesi e mesi... anni ormai ma come ho scritto interessava solo gli eventi close e open del dataenvironment, così mi risultava piuttosto semplice mterci una "pezza manuale".
>>>>Cosa intendo per ObjCode... spiegami melio ch non ho capito bne cosa intendi dire.
>>>>Grazie comunque
>>>>Alessio
>>>>
>>>>
>>>>What do you mean with the method code of ObjCode ?
>>>>Thank you anyway
>>>>Alessio
>>>>
>>>>
>>>>>>Sometimes happens, and it happened since the VFP6 version that the code i put inside a method migrate in another one.
>>>>>>Till today it happened only in the Dataenvironment. After some ununderstandable errors i go to see the code and what I wrote inside the open table event went inside the close table.. till today it was a little bit nasty but it was limited o these two events.
>>>>>>Today the same thing happened in two method of a textbox object.
>>>>>>Anyone knows anything about this ? how can i get rid of this problem ?
>>>>>>Thank you
>>>>>>Alessio
>>>>>
>>>>>Confermo, sia su VCX che SCX.
>>>>>Quello che ho osservato è che il codice si scambia a coppie due metodi.
>>>>>
>>>>>Il problema nasce dal fatto che VFP usa sia il codice del campo Methods che il codice ObjCode
>>>>>( se cambi il codice di Methods e ricompili senza prima cancellare ObjCode, non ottieni alcun effetto ).
>>>>>Penso che ci sia un bug nei codice che correla Methods con ObjCode ( objCode è una sequenza di link a 16 bits )
>>>>>Impossibile da riprodurre.
>>>>>
>>>>>I confirm, is on VCX that SCX.
>>>>>What I have observed is that the code exchanges to braces two methods.
>>>>>
>>>>>I think, that the problem is born from the fact that VFP uses is the code of the Methods field that the ObjCode code
>>>>>(if changes the code of Methods and compile without before to cancel ObjCode, does not obtain some effect).
>>>>>Probably there is a bug in the code that correlates Methods with ObjCode (objCode is one sequence of link to 16 bits)
>>>>>Impossible to reproduce.
Previous
Reply
Map
View

Click here to load this message in the networking platform