violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 2010
-
7 mars 2007 à 20:31
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 2016
-
18 nov. 2007 à 22:38
Violent Ken
Bonjour, j'ai un problème à priori trivial à résoudre, mais je ne vois pas trop la solution...
Voici le code en question :
Option Explicit
Private Sub Form_Load()
Dim i As Currency
For i = 0 To 400000 Step 2000
Stop
Next i
End Sub ,
----
By Renfield
Je lance, rien ne se passe...
Je change le 400000 en 40000 ou en 4000000 et çà marche...
Le problème se situe en fait au niveau du type Currency de i (car pas de problème en long).
Sans doutes un bug banal, quelqu'un aurait-il la solution ??
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 7 mars 2007 à 23:53
Salut
Juste en passant car je n'ai pas eu le courage de lire toute votre prose.
Il se peut que le mélange de type de variable génère ce problème.
Dim i As Currency
For i = 0 To 200000 Step 20000@
Le symbole @ signale une constante de type Currency, comme i
A essayer, mais, entre nous, pourquoi se compliquer à utiliser un Currency alors qu'un Log ferait très bien l'affaire
dim nombre as currency
dim j as integer,k as integer,l as integer
for j = 0 to 1000
doevents
for k = 0 to 1000
doevents
for l = 0 to 1000
doevents
nombre = ccur(j * 10 ^6)+ ccur(l * 10 ^ 3) + ccur(l)
list1.additem nombre
next l
next k
next j
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 8 mars 2007 à 00:03
Violent Ken
Galain ==> Effectivement çà doit fonctionner, mais au prix d'une conversion à chaque itération. Et comme c'est déjà relativement lent à parcourir les 200Go d'un disque dur à la recherche de strings, je cherche à diminuer au maximum le nombre d'instructions dans la boucle For.
jack ==> je parcours en fait tous les bytes d'un disque dur pour effectuer une recherche dedans. Le type Long est "trop court".
Mais bon, après je peux adapter ma source et lire plusieurs zones de bytes dans la même boucle (donc par exemple 2Ko=4 ou 8 secteurs par boucle, ce qui réduit à 10^6 le nombre d'itérations). En fait, je lis normalement un secteur par boucle (512 octets sur mes disques), ce qui fait que un Long suffit dans mon cas (avec 200Go et 512 octets/secteur), mais avec un DD de 600Go et des secteurs de 256 octets, çà ne marchera plus ==> Currency nécessaire (ou DOuble en fait)
@+
Vous n’avez pas trouvé la réponse que vous recherchez ?
Quand tu dis que tu recherches une chaine dans ton disque dur c'est une chaine de caractères (string) ou une suite d'octets que tu rentres en paramètre.
La solution me parait assez simple
Suppose une chaine de caractères de 128 octets octets
tu fais une boucle Do Loop avec un Doevents
Dans la boucle tu charges le secteur 0 et 1 soit 2 secteurs
Tu recherches ta chaine et tu en sort la réponse oui ou non
tu gardes le secteur 1 et tu charges le secteur 2
Tu recherches ta chaine et tu en sort la réponse oui ou non
tu gardes le secteur 2 et tu charges le secteur 3
Pourquoi charger 2 secteurs : la chaîne peut se trouver à cheval sur les 2 secteurs
Si la chaine fait 600 octets on procède pareil
Si elle fait 1200 octets soit 2 secteurs et des poussières on charge 3 secteurs ( la chaine peut se trouver à cheval sur les 3 secteurs) on teste et ensuite on enléve le premier secteur et on charge le suivant ce qui donne 0,1,2 puis 1,2,3 puis 2,3,4,puis 3,4,5 etc.....
J'ai oublié la sortie de la boucle
Elle se fait lorsque tu charges le dernier secteur ou par une action de ta part sur un bouton de fin de recherche ( une variable booléenne à tester dans la boucle)
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 8 mars 2007 à 01:00
Bonsoir,
Amusant... en cherchant une possibilité de contrer ce problème, j'en trouve mult formes. Sur l'exemple de la boucle de Galain, celui est pas mal non plus :
Dim i As Currency
For i = 0 To 200000
Debug.Print i
i = i + 20000 'remplace le Step 20000
Next
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 8 mars 2007 à 01:18
le Decimal n'a pas ce problème
il s'agit bien d'un problème avec le Currency en virgule fixe où Vb essaye d'optimiser le code en divisant les données par 10000 mais se plante dans la conversion, enfin j'en sais rien parce que le dernier exemple me laisse pantois,
le test se ferait aussi au cours de la boucle et pas seulement au début ???
conclusion: il vaut mieux laisser tomber le Currency dans les boucles For
le Double est dailleurs plus rapide que Currency (voir le tableau précédent)
le Decimal est loin derrière.
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 18 nov. 2007 à 22:38
Bonsoir,
JE reviens sur ce problème même s'il n'est plus d'actualité, avec un petit complément d'information. La boucle proposée ne fonctionne effectivement pas sous VBE, mais uniquement sous VBE. En effet, après compilation tout revient en ordre, d'après mes tests...