Boucle For...Next...Step qui ne marche pas

Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
-
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 ??

Merci d'avance, @+

34 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
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
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
(*) Long, pas Log
Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
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

Nombre va de 0 à 1 000 000 000 dans cette boucle

encore une idée : à toi de voir

GRENIER Alain[8D]
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
1
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)

@+
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
le Currency c'est long

Long       +++
Integer    ++
Byte        +
         Single      -
         Double    --
         Currency ---

Daniel
Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
Salut Violent_Ken

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.....

a toi de voir

GRENIER Alain[8D]
Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
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)

GRENIER Alain[8D]
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Je vais peut-être dire une connerie, mais le Type Decimal ne pourrait-il pas servir ?

MPi
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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


qui renvoit : 0  20001  40002  60003  80004  100005  120006  140007  160008  180009

Amicalement,
Us.
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
c'est pas 20000 qu'il faut rajouter puisuqe i est déjà incrémenter de 1
For i = 0 To 200000
      Debug.Print i
      i = i + 19999 'remplace le Step 20000
      Next

mais ça fait la même chose, ça va toujours jusqu'à 420000
alors que For i = 1 To 200000 est normal
ainsi que For i = 0 To 199999

Daniel
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Oupsss... j'ai rien dit... J'suis fatigué ce soir... J'arrête là avant de dire une autre ânerie... Désolé.


Us.


 
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
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.

Daniel
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
49
à noter que i est ré-évaluer à chaque boucle (cause de l'incrémentation?)
çà peut aussi venir de là...

le fait est : currency ~signé~, msdn muette
signé ou pas, ne pose de problème qu'avec la boucle for

VB nous réserve encore pas mal de surprises
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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...

Amicalement,
Us.